From 5ef5c85b1983617f64bce1410aeb9fd57859c04d Mon Sep 17 00:00:00 2001 From: Brett Delle Grazie Date: Mon, 4 Aug 2025 17:36:04 +0200 Subject: [PATCH 001/255] fix(parser): cognito schema `preferredRole` may be null (#4259) --- packages/parser/src/schemas/cognito.ts | 2 +- .../parser/tests/unit/schema/cognito.test.ts | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/packages/parser/src/schemas/cognito.ts b/packages/parser/src/schemas/cognito.ts index a19ab0db52..e7240cd0e8 100644 --- a/packages/parser/src/schemas/cognito.ts +++ b/packages/parser/src/schemas/cognito.ts @@ -192,7 +192,7 @@ const PostAuthenticationTriggerSchema = CognitoTriggerBaseSchema.extend({ const PreTokenGenerationTriggerGroupConfigurationSchema = z.object({ groupsToOverride: z.array(z.string()), iamRolesToOverride: z.array(z.string()), - preferredRole: z.string().optional(), + preferredRole: z.string().nullable(), }); /** diff --git a/packages/parser/tests/unit/schema/cognito.test.ts b/packages/parser/tests/unit/schema/cognito.test.ts index 050b8aa233..d95a4156a9 100644 --- a/packages/parser/tests/unit/schema/cognito.test.ts +++ b/packages/parser/tests/unit/schema/cognito.test.ts @@ -396,6 +396,29 @@ describe('Schemas: Cognito User Pool', () => { expect(result).toEqual(event); }); + it('parses a valid pre-token generation event v1 with null preferredRole', () => { + // Prepare + const event = structuredClone(baseEvent); + event.request = { + userAttributes: { + sub: '42051434-5091-70ec-4b71-7c26db407ea4', + 'cognito:user_status': 'CONFIRMED', + }, + groupConfiguration: { + groupsToOverride: ['group1', 'group2'], + iamRolesToOverride: ['role1', 'role2'], + preferredRole: null, + }, + clientMetadata: { key: 'value' }, + }; + + // Act + const result = PreTokenGenerationTriggerSchemaV1.parse(event); + + // Assess + expect(result).toEqual(event); + }); + it('throws if the pre-token generation event v1 is missing a required field', () => { // Prepare const event = structuredClone(baseEvent); From 081a514b6e1cb81513080352e5dbcadc89ac0574 Mon Sep 17 00:00:00 2001 From: David <75678655+dwrth@users.noreply.github.com> Date: Tue, 5 Aug 2025 11:34:57 +0200 Subject: [PATCH 002/255] refactor(tracer): fix code quality issues (#4264) Co-authored-by: David <75678655+David-Werth@users.noreply.github.com> --- packages/tracer/src/Tracer.ts | 3 +-- packages/tracer/tests/unit/Tracer.test.ts | 32 +++++++---------------- 2 files changed, 10 insertions(+), 25 deletions(-) diff --git a/packages/tracer/src/Tracer.ts b/packages/tracer/src/Tracer.ts index 590bb2de95..77de9f9214 100644 --- a/packages/tracer/src/Tracer.ts +++ b/packages/tracer/src/Tracer.ts @@ -822,7 +822,6 @@ class Tracer extends Utility implements TracerInterface { if (this.#envConfig.captureHTTPsRequests.toLowerCase() === 'false') { this.captureHTTPsRequests = false; - return; } } @@ -868,7 +867,7 @@ class Tracer extends Utility implements TracerInterface { * * @param options - Configuration passed to the tracer */ - private setOptions(options: TracerOptions): Tracer { + private setOptions(options: TracerOptions): this { const { enabled, serviceName, captureHTTPsRequests, customConfigService } = options; diff --git a/packages/tracer/tests/unit/Tracer.test.ts b/packages/tracer/tests/unit/Tracer.test.ts index 042cead86c..a59a125a9c 100644 --- a/packages/tracer/tests/unit/Tracer.test.ts +++ b/packages/tracer/tests/unit/Tracer.test.ts @@ -692,9 +692,7 @@ describe('Class: Tracer', () => { .mockImplementation(() => ({})); // Act - const newSubsegment: Segment | Subsegment | undefined = new Subsegment( - '## foo.bar' - ); + const newSubsegment = new Subsegment('## foo.bar'); tracer.setSegment(newSubsegment); // Assess @@ -961,9 +959,7 @@ describe('Class: Tracer', () => { it('awaits async methods correctly', async () => { // Prepare const tracer: Tracer = new Tracer(); - const newSubsegment: Segment | Subsegment | undefined = new Subsegment( - '### dummyMethod' - ); + const newSubsegment = new Subsegment('### dummyMethod'); vi.spyOn(tracer.provider, 'getSegment').mockImplementation( () => newSubsegment @@ -975,7 +971,7 @@ describe('Class: Tracer', () => { createCaptureAsyncFuncMock(tracer.provider, newSubsegment); class Lambda implements LambdaInterface { - private memberVariable: string; + private readonly memberVariable: string; public constructor(memberVariable: string) { this.memberVariable = memberVariable; @@ -1021,8 +1017,7 @@ describe('Class: Tracer', () => { it('catches the error and logs a warning when a segment fails to close/serialize', async () => { // Prepare const tracer: Tracer = new Tracer(); - const handlerSubsegment: Segment | Subsegment | undefined = - new Subsegment('### dummyMethod'); + const handlerSubsegment = new Subsegment('### dummyMethod'); vi.spyOn(tracer.provider, 'getSegment').mockImplementation( () => handlerSubsegment ); @@ -1192,9 +1187,7 @@ describe('Class: Tracer', () => { it('captures the exception correctly', async () => { // Prepare const tracer: Tracer = new Tracer(); - const newSubsegment: Segment | Subsegment | undefined = new Subsegment( - '### dummyMethod' - ); + const newSubsegment = new Subsegment('### dummyMethod'); vi.spyOn(tracer.provider, 'getSegment').mockImplementation( () => newSubsegment ); @@ -1237,9 +1230,7 @@ describe('Class: Tracer', () => { it('preserves the this scope correctly when used as decorator', async () => { // Prepare const tracer: Tracer = new Tracer(); - const newSubsegment: Segment | Subsegment | undefined = new Subsegment( - '### dummyMethod' - ); + const newSubsegment = new Subsegment('### dummyMethod'); vi.spyOn(tracer.provider, 'getSegment').mockImplementation( () => newSubsegment ); @@ -1274,9 +1265,7 @@ describe('Class: Tracer', () => { it('awaits the async method correctly when used as decorator', async () => { // Prepare const tracer: Tracer = new Tracer(); - const newSubsegment: Segment | Subsegment | undefined = new Subsegment( - '### dummyMethod' - ); + const newSubsegment = new Subsegment('### dummyMethod'); vi.spyOn(tracer.provider, 'getSegment').mockImplementation( () => newSubsegment @@ -1375,9 +1364,7 @@ describe('Class: Tracer', () => { it('sets the correct name for the subsegment when used as decorator and with a custom subSegmentName', async () => { // Prepare const tracer: Tracer = new Tracer(); - const newSubsegment: Segment | Subsegment | undefined = new Subsegment( - '### dummyMethod' - ); + const newSubsegment = new Subsegment('### dummyMethod'); vi.spyOn(newSubsegment, 'flush').mockImplementation(() => null); vi.spyOn(tracer.provider, 'getSegment').mockImplementation( () => newSubsegment @@ -1412,8 +1399,7 @@ describe('Class: Tracer', () => { it('catches the error and logs a warning when a segment fails to close/serialize', async () => { // Prepare const tracer: Tracer = new Tracer(); - const handlerSubsegment: Segment | Subsegment | undefined = - new Subsegment('### dummyMethod'); + const handlerSubsegment = new Subsegment('### dummyMethod'); vi.spyOn(tracer.provider, 'getSegment').mockImplementation( () => handlerSubsegment ); From dab0be1b5be166f972dcd2152968999dc212a0a7 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Tue, 5 Aug 2025 13:15:23 +0200 Subject: [PATCH 003/255] refactor(kafka): improve tests & error handling (#4262) --- packages/kafka/src/deserializer/protobuf.ts | 4 ++-- packages/kafka/tests/unit/consumer.test.ts | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/kafka/src/deserializer/protobuf.ts b/packages/kafka/src/deserializer/protobuf.ts index 46a7b4f8b4..14b0f58120 100644 --- a/packages/kafka/src/deserializer/protobuf.ts +++ b/packages/kafka/src/deserializer/protobuf.ts @@ -40,7 +40,7 @@ const deserialize = ( } } catch (error) { throw new KafkaConsumerDeserializationError( - `Failed to deserialize Protobuf message: ${error}, message: ${data}, messageType: ${messageType}` + `Failed to deserialize Protobuf message: ${error}, message: ${data}, messageType: ${JSON.stringify(messageType)}` ); } @@ -64,7 +64,7 @@ const deserialize = ( return decoded; } catch { throw new KafkaConsumerDeserializationError( - `Failed to deserialize Protobuf message: ${error}, message: ${data}, messageType: ${messageType}` + `Failed to deserialize Protobuf message: ${error}, message: ${data}, messageType: ${JSON.stringify(messageType)}` ); } } diff --git a/packages/kafka/tests/unit/consumer.test.ts b/packages/kafka/tests/unit/consumer.test.ts index ebad6e6493..086a1a090d 100644 --- a/packages/kafka/tests/unit/consumer.test.ts +++ b/packages/kafka/tests/unit/consumer.test.ts @@ -141,13 +141,15 @@ describe('Kafka consumer', () => { // Prepare const handler = kafkaConsumer( async (event) => { + const results = []; for (const record of event.records) { try { - return record.value; + results.push(record.value); } catch (error) { return error; } } + return results; }, { // @ts-expect-error - testing missing schemaStr @@ -241,14 +243,16 @@ describe('Kafka consumer', () => { // Prepare const handler = kafkaConsumer( async (event) => { + const results = []; for (const record of event.records) { try { const { value, key } = record; - return [value, key]; + results.push([value, key]); } catch (error) { return error; } } + return results; }, { value: { From b1d68bdf4899c18f9e93e10b15a39b7097591638 Mon Sep 17 00:00:00 2001 From: Stefano Vozza Date: Tue, 5 Aug 2025 15:06:25 +0100 Subject: [PATCH 004/255] chore(deps): update typedoc to v0.28.9 (#4267) --- package-lock.json | 65 ++++++++++++++++++++++++++--------------------- package.json | 2 +- 2 files changed, 37 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index a397270411..6bf233ecf7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "markdownlint-cli2": "^0.18.1", "middy5": "npm:@middy/core@^5.4.3", "middy6": "npm:@middy/core@^6.0.0", - "typedoc": "^0.28.8", + "typedoc": "^0.28.9", "typedoc-plugin-missing-exports": "^4.0.0", "typescript": "^5.8.3", "vitest": "^3.0.9" @@ -11689,15 +11689,16 @@ } }, "node_modules/@gerrit0/mini-shiki": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.7.0.tgz", - "integrity": "sha512-7iY9wg4FWXmeoFJpUL2u+tsmh0d0jcEJHAIzVxl3TG4KL493JNnisdLAILZ77zcD+z3J0keEXZ+lFzUgzQzPDg==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.9.2.tgz", + "integrity": "sha512-Tvsj+AOO4Z8xLRJK900WkyfxHsZQu+Zm1//oT1w443PO6RiYMoq/4NGOhaNuZoUMYsjKIAPVQ6eOFMddj6yphQ==", "dev": true, + "license": "MIT", "dependencies": { - "@shikijs/engine-oniguruma": "^3.7.0", - "@shikijs/langs": "^3.7.0", - "@shikijs/themes": "^3.7.0", - "@shikijs/types": "^3.7.0", + "@shikijs/engine-oniguruma": "^3.9.2", + "@shikijs/langs": "^3.9.2", + "@shikijs/themes": "^3.9.2", + "@shikijs/types": "^3.9.2", "@shikijs/vscode-textmate": "^10.0.2" } }, @@ -12293,38 +12294,42 @@ ] }, "node_modules/@shikijs/engine-oniguruma": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.7.0.tgz", - "integrity": "sha512-5BxcD6LjVWsGu4xyaBC5bu8LdNgPCVBnAkWTtOCs/CZxcB22L8rcoWfv7Hh/3WooVjBZmFtyxhgvkQFedPGnFw==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.9.2.tgz", + "integrity": "sha512-Vn/w5oyQ6TUgTVDIC/BrpXwIlfK6V6kGWDVVz2eRkF2v13YoENUvaNwxMsQU/t6oCuZKzqp9vqtEtEzKl9VegA==", "dev": true, + "license": "MIT", "dependencies": { - "@shikijs/types": "3.7.0", + "@shikijs/types": "3.9.2", "@shikijs/vscode-textmate": "^10.0.2" } }, "node_modules/@shikijs/langs": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.7.0.tgz", - "integrity": "sha512-1zYtdfXLr9xDKLTGy5kb7O0zDQsxXiIsw1iIBcNOO8Yi5/Y1qDbJ+0VsFoqTlzdmneO8Ij35g7QKF8kcLyznCQ==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.9.2.tgz", + "integrity": "sha512-X1Q6wRRQXY7HqAuX3I8WjMscjeGjqXCg/Sve7J2GWFORXkSrXud23UECqTBIdCSNKJioFtmUGJQNKtlMMZMn0w==", "dev": true, + "license": "MIT", "dependencies": { - "@shikijs/types": "3.7.0" + "@shikijs/types": "3.9.2" } }, "node_modules/@shikijs/themes": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.7.0.tgz", - "integrity": "sha512-VJx8497iZPy5zLiiCTSIaOChIcKQwR0FebwE9S3rcN0+J/GTWwQ1v/bqhTbpbY3zybPKeO8wdammqkpXc4NVjQ==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.9.2.tgz", + "integrity": "sha512-6z5lBPBMRfLyyEsgf6uJDHPa6NAGVzFJqH4EAZ+03+7sedYir2yJBRu2uPZOKmj43GyhVHWHvyduLDAwJQfDjA==", "dev": true, + "license": "MIT", "dependencies": { - "@shikijs/types": "3.7.0" + "@shikijs/types": "3.9.2" } }, "node_modules/@shikijs/types": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.7.0.tgz", - "integrity": "sha512-MGaLeaRlSWpnP0XSAum3kP3a8vtcTsITqoEPYdt3lQG3YCdQH4DnEhodkYcNMcU0uW0RffhoD1O3e0vG5eSBBg==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.9.2.tgz", + "integrity": "sha512-/M5L0Uc2ljyn2jKvj4Yiah7ow/W+DJSglVafvWAJ/b8AZDeeRAdMu3c2riDzB7N42VD+jSnWxeP9AKtd4TfYVw==", "dev": true, + "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" @@ -12334,7 +12339,8 @@ "version": "10.0.2", "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@sindresorhus/merge-streams": { "version": "2.3.0", @@ -13180,6 +13186,7 @@ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/unist": "*" } @@ -18358,13 +18365,13 @@ } }, "node_modules/typedoc": { - "version": "0.28.8", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.8.tgz", - "integrity": "sha512-16GfLopc8icHfdvqZDqdGBoS2AieIRP2rpf9mU+MgN+gGLyEQvAO0QgOa6NJ5QNmQi0LFrDY9in4F2fUNKgJKA==", + "version": "0.28.9", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.9.tgz", + "integrity": "sha512-aw45vwtwOl3QkUAmWCnLV9QW1xY+FSX2zzlit4MAfE99wX+Jij4ycnpbAWgBXsRrxmfs9LaYktg/eX5Bpthd3g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@gerrit0/mini-shiki": "^3.7.0", + "@gerrit0/mini-shiki": "^3.9.0", "lunr": "^2.3.9", "markdown-it": "^14.1.0", "minimatch": "^9.0.5", @@ -18378,7 +18385,7 @@ "pnpm": ">= 10" }, "peerDependencies": { - "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x" + "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x" } }, "node_modules/typedoc-plugin-missing-exports": { diff --git a/package.json b/package.json index afce02abea..52b8bcec61 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "markdownlint-cli2": "^0.18.1", "middy5": "npm:@middy/core@^5.4.3", "middy6": "npm:@middy/core@^6.0.0", - "typedoc": "^0.28.8", + "typedoc": "^0.28.9", "typedoc-plugin-missing-exports": "^4.0.0", "typescript": "^5.8.3", "vitest": "^3.0.9" From c21dec5993c2359bf5a47763466b63b4b81143cf Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Tue, 5 Aug 2025 16:25:14 +0200 Subject: [PATCH 005/255] test(event-handler): coverage 100% for AppSync GraphQL (#4261) --- .../appsync-graphql/RouteHandlerRegistry.ts | 8 +- .../src/appsync-graphql/Router.ts | 24 ++--- .../AppSyncGraphQLResolver.test.ts | 90 ++++++++++++++++--- .../RouteHandlerRegistry.test.ts | 8 +- vitest.config.ts | 5 ++ vitest.workspace.ts | 5 -- 6 files changed, 109 insertions(+), 31 deletions(-) delete mode 100644 vitest.workspace.ts diff --git a/packages/event-handler/src/appsync-graphql/RouteHandlerRegistry.ts b/packages/event-handler/src/appsync-graphql/RouteHandlerRegistry.ts index a33f7a62bf..ac6c2ff2aa 100644 --- a/packages/event-handler/src/appsync-graphql/RouteHandlerRegistry.ts +++ b/packages/event-handler/src/appsync-graphql/RouteHandlerRegistry.ts @@ -40,7 +40,13 @@ class RouteHandlerRegistry { public register( options: RouteHandlerOptions, boolean, boolean> ): void { - const { fieldName, handler, typeName, throwOnError, aggregate } = options; + const { + fieldName, + handler, + typeName, + throwOnError = false, + aggregate = true, + } = options; this.#logger.debug(`Adding resolver for field ${typeName}.${fieldName}`); const cacheKey = this.#makeKey(typeName, fieldName); if (this.resolvers.has(cacheKey)) { diff --git a/packages/event-handler/src/appsync-graphql/Router.ts b/packages/event-handler/src/appsync-graphql/Router.ts index ce70618726..57a243650b 100644 --- a/packages/event-handler/src/appsync-graphql/Router.ts +++ b/packages/event-handler/src/appsync-graphql/Router.ts @@ -531,8 +531,8 @@ class Router { fieldName, handler: handler as BatchResolverHandler, typeName, - aggregate: batchResolverOptions?.aggregate ?? true, - throwOnError: batchResolverOptions?.throwOnError ?? false, + aggregate: batchResolverOptions?.aggregate, + throwOnError: batchResolverOptions?.throwOnError, }); return; } @@ -544,8 +544,8 @@ class Router { fieldName, handler: descriptor?.value, typeName, - aggregate: batchResolverOptions?.aggregate ?? true, - throwOnError: batchResolverOptions?.throwOnError ?? false, + aggregate: batchResolverOptions?.aggregate, + throwOnError: batchResolverOptions?.throwOnError, }); return descriptor; }; @@ -730,8 +730,8 @@ class Router { fieldName, handler: handlerOrOptions as BatchResolverHandler, typeName: 'Query', - aggregate: options?.aggregate ?? true, - throwOnError: options?.throwOnError ?? false, + aggregate: options?.aggregate, + throwOnError: options?.throwOnError, }); return; @@ -742,8 +742,8 @@ class Router { fieldName, handler: descriptor?.value, typeName: 'Query', - aggregate: handlerOrOptions?.aggregate ?? true, - throwOnError: handlerOrOptions?.throwOnError ?? false, + aggregate: handlerOrOptions?.aggregate, + throwOnError: handlerOrOptions?.throwOnError, }); return descriptor; @@ -927,8 +927,8 @@ class Router { fieldName, handler: handlerOrOptions as BatchResolverHandler, typeName: 'Mutation', - aggregate: options?.aggregate ?? true, - throwOnError: options?.throwOnError ?? false, + aggregate: options?.aggregate, + throwOnError: options?.throwOnError, }); return; @@ -939,8 +939,8 @@ class Router { fieldName, handler: descriptor?.value, typeName: 'Mutation', - aggregate: handlerOrOptions?.aggregate ?? true, - throwOnError: handlerOrOptions?.throwOnError ?? false, + aggregate: handlerOrOptions?.aggregate, + throwOnError: handlerOrOptions?.throwOnError, }); return descriptor; diff --git a/packages/event-handler/tests/unit/appsync-graphql/AppSyncGraphQLResolver.test.ts b/packages/event-handler/tests/unit/appsync-graphql/AppSyncGraphQLResolver.test.ts index 27bc862e00..95cbcc25f8 100644 --- a/packages/event-handler/tests/unit/appsync-graphql/AppSyncGraphQLResolver.test.ts +++ b/packages/event-handler/tests/unit/appsync-graphql/AppSyncGraphQLResolver.test.ts @@ -506,15 +506,11 @@ describe('Class: AppSyncGraphQLResolver', () => { setupHandler(handler); if (aggregate) { - app.batchResolver(handler, { - fieldName: 'batchGet', - typeName: 'Query', + app.onBatchQuery('batchGet', handler, { aggregate: true, }); } else { - app.batchResolver(handler, { - fieldName: 'batchGet', - typeName: 'Query', + app.onBatchQuery('batchGet', handler, { aggregate: false, throwOnError: true, }); @@ -596,16 +592,14 @@ describe('Class: AppSyncGraphQLResolver', () => { .mockResolvedValueOnce({ id: '1', value: 'A' }) .mockRejectedValueOnce(new Error('fail')) .mockResolvedValueOnce({ id: '3', value: 'C' }); - app.batchResolver(handler, { - fieldName: 'batchGet', - typeName: 'Query', + app.onBatchMutation('batchPut', handler, { aggregate: false, throwOnError: true, }); const events = [ - onGraphqlEventFactory('batchGet', 'Query', { id: '1' }), - onGraphqlEventFactory('batchGet', 'Query', { id: '2' }), - onGraphqlEventFactory('batchGet', 'Query', { id: '3' }), + onGraphqlEventFactory('batchPut', 'Mutation', { id: '1' }), + onGraphqlEventFactory('batchPut', 'Mutation', { id: '2' }), + onGraphqlEventFactory('batchPut', 'Mutation', { id: '3' }), ]; // Act @@ -640,4 +634,76 @@ describe('Class: AppSyncGraphQLResolver', () => { ) ); }); + + it.each([ + { + throwOnError: true, + description: 'throwOnError=true', + }, + { + throwOnError: false, + description: 'throwOnError=false', + }, + ])( + 'preserves the scope when using `onBatchQuery` & `onBatchMutation` decorators when aggregate=false and $description', + async ({ throwOnError }) => { + // Prepare + const app = new AppSyncGraphQLResolver({ logger: console }); + + class Lambda { + public readonly scope = 'scoped'; + + @app.onBatchQuery('batchGet', { + throwOnError, + }) + public async handleBatchGet( + events: AppSyncResolverEvent<{ id: number }>[] + ) { + const ids = events.map((event) => event.arguments.id); + return ids.map((id) => ({ + id, + scope: this.scope, + })); + } + + @app.onBatchMutation('batchPut', { + throwOnError, + }) + public async handleBatchPut( + _events: AppSyncResolverEvent<{ id: number }>[] + ) { + return [this.scope, this.scope]; + } + + public async handler(event: unknown, context: Context) { + return app.resolve(event, context, { scope: this }); + } + } + const lambda = new Lambda(); + const handler = lambda.handler.bind(lambda); + + // Act + const resultQuery = await handler( + [ + onGraphqlEventFactory('batchGet', 'Query', { id: 1 }), + onGraphqlEventFactory('batchGet', 'Query', { id: 2 }), + ], + context + ); + const resultMutation = await handler( + [ + onGraphqlEventFactory('batchPut', 'Mutation', { id: 1 }), + onGraphqlEventFactory('batchPut', 'Mutation', { id: 2 }), + ], + context + ); + + // Assess + expect(resultQuery).toEqual([ + { id: 1, scope: 'scoped' }, + { id: 2, scope: 'scoped' }, + ]); + expect(resultMutation).toEqual(['scoped', 'scoped']); + } + ); }); diff --git a/packages/event-handler/tests/unit/appsync-graphql/RouteHandlerRegistry.test.ts b/packages/event-handler/tests/unit/appsync-graphql/RouteHandlerRegistry.test.ts index 4de557fd63..6b4d46be64 100644 --- a/packages/event-handler/tests/unit/appsync-graphql/RouteHandlerRegistry.test.ts +++ b/packages/event-handler/tests/unit/appsync-graphql/RouteHandlerRegistry.test.ts @@ -59,8 +59,10 @@ describe('Class: RouteHandlerRegistry', () => { // Assess expect(registry.resolvers.size).toBe(1); expect(registry.resolvers.get('Query.getPost')).toEqual({ + aggregate: true, fieldName: 'getPost', typeName: 'Query', + throwOnError: false, handler: otherHandler, }); expect(console.warn).toHaveBeenCalledWith( @@ -68,7 +70,7 @@ describe('Class: RouteHandlerRegistry', () => { ); }); - it('will not replace the resolver if the event type is different', () => { + it("doesn't replace the resolver if the event type is different", () => { // Prepare const registry = getRegistry(); const originalHandler = vi.fn(); @@ -89,13 +91,17 @@ describe('Class: RouteHandlerRegistry', () => { // Assess expect(registry.resolvers.size).toBe(2); expect(registry.resolvers.get('Query.getPost')).toEqual({ + aggregate: true, fieldName: 'getPost', typeName: 'Query', + throwOnError: false, handler: originalHandler, }); expect(registry.resolvers.get('Mutation.getPost')).toEqual({ + aggregate: true, fieldName: 'getPost', typeName: 'Mutation', + throwOnError: false, handler: otherHandler, }); }); diff --git a/vitest.config.ts b/vitest.config.ts index 78c6de7f3e..9045095d92 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -19,6 +19,11 @@ export default defineConfig({ 'packages/testing/**', ], }, + projects: [ + 'packages/*/vitest.config.ts', + 'examples/app/vitest.config.ts', + 'layers/vitest.config.ts', + ], setupFiles: ['./packages/testing/src/setupEnv.ts'], hookTimeout: 1_000 * 60 * 10, // 10 minutes testTimeout: 1_000 * 60 * 3, // 3 minutes diff --git a/vitest.workspace.ts b/vitest.workspace.ts deleted file mode 100644 index c13e16bdf4..0000000000 --- a/vitest.workspace.ts +++ /dev/null @@ -1,5 +0,0 @@ -export default [ - 'packages/*/vitest.config.ts', - 'examples/app/vitest.config.ts', - 'layers/vitest.config.ts', -]; From 20cf18d3827c9732443055c865238d2e158a6b7e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Aug 2025 16:20:12 +0100 Subject: [PATCH 006/255] chore(deps): bump the typescript group across 1 directory with 2 updates (#4268) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- examples/app/package.json | 4 ++-- package-lock.json | 12 ++++++------ package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 000990b843..0c62ee1181 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -34,7 +34,7 @@ "constructs": "^10.4.2", "source-map-support": "^0.5.21", "tsx": "^4.20.3", - "typescript": "^5.8.3", + "typescript": "^5.9.2", "vitest": "^3.0.5" }, "dependencies": { @@ -52,6 +52,6 @@ "aws-cdk": "^2.1023.0", "constructs": "^10.4.2", "esbuild": "^0.25.8", - "typescript": "^5.8.3" + "typescript": "^5.9.2" } } diff --git a/package-lock.json b/package-lock.json index 6bf233ecf7..3b7795ce81 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "middy6": "npm:@middy/core@^6.0.0", "typedoc": "^0.28.9", "typedoc-plugin-missing-exports": "^4.0.0", - "typescript": "^5.8.3", + "typescript": "^5.9.2", "vitest": "^3.0.9" }, "engines": { @@ -64,7 +64,7 @@ "aws-cdk": "^2.1023.0", "constructs": "^10.4.2", "esbuild": "^0.25.8", - "typescript": "^5.8.3" + "typescript": "^5.9.2" }, "devDependencies": { "@types/aws-lambda": "^8.10.152", @@ -73,7 +73,7 @@ "constructs": "^10.4.2", "source-map-support": "^0.5.21", "tsx": "^4.20.3", - "typescript": "^5.8.3", + "typescript": "^5.9.2", "vitest": "^3.0.5" } }, @@ -18414,9 +18414,9 @@ } }, "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "devOptional": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index 52b8bcec61..da74d9b092 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "middy6": "npm:@middy/core@^6.0.0", "typedoc": "^0.28.9", "typedoc-plugin-missing-exports": "^4.0.0", - "typescript": "^5.8.3", + "typescript": "^5.9.2", "vitest": "^3.0.9" }, "lint-staged": { From 1a86ef65faaf4706153771ecb23adee2daff0bef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Aug 2025 17:50:07 +0100 Subject: [PATCH 007/255] chore(deps): bump the aws-sdk-v3 group across 1 directory with 10 updates (#4270) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- examples/app/package.json | 4 +- examples/snippets/package.json | 10 +- package-lock.json | 345 +++++++++++++++--------------- packages/idempotency/package.json | 4 +- packages/metrics/package.json | 2 +- packages/parameters/package.json | 10 +- packages/testing/package.json | 4 +- packages/tracer/package.json | 4 +- 8 files changed, 191 insertions(+), 192 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 0c62ee1181..a4fd1be993 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -44,8 +44,8 @@ "@aws-lambda-powertools/metrics": "^2.24.1", "@aws-lambda-powertools/parameters": "^2.24.1", "@aws-lambda-powertools/tracer": "^2.24.1", - "@aws-sdk/client-ssm": "^3.858.0", - "@aws-sdk/lib-dynamodb": "^3.858.0", + "@aws-sdk/client-ssm": "^3.859.0", + "@aws-sdk/lib-dynamodb": "^3.859.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", "@types/node": "24.1.0", diff --git a/examples/snippets/package.json b/examples/snippets/package.json index b928f867c9..292e59583b 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -33,11 +33,11 @@ "@aws-lambda-powertools/parameters": "^2.24.1", "@aws-lambda-powertools/parser": "^2.24.1", "@aws-lambda-powertools/tracer": "^2.24.1", - "@aws-sdk/client-appconfigdata": "^3.858.0", - "@aws-sdk/client-dynamodb": "^3.858.0", - "@aws-sdk/client-secrets-manager": "^3.858.0", - "@aws-sdk/client-ssm": "^3.858.0", - "@aws-sdk/util-dynamodb": "^3.858.0", + "@aws-sdk/client-appconfigdata": "^3.859.0", + "@aws-sdk/client-dynamodb": "^3.859.0", + "@aws-sdk/client-secrets-manager": "^3.859.0", + "@aws-sdk/client-ssm": "^3.859.0", + "@aws-sdk/util-dynamodb": "^3.859.0", "@middy/core": "^4.7.0", "@redis/client": "^5.7.0", "@valkey/valkey-glide": "^2.0.1", diff --git a/package-lock.json b/package-lock.json index 3b7795ce81..31f7d3e16f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,8 +56,8 @@ "@aws-lambda-powertools/metrics": "^2.24.1", "@aws-lambda-powertools/parameters": "^2.24.1", "@aws-lambda-powertools/tracer": "^2.24.1", - "@aws-sdk/client-ssm": "^3.858.0", - "@aws-sdk/lib-dynamodb": "^3.858.0", + "@aws-sdk/client-ssm": "^3.859.0", + "@aws-sdk/lib-dynamodb": "^3.859.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", "@types/node": "24.1.0", @@ -95,11 +95,11 @@ "@aws-lambda-powertools/parameters": "^2.24.1", "@aws-lambda-powertools/parser": "^2.24.1", "@aws-lambda-powertools/tracer": "^2.24.1", - "@aws-sdk/client-appconfigdata": "^3.858.0", - "@aws-sdk/client-dynamodb": "^3.858.0", - "@aws-sdk/client-secrets-manager": "^3.858.0", - "@aws-sdk/client-ssm": "^3.858.0", - "@aws-sdk/util-dynamodb": "^3.858.0", + "@aws-sdk/client-appconfigdata": "^3.859.0", + "@aws-sdk/client-dynamodb": "^3.859.0", + "@aws-sdk/client-secrets-manager": "^3.859.0", + "@aws-sdk/client-ssm": "^3.859.0", + "@aws-sdk/util-dynamodb": "^3.859.0", "@middy/core": "^4.7.0", "@redis/client": "^5.7.0", "@valkey/valkey-glide": "^2.0.1", @@ -907,16 +907,16 @@ "link": true }, "node_modules/@aws-sdk/client-appconfigdata": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.858.0.tgz", - "integrity": "sha512-MV+oUPmsLdrRiLRp+ftlNQvxPjkanp2/Z+ud/oTETHwFxYAiUp/oddA9GVAbey4zD9uQy2T92ji82RVg/FjZtQ==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.859.0.tgz", + "integrity": "sha512-aTvAi3R24UmJCvDkd12tFgmBB3CPAcEc0Tgh997+/3fBRlnDO3/GAmplCoW97ECqaXfi3eq4kj1B3RyDso5dZg==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.858.0", - "@aws-sdk/credential-provider-node": "3.858.0", + "@aws-sdk/credential-provider-node": "3.859.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", "@aws-sdk/middleware-recursion-detection": "3.840.0", @@ -1075,9 +1075,9 @@ } }, "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.858.0.tgz", - "integrity": "sha512-2ZoVJW2Gg4LjpyZPvzOV+EOJgjuaVN/+mvAxAU6JU5OJJUzqNuW1Mi7VXFdZHcF6weXoKHfzYZVR0uuVapu1lQ==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.859.0.tgz", + "integrity": "sha512-KsccE1T88ZDNhsABnqbQj014n5JMDilAroUErFbGqu5/B3sXqUsYmG54C/BjvGTRUFfzyttK9lB9P9h6ddQ8Cw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1085,7 +1085,7 @@ "@aws-sdk/credential-provider-env": "3.858.0", "@aws-sdk/credential-provider-http": "3.858.0", "@aws-sdk/credential-provider-process": "3.858.0", - "@aws-sdk/credential-provider-sso": "3.858.0", + "@aws-sdk/credential-provider-sso": "3.859.0", "@aws-sdk/credential-provider-web-identity": "3.858.0", "@aws-sdk/nested-clients": "3.858.0", "@aws-sdk/types": "3.840.0", @@ -1100,17 +1100,17 @@ } }, "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.858.0.tgz", - "integrity": "sha512-clHADxFnMH3R3+7E1bKWEWgoHmLMep2VlmUFDYV4Hw17JR563RRQpzlF2QRCTjSNUjH48dd6AVxEDfh7461X6Q==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.859.0.tgz", + "integrity": "sha512-ZRDB2xU5aSyTR/jDcli30tlycu6RFvQngkZhBs9Zoh2BiYXrfh2MMuoYuZk+7uD6D53Q2RIEldDHR9A/TPlRuA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.858.0", "@aws-sdk/credential-provider-http": "3.858.0", - "@aws-sdk/credential-provider-ini": "3.858.0", + "@aws-sdk/credential-provider-ini": "3.859.0", "@aws-sdk/credential-provider-process": "3.858.0", - "@aws-sdk/credential-provider-sso": "3.858.0", + "@aws-sdk/credential-provider-sso": "3.859.0", "@aws-sdk/credential-provider-web-identity": "3.858.0", "@aws-sdk/types": "3.840.0", "@smithy/credential-provider-imds": "^4.0.6", @@ -1142,15 +1142,15 @@ } }, "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.858.0.tgz", - "integrity": "sha512-YPAsEm4dUPCYO5nC/lv6fPhiihm70rh2Zdg/gmjOiD/7TIR+OT622bW+E1qBJ9s+dzOdAmutGSCmVbxp8gTM5Q==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.859.0.tgz", + "integrity": "sha512-BwAqmWIivhox5YlFRjManFF8GoTvEySPk6vsJNxDsmGsabY+OQovYxFIYxRCYiHzH7SFjd4Lcd+riJOiXNsvRw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-sso": "3.858.0", "@aws-sdk/core": "3.858.0", - "@aws-sdk/token-providers": "3.858.0", + "@aws-sdk/token-providers": "3.859.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", @@ -1314,9 +1314,9 @@ } }, "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/token-providers": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.858.0.tgz", - "integrity": "sha512-uQ3cVpqbkaxq3Hd8zip0pcOFsP731g+m0zsobQ7Bmqjq4/PHcehTov8i3W9+7sBHocOM61/qrQksPlW0TPuPAA==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.859.0.tgz", + "integrity": "sha512-6P2wlvm9KBWOvRNn0Pt8RntnXg8fzOb5kEShvWsOsAocZeqKNaYbihum5/Onq1ZPoVtkdb++8eWDocDnM4k85Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2598,16 +2598,16 @@ } }, "node_modules/@aws-sdk/client-cloudwatch": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.858.0.tgz", - "integrity": "sha512-YWeAsDUQ5XnIuHu3S3rHl2ydTShTzGQu4FFIc8IO0/cklpgtsfQ5WO7IyM4tSC+ah7vO5h0xPe+DCmxZRiwDAw==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.859.0.tgz", + "integrity": "sha512-tnUP6qRKG1vEXTkZr1u+T+vqyrSF+pSveK3maaERGvsgABrFEAR6KU0yb93A1sSmYsfHd/O1CVzkQB6zecc44g==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.858.0", - "@aws-sdk/credential-provider-node": "3.858.0", + "@aws-sdk/credential-provider-node": "3.859.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", "@aws-sdk/middleware-recursion-detection": "3.840.0", @@ -3153,9 +3153,9 @@ } }, "node_modules/@aws-sdk/client-cloudwatch/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.858.0.tgz", - "integrity": "sha512-2ZoVJW2Gg4LjpyZPvzOV+EOJgjuaVN/+mvAxAU6JU5OJJUzqNuW1Mi7VXFdZHcF6weXoKHfzYZVR0uuVapu1lQ==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.859.0.tgz", + "integrity": "sha512-KsccE1T88ZDNhsABnqbQj014n5JMDilAroUErFbGqu5/B3sXqUsYmG54C/BjvGTRUFfzyttK9lB9P9h6ddQ8Cw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3163,7 +3163,7 @@ "@aws-sdk/credential-provider-env": "3.858.0", "@aws-sdk/credential-provider-http": "3.858.0", "@aws-sdk/credential-provider-process": "3.858.0", - "@aws-sdk/credential-provider-sso": "3.858.0", + "@aws-sdk/credential-provider-sso": "3.859.0", "@aws-sdk/credential-provider-web-identity": "3.858.0", "@aws-sdk/nested-clients": "3.858.0", "@aws-sdk/types": "3.840.0", @@ -3178,17 +3178,17 @@ } }, "node_modules/@aws-sdk/client-cloudwatch/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.858.0.tgz", - "integrity": "sha512-clHADxFnMH3R3+7E1bKWEWgoHmLMep2VlmUFDYV4Hw17JR563RRQpzlF2QRCTjSNUjH48dd6AVxEDfh7461X6Q==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.859.0.tgz", + "integrity": "sha512-ZRDB2xU5aSyTR/jDcli30tlycu6RFvQngkZhBs9Zoh2BiYXrfh2MMuoYuZk+7uD6D53Q2RIEldDHR9A/TPlRuA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.858.0", "@aws-sdk/credential-provider-http": "3.858.0", - "@aws-sdk/credential-provider-ini": "3.858.0", + "@aws-sdk/credential-provider-ini": "3.859.0", "@aws-sdk/credential-provider-process": "3.858.0", - "@aws-sdk/credential-provider-sso": "3.858.0", + "@aws-sdk/credential-provider-sso": "3.859.0", "@aws-sdk/credential-provider-web-identity": "3.858.0", "@aws-sdk/types": "3.840.0", "@smithy/credential-provider-imds": "^4.0.6", @@ -3220,15 +3220,15 @@ } }, "node_modules/@aws-sdk/client-cloudwatch/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.858.0.tgz", - "integrity": "sha512-YPAsEm4dUPCYO5nC/lv6fPhiihm70rh2Zdg/gmjOiD/7TIR+OT622bW+E1qBJ9s+dzOdAmutGSCmVbxp8gTM5Q==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.859.0.tgz", + "integrity": "sha512-BwAqmWIivhox5YlFRjManFF8GoTvEySPk6vsJNxDsmGsabY+OQovYxFIYxRCYiHzH7SFjd4Lcd+riJOiXNsvRw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-sso": "3.858.0", "@aws-sdk/core": "3.858.0", - "@aws-sdk/token-providers": "3.858.0", + "@aws-sdk/token-providers": "3.859.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", @@ -3392,9 +3392,9 @@ } }, "node_modules/@aws-sdk/client-cloudwatch/node_modules/@aws-sdk/token-providers": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.858.0.tgz", - "integrity": "sha512-uQ3cVpqbkaxq3Hd8zip0pcOFsP731g+m0zsobQ7Bmqjq4/PHcehTov8i3W9+7sBHocOM61/qrQksPlW0TPuPAA==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.859.0.tgz", + "integrity": "sha512-6P2wlvm9KBWOvRNn0Pt8RntnXg8fzOb5kEShvWsOsAocZeqKNaYbihum5/Onq1ZPoVtkdb++8eWDocDnM4k85Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4036,15 +4036,15 @@ } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.858.0.tgz", - "integrity": "sha512-QB9levGfBBR11WbCMEUInpED9W4wLtnU4LKgheul2z+TX59xHk5l7G0hd9+sW9wWyInZ+MDLRNDhGfSlpqw80g==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.859.0.tgz", + "integrity": "sha512-Bt840uICsGcn7IFewif8ARCF0CxtdTx9DX/LfUGRI+SVZcqyeEccmH2JJRRzThtEzKTXr+rCN6yaNB3c4RQY2g==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.858.0", - "@aws-sdk/credential-provider-node": "3.858.0", + "@aws-sdk/credential-provider-node": "3.859.0", "@aws-sdk/middleware-endpoint-discovery": "3.840.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", @@ -4202,16 +4202,16 @@ } }, "node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.858.0.tgz", - "integrity": "sha512-2ZoVJW2Gg4LjpyZPvzOV+EOJgjuaVN/+mvAxAU6JU5OJJUzqNuW1Mi7VXFdZHcF6weXoKHfzYZVR0uuVapu1lQ==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.859.0.tgz", + "integrity": "sha512-KsccE1T88ZDNhsABnqbQj014n5JMDilAroUErFbGqu5/B3sXqUsYmG54C/BjvGTRUFfzyttK9lB9P9h6ddQ8Cw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.858.0", "@aws-sdk/credential-provider-env": "3.858.0", "@aws-sdk/credential-provider-http": "3.858.0", "@aws-sdk/credential-provider-process": "3.858.0", - "@aws-sdk/credential-provider-sso": "3.858.0", + "@aws-sdk/credential-provider-sso": "3.859.0", "@aws-sdk/credential-provider-web-identity": "3.858.0", "@aws-sdk/nested-clients": "3.858.0", "@aws-sdk/types": "3.840.0", @@ -4226,16 +4226,16 @@ } }, "node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.858.0.tgz", - "integrity": "sha512-clHADxFnMH3R3+7E1bKWEWgoHmLMep2VlmUFDYV4Hw17JR563RRQpzlF2QRCTjSNUjH48dd6AVxEDfh7461X6Q==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.859.0.tgz", + "integrity": "sha512-ZRDB2xU5aSyTR/jDcli30tlycu6RFvQngkZhBs9Zoh2BiYXrfh2MMuoYuZk+7uD6D53Q2RIEldDHR9A/TPlRuA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.858.0", "@aws-sdk/credential-provider-http": "3.858.0", - "@aws-sdk/credential-provider-ini": "3.858.0", + "@aws-sdk/credential-provider-ini": "3.859.0", "@aws-sdk/credential-provider-process": "3.858.0", - "@aws-sdk/credential-provider-sso": "3.858.0", + "@aws-sdk/credential-provider-sso": "3.859.0", "@aws-sdk/credential-provider-web-identity": "3.858.0", "@aws-sdk/types": "3.840.0", "@smithy/credential-provider-imds": "^4.0.6", @@ -4266,14 +4266,14 @@ } }, "node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.858.0.tgz", - "integrity": "sha512-YPAsEm4dUPCYO5nC/lv6fPhiihm70rh2Zdg/gmjOiD/7TIR+OT622bW+E1qBJ9s+dzOdAmutGSCmVbxp8gTM5Q==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.859.0.tgz", + "integrity": "sha512-BwAqmWIivhox5YlFRjManFF8GoTvEySPk6vsJNxDsmGsabY+OQovYxFIYxRCYiHzH7SFjd4Lcd+riJOiXNsvRw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-sso": "3.858.0", "@aws-sdk/core": "3.858.0", - "@aws-sdk/token-providers": "3.858.0", + "@aws-sdk/token-providers": "3.859.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", @@ -4430,9 +4430,9 @@ } }, "node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/token-providers": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.858.0.tgz", - "integrity": "sha512-uQ3cVpqbkaxq3Hd8zip0pcOFsP731g+m0zsobQ7Bmqjq4/PHcehTov8i3W9+7sBHocOM61/qrQksPlW0TPuPAA==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.859.0.tgz", + "integrity": "sha512-6P2wlvm9KBWOvRNn0Pt8RntnXg8fzOb5kEShvWsOsAocZeqKNaYbihum5/Onq1ZPoVtkdb++8eWDocDnM4k85Q==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.858.0", @@ -6600,15 +6600,15 @@ } }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.858.0.tgz", - "integrity": "sha512-b8buzwDwUrd13tvhlcThNfP4hw86ymNfrhOO3Mr9VZo4e6a+NtxGodDlcRPUjVmiKmi4ibNER/El5ePLNT/r5g==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.859.0.tgz", + "integrity": "sha512-p9/6TrAESLLajn9ytJs6S6ErXyyEbxlO6v44oPXiDeNRKVQxevkG+brAfHDmh7dZk9EQkmyp5AWqo1dZrpkhdg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.858.0", - "@aws-sdk/credential-provider-node": "3.858.0", + "@aws-sdk/credential-provider-node": "3.859.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", "@aws-sdk/middleware-recursion-detection": "3.840.0", @@ -6767,16 +6767,16 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.858.0.tgz", - "integrity": "sha512-2ZoVJW2Gg4LjpyZPvzOV+EOJgjuaVN/+mvAxAU6JU5OJJUzqNuW1Mi7VXFdZHcF6weXoKHfzYZVR0uuVapu1lQ==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.859.0.tgz", + "integrity": "sha512-KsccE1T88ZDNhsABnqbQj014n5JMDilAroUErFbGqu5/B3sXqUsYmG54C/BjvGTRUFfzyttK9lB9P9h6ddQ8Cw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.858.0", "@aws-sdk/credential-provider-env": "3.858.0", "@aws-sdk/credential-provider-http": "3.858.0", "@aws-sdk/credential-provider-process": "3.858.0", - "@aws-sdk/credential-provider-sso": "3.858.0", + "@aws-sdk/credential-provider-sso": "3.859.0", "@aws-sdk/credential-provider-web-identity": "3.858.0", "@aws-sdk/nested-clients": "3.858.0", "@aws-sdk/types": "3.840.0", @@ -6791,16 +6791,16 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.858.0.tgz", - "integrity": "sha512-clHADxFnMH3R3+7E1bKWEWgoHmLMep2VlmUFDYV4Hw17JR563RRQpzlF2QRCTjSNUjH48dd6AVxEDfh7461X6Q==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.859.0.tgz", + "integrity": "sha512-ZRDB2xU5aSyTR/jDcli30tlycu6RFvQngkZhBs9Zoh2BiYXrfh2MMuoYuZk+7uD6D53Q2RIEldDHR9A/TPlRuA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.858.0", "@aws-sdk/credential-provider-http": "3.858.0", - "@aws-sdk/credential-provider-ini": "3.858.0", + "@aws-sdk/credential-provider-ini": "3.859.0", "@aws-sdk/credential-provider-process": "3.858.0", - "@aws-sdk/credential-provider-sso": "3.858.0", + "@aws-sdk/credential-provider-sso": "3.859.0", "@aws-sdk/credential-provider-web-identity": "3.858.0", "@aws-sdk/types": "3.840.0", "@smithy/credential-provider-imds": "^4.0.6", @@ -6831,14 +6831,14 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.858.0.tgz", - "integrity": "sha512-YPAsEm4dUPCYO5nC/lv6fPhiihm70rh2Zdg/gmjOiD/7TIR+OT622bW+E1qBJ9s+dzOdAmutGSCmVbxp8gTM5Q==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.859.0.tgz", + "integrity": "sha512-BwAqmWIivhox5YlFRjManFF8GoTvEySPk6vsJNxDsmGsabY+OQovYxFIYxRCYiHzH7SFjd4Lcd+riJOiXNsvRw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-sso": "3.858.0", "@aws-sdk/core": "3.858.0", - "@aws-sdk/token-providers": "3.858.0", + "@aws-sdk/token-providers": "3.859.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", @@ -6995,9 +6995,9 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/token-providers": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.858.0.tgz", - "integrity": "sha512-uQ3cVpqbkaxq3Hd8zip0pcOFsP731g+m0zsobQ7Bmqjq4/PHcehTov8i3W9+7sBHocOM61/qrQksPlW0TPuPAA==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.859.0.tgz", + "integrity": "sha512-6P2wlvm9KBWOvRNn0Pt8RntnXg8fzOb5kEShvWsOsAocZeqKNaYbihum5/Onq1ZPoVtkdb++8eWDocDnM4k85Q==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.858.0", @@ -7665,15 +7665,15 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.858.0.tgz", - "integrity": "sha512-0O1FNSh2FKdG7DRTcBlxq+gO1zpSovfGUEF7DG9M1bWcyS30kzwT4ypJC76dlSBVlRA2dQt9bpKtQx5X5diFfQ==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.859.0.tgz", + "integrity": "sha512-I43D40i+/fwNGJiyb0Pd2ZwtP7TkttzKRZh/ujv9F6zzyW/TsYB6DBLxOfRSRi909Cad5yY1JkE8OtsRWTUphg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.858.0", - "@aws-sdk/credential-provider-node": "3.858.0", + "@aws-sdk/credential-provider-node": "3.859.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", "@aws-sdk/middleware-recursion-detection": "3.840.0", @@ -7829,16 +7829,16 @@ } }, "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.858.0.tgz", - "integrity": "sha512-2ZoVJW2Gg4LjpyZPvzOV+EOJgjuaVN/+mvAxAU6JU5OJJUzqNuW1Mi7VXFdZHcF6weXoKHfzYZVR0uuVapu1lQ==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.859.0.tgz", + "integrity": "sha512-KsccE1T88ZDNhsABnqbQj014n5JMDilAroUErFbGqu5/B3sXqUsYmG54C/BjvGTRUFfzyttK9lB9P9h6ddQ8Cw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.858.0", "@aws-sdk/credential-provider-env": "3.858.0", "@aws-sdk/credential-provider-http": "3.858.0", "@aws-sdk/credential-provider-process": "3.858.0", - "@aws-sdk/credential-provider-sso": "3.858.0", + "@aws-sdk/credential-provider-sso": "3.859.0", "@aws-sdk/credential-provider-web-identity": "3.858.0", "@aws-sdk/nested-clients": "3.858.0", "@aws-sdk/types": "3.840.0", @@ -7853,16 +7853,16 @@ } }, "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.858.0.tgz", - "integrity": "sha512-clHADxFnMH3R3+7E1bKWEWgoHmLMep2VlmUFDYV4Hw17JR563RRQpzlF2QRCTjSNUjH48dd6AVxEDfh7461X6Q==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.859.0.tgz", + "integrity": "sha512-ZRDB2xU5aSyTR/jDcli30tlycu6RFvQngkZhBs9Zoh2BiYXrfh2MMuoYuZk+7uD6D53Q2RIEldDHR9A/TPlRuA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.858.0", "@aws-sdk/credential-provider-http": "3.858.0", - "@aws-sdk/credential-provider-ini": "3.858.0", + "@aws-sdk/credential-provider-ini": "3.859.0", "@aws-sdk/credential-provider-process": "3.858.0", - "@aws-sdk/credential-provider-sso": "3.858.0", + "@aws-sdk/credential-provider-sso": "3.859.0", "@aws-sdk/credential-provider-web-identity": "3.858.0", "@aws-sdk/types": "3.840.0", "@smithy/credential-provider-imds": "^4.0.6", @@ -7893,14 +7893,14 @@ } }, "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.858.0.tgz", - "integrity": "sha512-YPAsEm4dUPCYO5nC/lv6fPhiihm70rh2Zdg/gmjOiD/7TIR+OT622bW+E1qBJ9s+dzOdAmutGSCmVbxp8gTM5Q==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.859.0.tgz", + "integrity": "sha512-BwAqmWIivhox5YlFRjManFF8GoTvEySPk6vsJNxDsmGsabY+OQovYxFIYxRCYiHzH7SFjd4Lcd+riJOiXNsvRw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-sso": "3.858.0", "@aws-sdk/core": "3.858.0", - "@aws-sdk/token-providers": "3.858.0", + "@aws-sdk/token-providers": "3.859.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", @@ -8057,9 +8057,9 @@ } }, "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/token-providers": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.858.0.tgz", - "integrity": "sha512-uQ3cVpqbkaxq3Hd8zip0pcOFsP731g+m0zsobQ7Bmqjq4/PHcehTov8i3W9+7sBHocOM61/qrQksPlW0TPuPAA==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.859.0.tgz", + "integrity": "sha512-6P2wlvm9KBWOvRNn0Pt8RntnXg8fzOb5kEShvWsOsAocZeqKNaYbihum5/Onq1ZPoVtkdb++8eWDocDnM4k85Q==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.858.0", @@ -8566,15 +8566,15 @@ } }, "node_modules/@aws-sdk/client-ssm": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.858.0.tgz", - "integrity": "sha512-hsONNE8U63ykyVG5cyRiYLObJa8DsD4G2D56EPuxtj4ghZ5ofdhPd80xLz+thVoWfJ7CPOXrLdvQloK/YUJbhA==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.859.0.tgz", + "integrity": "sha512-YS+K+mT2xlUsFf0Z2v6hFjkqkHf5IlmUGqoaFJh6CXpV7mfXCfxiamyiiDd3JHz7z6DXZ48npGZYKJedgHU3bg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.858.0", - "@aws-sdk/credential-provider-node": "3.858.0", + "@aws-sdk/credential-provider-node": "3.859.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", "@aws-sdk/middleware-recursion-detection": "3.840.0", @@ -8731,16 +8731,16 @@ } }, "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.858.0.tgz", - "integrity": "sha512-2ZoVJW2Gg4LjpyZPvzOV+EOJgjuaVN/+mvAxAU6JU5OJJUzqNuW1Mi7VXFdZHcF6weXoKHfzYZVR0uuVapu1lQ==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.859.0.tgz", + "integrity": "sha512-KsccE1T88ZDNhsABnqbQj014n5JMDilAroUErFbGqu5/B3sXqUsYmG54C/BjvGTRUFfzyttK9lB9P9h6ddQ8Cw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.858.0", "@aws-sdk/credential-provider-env": "3.858.0", "@aws-sdk/credential-provider-http": "3.858.0", "@aws-sdk/credential-provider-process": "3.858.0", - "@aws-sdk/credential-provider-sso": "3.858.0", + "@aws-sdk/credential-provider-sso": "3.859.0", "@aws-sdk/credential-provider-web-identity": "3.858.0", "@aws-sdk/nested-clients": "3.858.0", "@aws-sdk/types": "3.840.0", @@ -8755,16 +8755,16 @@ } }, "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.858.0.tgz", - "integrity": "sha512-clHADxFnMH3R3+7E1bKWEWgoHmLMep2VlmUFDYV4Hw17JR563RRQpzlF2QRCTjSNUjH48dd6AVxEDfh7461X6Q==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.859.0.tgz", + "integrity": "sha512-ZRDB2xU5aSyTR/jDcli30tlycu6RFvQngkZhBs9Zoh2BiYXrfh2MMuoYuZk+7uD6D53Q2RIEldDHR9A/TPlRuA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.858.0", "@aws-sdk/credential-provider-http": "3.858.0", - "@aws-sdk/credential-provider-ini": "3.858.0", + "@aws-sdk/credential-provider-ini": "3.859.0", "@aws-sdk/credential-provider-process": "3.858.0", - "@aws-sdk/credential-provider-sso": "3.858.0", + "@aws-sdk/credential-provider-sso": "3.859.0", "@aws-sdk/credential-provider-web-identity": "3.858.0", "@aws-sdk/types": "3.840.0", "@smithy/credential-provider-imds": "^4.0.6", @@ -8795,14 +8795,14 @@ } }, "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.858.0.tgz", - "integrity": "sha512-YPAsEm4dUPCYO5nC/lv6fPhiihm70rh2Zdg/gmjOiD/7TIR+OT622bW+E1qBJ9s+dzOdAmutGSCmVbxp8gTM5Q==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.859.0.tgz", + "integrity": "sha512-BwAqmWIivhox5YlFRjManFF8GoTvEySPk6vsJNxDsmGsabY+OQovYxFIYxRCYiHzH7SFjd4Lcd+riJOiXNsvRw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-sso": "3.858.0", "@aws-sdk/core": "3.858.0", - "@aws-sdk/token-providers": "3.858.0", + "@aws-sdk/token-providers": "3.859.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", @@ -8959,9 +8959,9 @@ } }, "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/token-providers": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.858.0.tgz", - "integrity": "sha512-uQ3cVpqbkaxq3Hd8zip0pcOFsP731g+m0zsobQ7Bmqjq4/PHcehTov8i3W9+7sBHocOM61/qrQksPlW0TPuPAA==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.859.0.tgz", + "integrity": "sha512-6P2wlvm9KBWOvRNn0Pt8RntnXg8fzOb5kEShvWsOsAocZeqKNaYbihum5/Onq1ZPoVtkdb++8eWDocDnM4k85Q==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.858.0", @@ -9342,16 +9342,16 @@ } }, "node_modules/@aws-sdk/client-xray": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.858.0.tgz", - "integrity": "sha512-Ah9gXN7of55fwwWIIb/HQsTsVgNpZv0Rj7zLBn7rIYdcTkHQtq0xD/qelacnNUv+xhp0v7FxTDputAFq2G8Wig==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.859.0.tgz", + "integrity": "sha512-vasMsFOaO0X9qC8aYNC6/yMyqlWk0njedK5AO2WEdX+JFrSTInL/C1TzUkrcUuG/aKhC7wBDyTXPthtgctvwaw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.858.0", - "@aws-sdk/credential-provider-node": "3.858.0", + "@aws-sdk/credential-provider-node": "3.859.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", "@aws-sdk/middleware-recursion-detection": "3.840.0", @@ -9509,9 +9509,9 @@ } }, "node_modules/@aws-sdk/client-xray/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.858.0.tgz", - "integrity": "sha512-2ZoVJW2Gg4LjpyZPvzOV+EOJgjuaVN/+mvAxAU6JU5OJJUzqNuW1Mi7VXFdZHcF6weXoKHfzYZVR0uuVapu1lQ==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.859.0.tgz", + "integrity": "sha512-KsccE1T88ZDNhsABnqbQj014n5JMDilAroUErFbGqu5/B3sXqUsYmG54C/BjvGTRUFfzyttK9lB9P9h6ddQ8Cw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -9519,7 +9519,7 @@ "@aws-sdk/credential-provider-env": "3.858.0", "@aws-sdk/credential-provider-http": "3.858.0", "@aws-sdk/credential-provider-process": "3.858.0", - "@aws-sdk/credential-provider-sso": "3.858.0", + "@aws-sdk/credential-provider-sso": "3.859.0", "@aws-sdk/credential-provider-web-identity": "3.858.0", "@aws-sdk/nested-clients": "3.858.0", "@aws-sdk/types": "3.840.0", @@ -9534,17 +9534,17 @@ } }, "node_modules/@aws-sdk/client-xray/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.858.0.tgz", - "integrity": "sha512-clHADxFnMH3R3+7E1bKWEWgoHmLMep2VlmUFDYV4Hw17JR563RRQpzlF2QRCTjSNUjH48dd6AVxEDfh7461X6Q==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.859.0.tgz", + "integrity": "sha512-ZRDB2xU5aSyTR/jDcli30tlycu6RFvQngkZhBs9Zoh2BiYXrfh2MMuoYuZk+7uD6D53Q2RIEldDHR9A/TPlRuA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.858.0", "@aws-sdk/credential-provider-http": "3.858.0", - "@aws-sdk/credential-provider-ini": "3.858.0", + "@aws-sdk/credential-provider-ini": "3.859.0", "@aws-sdk/credential-provider-process": "3.858.0", - "@aws-sdk/credential-provider-sso": "3.858.0", + "@aws-sdk/credential-provider-sso": "3.859.0", "@aws-sdk/credential-provider-web-identity": "3.858.0", "@aws-sdk/types": "3.840.0", "@smithy/credential-provider-imds": "^4.0.6", @@ -9576,15 +9576,15 @@ } }, "node_modules/@aws-sdk/client-xray/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.858.0.tgz", - "integrity": "sha512-YPAsEm4dUPCYO5nC/lv6fPhiihm70rh2Zdg/gmjOiD/7TIR+OT622bW+E1qBJ9s+dzOdAmutGSCmVbxp8gTM5Q==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.859.0.tgz", + "integrity": "sha512-BwAqmWIivhox5YlFRjManFF8GoTvEySPk6vsJNxDsmGsabY+OQovYxFIYxRCYiHzH7SFjd4Lcd+riJOiXNsvRw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-sso": "3.858.0", "@aws-sdk/core": "3.858.0", - "@aws-sdk/token-providers": "3.858.0", + "@aws-sdk/token-providers": "3.859.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", @@ -9748,9 +9748,9 @@ } }, "node_modules/@aws-sdk/client-xray/node_modules/@aws-sdk/token-providers": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.858.0.tgz", - "integrity": "sha512-uQ3cVpqbkaxq3Hd8zip0pcOFsP731g+m0zsobQ7Bmqjq4/PHcehTov8i3W9+7sBHocOM61/qrQksPlW0TPuPAA==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.859.0.tgz", + "integrity": "sha512-6P2wlvm9KBWOvRNn0Pt8RntnXg8fzOb5kEShvWsOsAocZeqKNaYbihum5/Onq1ZPoVtkdb++8eWDocDnM4k85Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -10243,13 +10243,13 @@ } }, "node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.858.0.tgz", - "integrity": "sha512-t2MVoK6WITPfLOoNpfhsAc/pM2spBHhd5fr0vLo5xhTXphj5wVoDbtspkgFQ20TtiR9+XaBZKzAmAWXNMsnZMA==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.859.0.tgz", + "integrity": "sha512-94YLYFlLceKxcAbpusPzIcpy1fOFJZvru47RP3rLF/NOHj4P9XgppCwlG6hUq5Vt++ZCue4CNoxUfdDiKllIvg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.858.0", - "@aws-sdk/util-dynamodb": "3.858.0", + "@aws-sdk/util-dynamodb": "3.859.0", "@smithy/core": "^3.7.2", "@smithy/smithy-client": "^4.4.9", "@smithy/types": "^4.3.1", @@ -10259,7 +10259,7 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.858.0" + "@aws-sdk/client-dynamodb": "^3.859.0" } }, "node_modules/@aws-sdk/lib-dynamodb/node_modules/@aws-sdk/core": { @@ -10909,9 +10909,9 @@ } }, "node_modules/@aws-sdk/util-dynamodb": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.858.0.tgz", - "integrity": "sha512-u8fRmZ/HooXJBP6VuKvtTKicEoHjj1AT7QyBrDaN1AnmgNyDE/swfxSZYZ1MJ1XAcWAcNmBvttKnzL4IS4cTSA==", + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.859.0.tgz", + "integrity": "sha512-NsV8PoPg0dq3TkAMiFF2J31k+AZa3ibB5ChpffNrboRhlISQyUZiWJV5Pv6lMKDKyo8TkRhxAoQDUr9spNs2cg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -10920,7 +10920,7 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.858.0" + "@aws-sdk/client-dynamodb": "^3.859.0" } }, "node_modules/@aws-sdk/util-endpoints": { @@ -14497,14 +14497,13 @@ } }, "node_modules/aws-sdk-client-mock-vitest": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/aws-sdk-client-mock-vitest/-/aws-sdk-client-mock-vitest-6.1.1.tgz", - "integrity": "sha512-pV00ooiXoQmENC0mk9xJYs24C+THzOcGd/3dZVp9RPyD9q1FgcZSjoxYkQhWaxERvhtCpFOIfMlDRpbhiShPJA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock-vitest/-/aws-sdk-client-mock-vitest-6.2.0.tgz", + "integrity": "sha512-ZEkadDIGjwqel4Fwl4bX87RVxA9joT9uxKqb3KCwIj4SoXnjDYs19ke2F5lI8ub3+GMzUud4+RAS3ptDtI8ciw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "^3.0.5", - "tslib": "^2.8.1" + "@vitest/expect": "^3.1.2" }, "peerDependencies": { "@smithy/types": ">=3.5.0", @@ -18964,8 +18963,8 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.858.0", - "@aws-sdk/lib-dynamodb": "^3.858.0", + "@aws-sdk/client-dynamodb": "^3.859.0", + "@aws-sdk/lib-dynamodb": "^3.859.0", "aws-sdk-client-mock": "^4.1.0" }, "peerDependencies": { @@ -19065,7 +19064,7 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.858.0", + "@aws-sdk/client-cloudwatch": "^3.859.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, @@ -19087,11 +19086,11 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.858.0", - "@aws-sdk/client-dynamodb": "^3.858.0", - "@aws-sdk/client-secrets-manager": "^3.858.0", - "@aws-sdk/client-ssm": "^3.858.0", - "@aws-sdk/util-dynamodb": "^3.858.0", + "@aws-sdk/client-appconfigdata": "^3.859.0", + "@aws-sdk/client-dynamodb": "^3.859.0", + "@aws-sdk/client-secrets-manager": "^3.859.0", + "@aws-sdk/client-ssm": "^3.859.0", + "@aws-sdk/util-dynamodb": "^3.859.0", "@smithy/util-base64": "^4.0.0", "aws-sdk-client-mock": "^4.1.0" }, @@ -19154,7 +19153,7 @@ "license": "MIT-0", "dependencies": { "@aws-cdk/toolkit-lib": "^1.4.0", - "@aws-sdk/client-lambda": "^3.858.0", + "@aws-sdk/client-lambda": "^3.859.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.208.0", "esbuild": "^0.25.8", @@ -19162,7 +19161,7 @@ }, "devDependencies": { "@types/promise-retry": "^1.1.6", - "aws-sdk-client-mock-vitest": "^6.1.1" + "aws-sdk-client-mock-vitest": "^6.2.0" } }, "packages/tracer": { @@ -19175,8 +19174,8 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.858.0", - "@aws-sdk/client-xray": "^3.858.0" + "@aws-sdk/client-dynamodb": "^3.859.0", + "@aws-sdk/client-xray": "^3.859.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x" diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index 933f4ebd64..b419cb6719 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -150,8 +150,8 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.858.0", - "@aws-sdk/lib-dynamodb": "^3.858.0", + "@aws-sdk/client-dynamodb": "^3.859.0", + "@aws-sdk/lib-dynamodb": "^3.859.0", "aws-sdk-client-mock": "^4.1.0" } } diff --git a/packages/metrics/package.json b/packages/metrics/package.json index 926801c1ba..7ae6a370e0 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -64,7 +64,7 @@ "main": "./lib/cjs/index.js", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.858.0", + "@aws-sdk/client-cloudwatch": "^3.859.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, diff --git a/packages/parameters/package.json b/packages/parameters/package.json index 27fa490d86..3131d8bb91 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -155,11 +155,11 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.858.0", - "@aws-sdk/client-dynamodb": "^3.858.0", - "@aws-sdk/client-secrets-manager": "^3.858.0", - "@aws-sdk/client-ssm": "^3.858.0", - "@aws-sdk/util-dynamodb": "^3.858.0", + "@aws-sdk/client-appconfigdata": "^3.859.0", + "@aws-sdk/client-dynamodb": "^3.859.0", + "@aws-sdk/client-secrets-manager": "^3.859.0", + "@aws-sdk/client-ssm": "^3.859.0", + "@aws-sdk/util-dynamodb": "^3.859.0", "@smithy/util-base64": "^4.0.0", "aws-sdk-client-mock": "^4.1.0" }, diff --git a/packages/testing/package.json b/packages/testing/package.json index 365bd6a2d5..a043d814d2 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -98,7 +98,7 @@ "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/testing#readme", "dependencies": { "@aws-cdk/toolkit-lib": "^1.4.0", - "@aws-sdk/client-lambda": "^3.858.0", + "@aws-sdk/client-lambda": "^3.859.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.208.0", "esbuild": "^0.25.8", @@ -106,6 +106,6 @@ }, "devDependencies": { "@types/promise-retry": "^1.1.6", - "aws-sdk-client-mock-vitest": "^6.1.1" + "aws-sdk-client-mock-vitest": "^6.2.0" } } diff --git a/packages/tracer/package.json b/packages/tracer/package.json index 66fa5c5ad3..bbcc1a2119 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -29,8 +29,8 @@ "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.858.0", - "@aws-sdk/client-xray": "^3.858.0" + "@aws-sdk/client-dynamodb": "^3.859.0", + "@aws-sdk/client-xray": "^3.859.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x" From b2fcd90834c417dec8c2d45743f2384df3541243 Mon Sep 17 00:00:00 2001 From: Jaime Llamas Date: Tue, 5 Aug 2025 18:59:51 +0200 Subject: [PATCH 008/255] refactor(logger): replace EnvironmentVariablesService class with helper functions (#4251) Co-authored-by: Jaime Llamas Co-authored-by: Andrea Amorosi --- packages/logger/src/Logger.ts | 90 +++++--- .../src/config/EnvironmentVariablesService.ts | 126 ------------ packages/logger/src/formatter/LogFormatter.ts | 29 +-- .../src/formatter/PowertoolsLogFormatter.ts | 2 +- packages/logger/src/types/formatters.ts | 20 +- .../logger/tests/unit/configFromEnv.test.ts | 194 ------------------ packages/logger/tests/unit/formatters.test.ts | 63 +++--- packages/logger/tests/unit/logLevels.test.ts | 11 + packages/logger/tests/unit/sampling.test.ts | 32 --- 9 files changed, 121 insertions(+), 446 deletions(-) delete mode 100644 packages/logger/src/config/EnvironmentVariablesService.ts delete mode 100644 packages/logger/tests/unit/configFromEnv.test.ts diff --git a/packages/logger/src/Logger.ts b/packages/logger/src/Logger.ts index c62d91d0b7..265f8ab76a 100644 --- a/packages/logger/src/Logger.ts +++ b/packages/logger/src/Logger.ts @@ -6,9 +6,15 @@ import type { HandlerMethodDecorator, SyncHandler, } from '@aws-lambda-powertools/commons/types'; +import { + getBooleanFromEnv, + getNumberFromEnv, + getStringFromEnv, + getXRayTraceIdFromEnv, + isDevMode, +} from '@aws-lambda-powertools/commons/utils/env'; import type { Context, Handler } from 'aws-lambda'; import merge from 'lodash.merge'; -import { EnvironmentVariablesService } from './config/EnvironmentVariablesService.js'; import { LogJsonIndent, LogLevelThreshold, @@ -112,10 +118,6 @@ class Logger extends Utility implements LoggerInterface { * Custom config service instance used to configure the logger. */ private customConfigService?: ConfigServiceInterface; - /** - * Environment variables service instance used to fetch environment variables. - */ - private envVarsService = new EnvironmentVariablesService(); /** * Whether to print the Lambda invocation event in the logs. */ @@ -850,7 +852,7 @@ class Logger extends Utility implements LoggerInterface { const unformattedBaseAttributes = { logLevel: this.getLogLevelNameFromNumber(logLevel), timestamp: new Date(), - xRayTraceId: this.envVarsService.getXrayTraceId(), + xRayTraceId: getXRayTraceIdFromEnv(), ...this.getPowertoolsLogData(), message: '', }; @@ -975,13 +977,6 @@ class Logger extends Utility implements LoggerInterface { return this.customConfigService; } - /** - * Get the instance of a service that fetches environment variables. - */ - private getEnvVarsService(): EnvironmentVariablesService { - return this.envVarsService as EnvironmentVariablesService; - } - /** * Get the instance of a service that formats the structure of a * log item's keys and values in the desired way. @@ -1081,7 +1076,7 @@ class Logger extends Utility implements LoggerInterface { input: LogItemMessage, extraInput: LogItemExtraInput ): void { - const traceId = this.envVarsService.getXrayTraceId(); + const traceId = getXRayTraceIdFromEnv(); if (traceId !== undefined && this.shouldBufferLog(traceId, logLevel)) { try { this.bufferLogItem( @@ -1125,7 +1120,7 @@ class Logger extends Utility implements LoggerInterface { * or as the global node console if the `POWERTOOLS_DEV' env variable is set and has truthy value. */ private setConsole(): void { - if (!this.getEnvVarsService().isDevMode()) { + if (!isDevMode()) { this.console = new Console({ stdout: process.stdout, stderr: process.stderr, @@ -1190,9 +1185,21 @@ class Logger extends Utility implements LoggerInterface { return; } - const envVarsValue = this.getEnvVarsService()?.getLogLevel()?.toUpperCase(); - if (this.isValidLogLevel(envVarsValue)) { - this.logLevel = LogLevelThreshold[envVarsValue]; + + const logLevelVariable = getStringFromEnv({ + key: 'POWERTOOLS_LOG_LEVEL', + defaultValue: '', + }); + const logLevelVariableAlias = getStringFromEnv({ + key: 'LOG_LEVEL', + defaultValue: '', + }); + + const logLevelValue = + logLevelVariable !== '' ? logLevelVariable : logLevelVariableAlias; + + if (this.isValidLogLevel(logLevelValue)) { + this.logLevel = LogLevelThreshold[logLevelValue]; this.#initialLogLevel = this.logLevel; return; @@ -1212,8 +1219,15 @@ class Logger extends Utility implements LoggerInterface { const constructorValue = sampleRateValue; const customConfigValue = this.getCustomConfigService()?.getSampleRateValue(); - const envVarsValue = this.getEnvVarsService().getSampleRateValue(); - for (const value of [constructorValue, customConfigValue, envVarsValue]) { + const sampleRateEnvVariable = getNumberFromEnv({ + key: 'POWERTOOLS_LOGGER_SAMPLE_RATE', + defaultValue: 0, + }); + for (const value of [ + constructorValue, + customConfigValue, + sampleRateEnvVariable, + ]) { if (this.isValidSampleRate(value)) { this.#debugLogSampling.sampleRateValue = value; this.powertoolsLogData.sampleRateValue = value; @@ -1236,9 +1250,10 @@ class Logger extends Utility implements LoggerInterface { * the event passed to the Lambda function handler should be logged or not. */ private setLogEvent(): void { - if (this.getEnvVarsService().getLogEvent()) { - this.logEvent = true; - } + this.logEvent = getBooleanFromEnv({ + key: 'POWERTOOLS_LOGGER_LOG_EVENT', + defaultValue: false, + }); } /** @@ -1255,7 +1270,6 @@ class Logger extends Utility implements LoggerInterface { this.logFormatter = logFormatter ?? new PowertoolsLogFormatter({ - envVarsService: this.getEnvVarsService(), logRecordOrder, }); } @@ -1265,7 +1279,7 @@ class Logger extends Utility implements LoggerInterface { * add JSON indentation for pretty printing logs. */ private setLogIndentation(): void { - if (this.getEnvVarsService().isDevMode()) { + if (isDevMode()) { this.logIndentation = LogJsonIndent.PRETTY; } } @@ -1307,7 +1321,13 @@ class Logger extends Utility implements LoggerInterface { ); // configurations that affect Logger behavior - const AlcLogLevel = this.getEnvVarsService().getAwsLogLevel(); + const lambdaLogLevel = getStringFromEnv({ + key: 'AWS_LAMBDA_LOG_LEVEL', + defaultValue: '', + }); + const AlcLogLevel = + lambdaLogLevel === 'FATAL' ? 'CRITICAL' : lambdaLogLevel; + if (this.isValidLogLevel(AlcLogLevel)) { this.#alcLogLevel = AlcLogLevel; } @@ -1340,15 +1360,23 @@ class Logger extends Utility implements LoggerInterface { persistentKeys?: ConstructorOptions['persistentKeys'] ): void { this.addToPowertoolsLogData({ - awsRegion: this.getEnvVarsService().getAwsRegion(), + awsRegion: getStringFromEnv({ + key: 'AWS_REGION', + }), environment: environment || this.getCustomConfigService()?.getCurrentEnvironment() || - this.getEnvVarsService().getCurrentEnvironment(), + getStringFromEnv({ + key: 'ENVIRONMENT', + defaultValue: '', + }), serviceName: serviceName || this.getCustomConfigService()?.getServiceName() || - this.getEnvVarsService().getServiceName() || + getStringFromEnv({ + key: 'POWERTOOLS_SERVICE_NAME', + defaultValue: '', + }) || this.defaultServiceName, }); persistentKeys && this.appendPersistentKeys(persistentKeys); @@ -1433,7 +1461,7 @@ class Logger extends Utility implements LoggerInterface { * your function throws an error. */ public flushBuffer(): void { - const traceId = this.envVarsService.getXrayTraceId(); + const traceId = getXRayTraceIdFromEnv(); if (traceId === undefined) { return; } @@ -1477,7 +1505,7 @@ class Logger extends Utility implements LoggerInterface { * Empties the buffer for the current request */ public clearBuffer(): void { - const traceId = this.envVarsService.getXrayTraceId(); + const traceId = getXRayTraceIdFromEnv(); if (traceId === undefined) { return; } diff --git a/packages/logger/src/config/EnvironmentVariablesService.ts b/packages/logger/src/config/EnvironmentVariablesService.ts deleted file mode 100644 index e5759dd92c..0000000000 --- a/packages/logger/src/config/EnvironmentVariablesService.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { EnvironmentVariablesService as CommonEnvironmentVariablesService } from '@aws-lambda-powertools/commons'; -import type { ConfigServiceInterface } from '../types/ConfigServiceInterface.js'; - -/** - * Class EnvironmentVariablesService - * - * This class is used to return environment variables that are available in the runtime of - * the current Lambda invocation. - * These variables can be a mix of runtime environment variables set by AWS and - * variables that can be set by the developer additionally. - * - * @see https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/#environment-variables - */ -class EnvironmentVariablesService - extends CommonEnvironmentVariablesService - implements ConfigServiceInterface -{ - // Reserved environment variables - private awsLogLevelVariable = 'AWS_LAMBDA_LOG_LEVEL'; - private awsRegionVariable = 'AWS_REGION'; - private currentEnvironmentVariable = 'ENVIRONMENT'; - private functionNameVariable = 'AWS_LAMBDA_FUNCTION_NAME'; - private functionVersionVariable = 'AWS_LAMBDA_FUNCTION_VERSION'; - private logEventVariable = 'POWERTOOLS_LOGGER_LOG_EVENT'; - private logLevelVariable = 'POWERTOOLS_LOG_LEVEL'; - private logLevelVariableLegacy = 'LOG_LEVEL'; - private memoryLimitInMBVariable = 'AWS_LAMBDA_FUNCTION_MEMORY_SIZE'; - private sampleRateValueVariable = 'POWERTOOLS_LOGGER_SAMPLE_RATE'; - private tzVariable = 'TZ'; - - /** - * Return the value of the `AWS_LAMBDA_LOG_LEVEL` environment variable. - * - * The `AWS_LAMBDA_LOG_LEVEL` environment variable is set by AWS Lambda when configuring - * the function's log level using the Advanced Logging Controls feature. This value always - * takes precedence over other means of configuring the log level. - * - * We need to map the `FATAL` log level to `CRITICAL`, see {@link https://docs.aws.amazon.com/lambda/latest/dg/configuration-logging.html#configuration-logging-log-levels AWS Lambda Log Levels}. - */ - public getAwsLogLevel(): string { - const awsLogLevelVariable = this.get(this.awsLogLevelVariable); - - return awsLogLevelVariable === 'FATAL' ? 'CRITICAL' : awsLogLevelVariable; - } - - /** - * Return the value of the AWS_REGION environment variable. - */ - public getAwsRegion(): string { - return this.get(this.awsRegionVariable); - } - - /** - * Return the value of the ENVIRONMENT environment variable. - */ - public getCurrentEnvironment(): string { - return this.get(this.currentEnvironmentVariable); - } - - /** - * Return the value of the AWS_LAMBDA_FUNCTION_MEMORY_SIZE environment variable. - */ - public getFunctionMemory(): number { - const value = this.get(this.memoryLimitInMBVariable); - - return Number(value); - } - - /** - * Return the value of the AWS_LAMBDA_FUNCTION_NAME environment variable. - */ - public getFunctionName(): string { - return this.get(this.functionNameVariable); - } - - /** - * Return the value of the AWS_LAMBDA_FUNCTION_VERSION environment variable. - */ - public getFunctionVersion(): string { - return this.get(this.functionVersionVariable); - } - - /** - * Return the value of the POWERTOOLS_LOGGER_LOG_EVENT environment variable. - */ - public getLogEvent(): boolean { - const value = this.get(this.logEventVariable); - - return this.isValueTrue(value); - } - - /** - * Return the value of the `POWERTOOLS_LOG_LEVEL` or `LOG_LEVEL` (legacy) environment variables - * when the first one is not set. - * - * The `LOG_LEVEL` environment variable is considered legacy and will be removed in a future release. - * The `AWS_LAMBDA_LOG_LEVEL` environment variable always takes precedence over the ones above. - */ - public getLogLevel(): string { - const logLevelVariable = this.get(this.logLevelVariable); - const logLevelVariableAlias = this.get(this.logLevelVariableLegacy); - - return logLevelVariable !== '' ? logLevelVariable : logLevelVariableAlias; - } - - /** - * Return the value of the POWERTOOLS_LOGGER_SAMPLE_RATE environment variable. - */ - public getSampleRateValue(): number | undefined { - const value = this.get(this.sampleRateValueVariable); - - return value && value.length > 0 ? Number(value) : undefined; - } - - /** - * Return the value of the `TZ` environment variable or `UTC` if it is not set. - */ - public getTimezone(): string { - const value = this.get(this.tzVariable); - - return value.length > 0 ? value : 'UTC'; - } -} - -export { EnvironmentVariablesService }; diff --git a/packages/logger/src/formatter/LogFormatter.ts b/packages/logger/src/formatter/LogFormatter.ts index 9bae4fbaa4..9e6a57197a 100644 --- a/packages/logger/src/formatter/LogFormatter.ts +++ b/packages/logger/src/formatter/LogFormatter.ts @@ -1,5 +1,7 @@ -import type { EnvironmentVariablesService } from '../config/EnvironmentVariablesService.js'; -import type { LogFormatterOptions } from '../types/formatters.js'; +import { + getStringFromEnv, + isDevMode, +} from '@aws-lambda-powertools/commons/utils/env'; import type { LogAttributes } from '../types/Logger.js'; import type { UnformattedAttributes } from '../types/logKeys.js'; import type { LogItem } from './LogItem.js'; @@ -13,15 +15,6 @@ import type { LogItem } from './LogItem.js'; * @abstract */ abstract class LogFormatter { - /** - * Instance of the {@link EnvironmentVariablesService} to use for configuration. - */ - protected envVarsService?: EnvironmentVariablesService; - - public constructor(options?: LogFormatterOptions) { - this.envVarsService = options?.envVarsService; - } - /** * Format key-value pairs of log attributes. * @@ -117,9 +110,7 @@ abstract class LogFormatter { location: this.getCodeLocation(error.stack), message, stack: - this.envVarsService?.isDevMode() && typeof stack === 'string' - ? stack?.split('\n') - : stack, + isDevMode() && typeof stack === 'string' ? stack?.split('\n') : stack, cause: cause instanceof Error ? this.formatError(cause) : cause, }; for (const key in error) { @@ -137,9 +128,7 @@ abstract class LogFormatter { /** * Format a date into an ISO 8601 string with the configured timezone. * - * If the log formatter is passed an {@link EnvironmentVariablesService} instance - * during construction, the timezone is read from the `TZ` environment variable, if present. - * + * The timezone is read from the `TZ` environment variable, if present. * Otherwise, the timezone defaults to ':UTC'. * * @param now - The date to format @@ -151,7 +140,11 @@ abstract class LogFormatter { * If a specific timezone is configured and it's not the default `UTC`, * format the timestamp with the appropriate timezone offset. **/ - const configuredTimezone = this.envVarsService?.getTimezone(); + const configuredTimezone = getStringFromEnv({ + key: 'TZ', + defaultValue: '', + }); + if (configuredTimezone && !configuredTimezone.includes(defaultTimezone)) return this.#generateISOTimestampWithOffset(now, configuredTimezone); diff --git a/packages/logger/src/formatter/PowertoolsLogFormatter.ts b/packages/logger/src/formatter/PowertoolsLogFormatter.ts index 9172d33ff1..d68d3ff91c 100644 --- a/packages/logger/src/formatter/PowertoolsLogFormatter.ts +++ b/packages/logger/src/formatter/PowertoolsLogFormatter.ts @@ -27,7 +27,7 @@ class PowertoolsLogFormatter extends LogFormatter { #logRecordOrder?: LogRecordOrderKeys; public constructor(options?: PowertoolsLogFormatterOptions) { - super(options); + super(); this.#logRecordOrder = options?.logRecordOrder; } diff --git a/packages/logger/src/types/formatters.ts b/packages/logger/src/types/formatters.ts index 5909ed83e2..389434a759 100644 --- a/packages/logger/src/types/formatters.ts +++ b/packages/logger/src/types/formatters.ts @@ -1,17 +1,5 @@ -import type { EnvironmentVariablesService } from '../config/EnvironmentVariablesService.js'; -import type { LogFormatter } from '../formatter/LogFormatter.js'; import type { LogKey } from './logKeys.js'; -/** - * Options for the {@link LogFormatter} class. - */ -type LogFormatterOptions = { - /** - * Instance of the {@link EnvironmentVariablesService} to use for configuration. - */ - envVarsService?: EnvironmentVariablesService; -}; - /** * List of keys to order log attributes by. * @@ -22,15 +10,11 @@ type LogRecordOrderKeys = Set | LogKey[]; /** * Options for the {@link PowertoolsLogFormatter} class. */ -type PowertoolsLogFormatterOptions = LogFormatterOptions & { +type PowertoolsLogFormatterOptions = { /** * An array of keys that defines the order of the log record. */ logRecordOrder?: LogRecordOrderKeys; }; -export type { - LogFormatterOptions, - PowertoolsLogFormatterOptions, - LogRecordOrderKeys, -}; +export type { LogRecordOrderKeys, PowertoolsLogFormatterOptions }; diff --git a/packages/logger/tests/unit/configFromEnv.test.ts b/packages/logger/tests/unit/configFromEnv.test.ts deleted file mode 100644 index 87cf414d31..0000000000 --- a/packages/logger/tests/unit/configFromEnv.test.ts +++ /dev/null @@ -1,194 +0,0 @@ -import { beforeEach, describe, expect, it } from 'vitest'; -import { EnvironmentVariablesService } from '../../src/config/EnvironmentVariablesService.js'; - -describe('Class: EnvironmentVariablesService', () => { - const ENVIRONMENT_VARIABLES = process.env; - - beforeEach(() => { - process.env = { ...ENVIRONMENT_VARIABLES }; - }); - - it('returns the value of the environment variable AWS_LAMBDA_LOG_LEVEL and aliases it as needed', () => { - // Prepare - process.env.AWS_LAMBDA_LOG_LEVEL = 'FATAL'; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.getAwsLogLevel(); - - // Assess - // The Advanced Logging Controls feature in AWS Lambda supports the `FATAL` log level, which we don't support - // and instead map to `CRITICAL` as per the existing log levels. In this test, we expect the value to be `CRITICAL`. - expect(value).toEqual('CRITICAL'); - }); - - it('returns the value of the environment variable AWS_REGION', () => { - // Prepare - process.env.AWS_REGION = 'us-east-1'; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.getAwsRegion(); - - // Assess - expect(value).toEqual('us-east-1'); - }); - - it('returns the value of the environment variable AWS_REGION', () => { - // Prepare - process.env.ENVIRONMENT = 'stage'; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.getCurrentEnvironment(); - - // Assess - expect(value).toEqual('stage'); - }); - - it('returns the value of the environment variable AWS_LAMBDA_FUNCTION_MEMORY_SIZE', () => { - // Prepare - process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE = '123456'; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.getFunctionMemory(); - - // Assess - expect(value).toBe(123456); - }); - - it('returns the value of the environment variable AWS_LAMBDA_FUNCTION_NAME', () => { - // Prepare - process.env.AWS_LAMBDA_FUNCTION_NAME = 'my-lambda-function'; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.getFunctionName(); - - // Assess - expect(value).toEqual('my-lambda-function'); - }); - - it('returns the value of the environment variable AWS_LAMBDA_FUNCTION_VERSION', () => { - // Prepare - process.env.AWS_LAMBDA_FUNCTION_VERSION = '1.4.0'; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.getFunctionVersion(); - - // Assess - expect(value).toEqual('1.4.0'); - }); - - it('returns true if the environment variable POWERTOOLS_LOGGER_LOG_EVENT is "true"', () => { - // Prepare - process.env.POWERTOOLS_LOGGER_LOG_EVENT = 'true'; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.getLogEvent(); - - // Assess - expect(value).toEqual(true); - }); - - it('returns false if the environment variable POWERTOOLS_LOGGER_LOG_EVENT is "false"', () => { - // Prepare - process.env.POWERTOOLS_LOGGER_LOG_EVENT = 'false'; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.getLogEvent(); - - // Assess - expect(value).toEqual(false); - }); - - it('returns false if the environment variable POWERTOOLS_LOGGER_LOG_EVENT is "somethingsilly"', () => { - // Prepare - process.env.POWERTOOLS_LOGGER_LOG_EVENT = 'somethingsilly'; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.getLogEvent(); - - // Assess - expect(value).toEqual(false); - }); - - it('returns the value of the environment variable LOG_LEVEL when POWERTOOLS_LOG_LEVEL is not set', () => { - // Prepare - process.env.POWERTOOLS_LOG_LEVEL = undefined; - process.env.LOG_LEVEL = 'ERROR'; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.getLogLevel(); - - // Assess - expect(value).toEqual('ERROR'); - }); - - it('returns the value of the environment variable POWERTOOLS_LOG_LEVEL when LOG_LEVEL one is also set', () => { - // Prepare - process.env.LOG_LEVEL = 'WARN'; - process.env.POWERTOOLS_LOG_LEVEL = 'INFO'; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.getLogLevel(); - - // Assess - expect(value).toEqual('INFO'); - }); - - it('returns an empty value if neither POWERTOOLS_LOG_LEVEL nor LOG_LEVEL are set', () => { - // Prepare - process.env.LOG_LEVEL = undefined; - process.env.POWERTOOLS_LOG_LEVEL = undefined; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.getLogLevel(); - - // Assess - expect(value).toEqual(''); - }); - - it('returns the value of the environment variable POWERTOOLS_LOGGER_SAMPLE_RATE', () => { - // Prepare - process.env.POWERTOOLS_LOGGER_SAMPLE_RATE = '0.01'; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.getSampleRateValue(); - - // Assess - expect(value).toEqual(0.01); - }); - - it('returns the value of the TZ environment variable when set', () => { - // Prepare - process.env.TZ = 'Europe/London'; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.getTimezone(); - - // Assess - expect(value).toEqual('Europe/London'); - }); - - it('returns the default UTC value when no TZ is set', () => { - // Prepare - const service = new EnvironmentVariablesService(); - - // Act - const value = service.getTimezone(); - - // Assess - expect(value).toEqual('UTC'); - }); -}); diff --git a/packages/logger/tests/unit/formatters.test.ts b/packages/logger/tests/unit/formatters.test.ts index 19cfb2685e..e826cbd6a5 100644 --- a/packages/logger/tests/unit/formatters.test.ts +++ b/packages/logger/tests/unit/formatters.test.ts @@ -1,6 +1,5 @@ import { AssertionError } from 'node:assert'; import { afterAll, beforeEach, describe, expect, it, vi } from 'vitest'; -import { EnvironmentVariablesService } from '../../src/config/EnvironmentVariablesService.js'; import { PowertoolsLogFormatter } from '../../src/formatter/PowertoolsLogFormatter.js'; import { LogFormatter, @@ -17,10 +16,6 @@ import type { LogKey, UnformattedAttributes } from '../../src/types/logKeys.js'; const fileNameRegexpWithLine = new RegExp(/formatters.test.ts:\d+:\d+/); const formatter = new PowertoolsLogFormatter(); -const formatterWithEnv = new PowertoolsLogFormatter({ - envVarsService: new EnvironmentVariablesService(), -}); - class ErrorWithCause extends Error { public constructor(message: string, options?: { cause: unknown }) { super(message, options); @@ -296,7 +291,7 @@ describe('Formatters', () => { it('when logRecordOrder is not set, it will not order the attributes in the log item', () => { // Prepare - const formatter = new PowertoolsLogFormatter({}); + const formatter = new PowertoolsLogFormatter(); const additionalLogAttributes: LogAttributes = { additional_key: 'additional_value', }; @@ -422,7 +417,9 @@ describe('Formatters', () => { location: expect.any(String), message: 'bar', name: 'Error', - stack: expect.stringMatching(fileNameRegexpWithLine), + stack: expect.arrayContaining([ + expect.stringMatching(fileNameRegexpWithLine), + ]), }, }, }, @@ -443,13 +440,34 @@ describe('Formatters', () => { // Assess expect(formattedError).toEqual({ - stack: expect.stringMatching(fileNameRegexpWithLine), + stack: expect.arrayContaining([ + expect.stringMatching(fileNameRegexpWithLine), + ]), name, ...expectedFields, }); } ); + it('formats stack as string when not in dev mode', () => { + // Prepare + const originalDevMode = process.env.POWERTOOLS_DEV; + delete process.env.POWERTOOLS_DEV; // Ensure dev mode is off + + const error = new Error('Test error'); + const formatter = new PowertoolsLogFormatter(); + + // Act + const formattedError = formatter.formatError(error); + + // Assess + expect(formattedError.stack).toEqual(expect.any(String)); + expect(Array.isArray(formattedError.stack)).toBe(false); + + // Cleanup + process.env.POWERTOOLS_DEV = originalDevMode; + }); + it('formats custom errors by including only enumerable properties', () => { // Prepare const customSymbol = Symbol('customSymbol'); @@ -487,7 +505,9 @@ describe('Formatters', () => { // Assess expect(formattedError).toEqual({ location: expect.any(String), - stack: expect.stringMatching(fileNameRegexpWithLine), + stack: expect.arrayContaining([ + expect.stringMatching(fileNameRegexpWithLine), + ]), name: 'SuperCustomError', message: 'Something went wrong', code: 500, @@ -516,7 +536,7 @@ describe('Formatters', () => { vi.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(240); // Act - const timestamp = formatterWithEnv.formatTimestamp(new Date()); + const timestamp = formatter.formatTimestamp(new Date()); // Assess expect(timestamp).toEqual('2016-06-20T08:08:10.000-04:00'); @@ -532,7 +552,7 @@ describe('Formatters', () => { vi.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(240); // Act - const timestamp = formatterWithEnv.formatTimestamp(new Date()); + const timestamp = formatter.formatTimestamp(new Date()); // Assess expect(timestamp).toEqual('2016-06-20T08:08:10.000-04:00'); @@ -548,7 +568,7 @@ describe('Formatters', () => { vi.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(240); // Act - const timestamp = formatterWithEnv.formatTimestamp(new Date()); + const timestamp = formatter.formatTimestamp(new Date()); // Assess expect(timestamp).toEqual('2016-06-20T08:08:10.000-04:00'); @@ -563,9 +583,7 @@ describe('Formatters', () => { The negative value indicates that `Asia/Dhaka` is ahead of UTC. */ vi.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(-360); - const formatter = new PowertoolsLogFormatter({ - envVarsService: new EnvironmentVariablesService(), - }); + const formatter = new PowertoolsLogFormatter(); // Act const timestamp = formatter.formatTimestamp(new Date()); @@ -584,9 +602,7 @@ describe('Formatters', () => { The negative value indicates that `Asia/Dhaka` is ahead of UTC. */ vi.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(-360); - const formatter = new PowertoolsLogFormatter({ - envVarsService: new EnvironmentVariablesService(), - }); + const formatter = new PowertoolsLogFormatter(); // Act const timestamp = formatter.formatTimestamp(new Date()); @@ -597,11 +613,8 @@ describe('Formatters', () => { it('returns defaults to :UTC when an env variable service is not set', () => { // Prepare - process.env.TZ = 'Asia/Dhaka'; - /* - Difference between UTC and `Asia/Dhaka`(GMT +06.00) is 360 minutes. - The negative value indicates that `Asia/Dhaka` is ahead of UTC. - */ + process.env.TZ = undefined; + vi.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(-360); const formatter = new PowertoolsLogFormatter(); @@ -616,9 +629,7 @@ describe('Formatters', () => { // Prepare process.env.TZ = ':/etc/localtime'; vi.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(0); - const formatter = new PowertoolsLogFormatter({ - envVarsService: new EnvironmentVariablesService(), - }); + const formatter = new PowertoolsLogFormatter(); // Act const timestamp = formatter.formatTimestamp(new Date()); diff --git a/packages/logger/tests/unit/logLevels.test.ts b/packages/logger/tests/unit/logLevels.test.ts index af28510dad..cee4602499 100644 --- a/packages/logger/tests/unit/logLevels.test.ts +++ b/packages/logger/tests/unit/logLevels.test.ts @@ -104,6 +104,17 @@ describe('Log levels', () => { expect(logger.getLevelName()).toBe(LogLevel.CRITICAL); }); + it('sets the log level to CRITICAL when AWS_LAMBDA_LOG_LEVEL is FATAL', () => { + // Prepare + process.env.AWS_LAMBDA_LOG_LEVEL = 'FATAL'; + + // Act + const logger = new Logger(); + + // Assess + expect(logger.getLevelName()).toBe('CRITICAL'); + }); + it('sets the correct log level when using a custom config service', () => { // Prepare process.env.POWERTOOLS_LOG_LEVEL = undefined; diff --git a/packages/logger/tests/unit/sampling.test.ts b/packages/logger/tests/unit/sampling.test.ts index 0373329b71..947a8271b9 100644 --- a/packages/logger/tests/unit/sampling.test.ts +++ b/packages/logger/tests/unit/sampling.test.ts @@ -1,20 +1,6 @@ import { beforeEach, describe, expect, it } from 'vitest'; -import { EnvironmentVariablesService } from '../../src/config/EnvironmentVariablesService.js'; import { Logger, LogLevel, LogLevelThreshold } from '../../src/index.js'; -class CustomConfigService extends EnvironmentVariablesService { - #sampleRateValue = 1; - - public constructor(value = 1) { - super(); - this.#sampleRateValue = value; - } - - public getSampleRateValue(): number { - return this.#sampleRateValue; - } -} - describe('Log sampling', () => { const ENVIRONMENT_VARIABLES = process.env; @@ -47,17 +33,6 @@ describe('Log sampling', () => { expect(logger.level).toBe(LogLevelThreshold.DEBUG); }); - it('changes the log level to DEBUG log sampling is configured via custom config service', () => { - // Act - const logger: Logger = new Logger({ - logLevel: LogLevel.ERROR, - customConfigService: new CustomConfigService(), - }); - - // Assess - expect(logger.level).toBe(LogLevelThreshold.DEBUG); - }); - it('changes the log level to debug log sampling is configured via env variable', () => { // Prepare process.env.POWERTOOLS_LOGGER_SAMPLE_RATE = '1'; @@ -89,7 +64,6 @@ describe('Log sampling', () => { // Act const logger: Logger = new Logger({ sampleRateValue: 1, - customConfigService: new CustomConfigService(0.75), }); // Assess @@ -103,12 +77,6 @@ describe('Log sampling', () => { }, type: 'constructor', }, - { - options: { - customConfigService: new CustomConfigService(42), - }, - type: 'custom config service', - }, { options: {}, type: 'env variable', From 5217d5e462b710bf512558c72ea6d0b04f47882d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Aug 2025 18:02:41 +0100 Subject: [PATCH 009/255] chore(deps): bump @types/node from 24.1.0 to 24.2.0 (#4271) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- examples/app/package.json | 4 ++-- package-lock.json | 20 ++++++++++---------- package.json | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index a4fd1be993..b265e5762f 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -29,7 +29,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.152", - "@types/node": "24.1.0", + "@types/node": "24.2.0", "aws-cdk-lib": "^2.208.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -48,7 +48,7 @@ "@aws-sdk/lib-dynamodb": "^3.859.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", - "@types/node": "24.1.0", + "@types/node": "24.2.0", "aws-cdk": "^2.1023.0", "constructs": "^10.4.2", "esbuild": "^0.25.8", diff --git a/package-lock.json b/package-lock.json index 31f7d3e16f..005c59e7ff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "devDependencies": { "@biomejs/biome": "^2.1.3", "@types/aws-lambda": "^8.10.152", - "@types/node": "^24.1.0", + "@types/node": "^24.2.0", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.1.2", @@ -60,7 +60,7 @@ "@aws-sdk/lib-dynamodb": "^3.859.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", - "@types/node": "24.1.0", + "@types/node": "24.2.0", "aws-cdk": "^2.1023.0", "constructs": "^10.4.2", "esbuild": "^0.25.8", @@ -68,7 +68,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.152", - "@types/node": "24.1.0", + "@types/node": "24.2.0", "aws-cdk-lib": "^2.208.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -13221,12 +13221,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz", - "integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==", + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.2.0.tgz", + "integrity": "sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==", "license": "MIT", "dependencies": { - "undici-types": "~7.8.0" + "undici-types": "~7.10.0" } }, "node_modules/@types/promise-retry": { @@ -18440,9 +18440,9 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", "license": "MIT" }, "node_modules/unicorn-magic": { diff --git a/package.json b/package.json index da74d9b092..2b9c65e0c3 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "devDependencies": { "@biomejs/biome": "^2.1.3", "@types/aws-lambda": "^8.10.152", - "@types/node": "^24.1.0", + "@types/node": "^24.2.0", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.1.2", From 0641e3d465f5e2ff6ea8d19568a5e831af8db7a9 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Tue, 5 Aug 2025 19:16:49 +0200 Subject: [PATCH 010/255] docs: update maintainers & PR template (#4274) Co-authored-by: Stefano Vozza --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- docs/maintainers.md | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 8b58b6a7bf..210c64711e 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -8,7 +8,7 @@ > Please add the issue number below, if no issue is present the PR might get blocked and not be reviewed -**Issue number:** +**Issue number:** closes # -???+ warning "Don't use in production (yet)" - This feature is currently under development. As such it's considered not stable and we might make significant breaking changes before going [before its release](https://github.com/aws-powertools/powertools-lambda-typescript/milestone/17){target="_blank"}. You are welcome to [provide feedback](https://github.com/aws-powertools/powertools-lambda-typescript/issues/413){target="_blank"} and [contribute to the project](../../contributing/getting_started.md){target="_blank"}. - -Event handler for Amazon API Gateway REST and HTTP APIs, Application Loader Balancer (ALB), Lambda Function URLs, and VPC Lattice. - -## Key Features - -* Lightweight routing to reduce boilerplate for API Gateway REST/HTTP API, ALB and Lambda Function URLs. -* Support for CORS, binary and Gzip compression, Decimals JSON encoding and bring your own JSON serializer -* Built-in integration with [Parser](../../features/parser.md){target="_blank"} for easy payload validation and parsing -* Works with micro function (one or a few routes) and monolithic functions (all routes) - -## Getting started - -???+ tip - All examples shared in this documentation are available within the [project repository](https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/examples/snippets/event-handler){target="_blank"}. - -### Install - -```shell -npm install @aws-lambda-powertools/event-handler -``` - -### Required resources - -If you're using any API Gateway integration, you must have an existing [API Gateway Proxy integration](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html){target="_blank"} or [ALB](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html){target="_blank"} configured to invoke your Lambda function. - -In case of using [VPC Lattice](https://docs.aws.amazon.com/lambda/latest/dg/services-vpc-lattice.html){target="_blank"}, you must have a service network configured to invoke your Lambda function. - -This is the sample infrastructure for API Gateway and Lambda Function URLs we are using for the examples in this documentation. - -???+ info "There is no additional permissions or dependencies required to use this utility." - -=== "API Gateway SAM Template" - - ```yaml title="AWS Serverless Application Model (SAM) example" -[//]: # ( --8<-- "examples/snippets/event-handler/rest/templates/template.yaml") - ``` - -=== "Lambda Function URL SAM Template" - - ```yaml title="AWS Serverless Application Model (SAM) example" -[//]: # ( --8<-- "examples/event_handler_lambda_function_url/sam/template.yaml") - ``` - - - \ No newline at end of file diff --git a/docs/features/event-handler/bedrock-agents.md b/docs/features/event-handler/bedrock-agents.md index fa81222ed0..8ea8a22fd0 100644 --- a/docs/features/event-handler/bedrock-agents.md +++ b/docs/features/event-handler/bedrock-agents.md @@ -1,7 +1,6 @@ --- title: Bedrock Agents description: Event Handler for Amazon Bedrock Agents -status: new --- diff --git a/docs/features/event-handler/index.md b/docs/features/event-handler/index.md index 6ee9a38397..817fed779b 100644 --- a/docs/features/event-handler/index.md +++ b/docs/features/event-handler/index.md @@ -7,6 +7,14 @@ description: Simplify routing and processing of events in AWS Lambda functions
+- __REST APIs__ + + --- + + Event handler for Amazon API Gateway REST and HTTP APIs, Application Loader Balancer (ALB), Lambda Function URLs, and VPC Lattice. + + [:octicons-arrow-right-24: Read more](./rest.md) + - __AppSync Events API__ --- diff --git a/docs/features/event-handler/rest.md b/docs/features/event-handler/rest.md new file mode 100644 index 0000000000..8de6d6d108 --- /dev/null +++ b/docs/features/event-handler/rest.md @@ -0,0 +1,541 @@ +--- +title: REST API +description: Event handler for building REST APIs in AWS Lambda +status: new +--- + +!!! warning "Feature status" + This feature is under active development and may undergo significant changes. We recommend using it in non-critical workloads and [providing feedback](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose){target="_blank"} to help us improve it. + +Event handler for Amazon API Gateway REST and HTTP APIs, Application Loader Balancer (ALB), Lambda Function URLs, and VPC Lattice. + +## Key Features + +* Lightweight routing to reduce boilerplate for API Gateway REST/HTTP API, ALB and Lambda Function URLs. +* Built-in middleware engine for request/response transformation and validation. +* Works with micro function (one or a few routes) and monolithic functions (all routes) + +## Getting started + +### Install + +!!! info "This is not necessary if you're installing Powertools for AWS Lambda (TypeScript) via [Lambda layer](../../getting-started/lambda-layers.md)." + +```shell +npm install @aws-lambda-powertools/event-handler +``` + +### Required resources + +If you're using any API Gateway integration, you must have an existing [API Gateway Proxy integration](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html){target="_blank"} or [ALB](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html){target="_blank"} configured to invoke your Lambda function. + +In case of using [VPC Lattice](https://docs.aws.amazon.com/lambda/latest/dg/services-vpc-lattice.html){target="_blank"}, you must have a service network configured to invoke your Lambda function. + +This is the sample infrastructure for API Gateway and Lambda Function URLs we are using for the examples in this documentation. There is no additional permissions or dependencies required to use this utility. + +??? "See Infrastructure as Code (IaC) examples" + === "API Gateway SAM Template" + + ```yaml title="AWS Serverless Application Model (SAM) example" + --8<-- "examples/snippets/event-handler/rest/templates/api_gateway.yml" + ``` + +### Route events + +Before you start defining your routes, it's important to understand how the event handler works with different types of events. The event handler can process events from API Gateway REST APIs, and will soon support HTTP APIs, ALB, Lambda Function URLs, and VPC Lattice as well. + +When a request is received, the event handler will automatically convert the event into a [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) object and give you access to the current request context, including headers, query parameters, and request body, as well as path parameters via typed arguments. + +#### Response auto-serialization + +!!! tip "Want full control over the response, headers, and status code? Read about it in the [Fine grained responses](#fine-grained-responses) section." + +For your convenience, when you return a JavaScript object from your route handler, we automatically perform these actions: + +* Auto-serialize the response to JSON and trim whitespace +* Include the response under the appropriate equivalent of a `body` +* Set the `Content-Type` header to `application/json` +* Set the HTTP status code to 200 (OK) + +=== "index.ts" + + ```ts hl_lines="6" + --8<-- "examples/snippets/event-handler/rest/gettingStarted_serialization.ts" + ``` + + 1. This object will be serialized, trimmed, and included under the `body` key + +=== "JSON response" + + ```json hl_lines="6" + --8<-- "examples/snippets/event-handler/rest/samples/gettingStarted_serialization.json" + ``` + +### Dynamic routes + +You can use `/todos/:todoId` to configure dynamic URL paths, where `:todoId` will be resolved at runtime. + +All dynamic route parameters will be available as typed object properties in the first argument of your route handler. + +=== "index.ts" + + ```ts hl_lines="14" + --8<-- "examples/snippets/event-handler/rest/gettingStarted_dynamic_routes.ts:3" + ``` + +=== "Request" + + ```json + --8<-- "examples/snippets/event-handler/rest/samples/gettingStarted_dynamic_routes.json" + ``` + +You can also nest dynamic paths, for example `/todos/:todoId/comments/:commentId`, where both `:todoId` and `:commentId` will be resolved at runtime. + +### HTTP Methods + +You can use dedicated methods to specify the HTTP method that should be handled in each resolver. That is, `app.`, where the HTTP method could be `delete`, `get`, `head`, `patch`, `post`, `put`, `options`. + +=== "index.ts" + + ```ts hl_lines="14 16" + --8<-- "examples/snippets/event-handler/rest/gettingStarted_methods.ts:3" + ``` + +=== "Request" + + ```json + --8<-- "examples/snippets/event-handler/rest/samples/gettingStarted_methods.json" + ``` + +If you need to accept multiple HTTP methods in a single function, or support an HTTP method for which no dedicated method exists (i.e. [`TRACE`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods/TRACE){target="_blank"}), you can use the `route` method and pass a list of HTTP methods. + +=== "index.ts" + + ```ts hl_lines="21-24" + --8<-- "examples/snippets/event-handler/rest/gettingStarted_multi_methods.ts:3" + ``` + +!!! tip + We generally recommend to have separate functions for each HTTP method, as the functionality tends to differ depending on which method is used. + +### Data validation + +!!! note "Coming soon" + Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose) if you would like us to prioritize this feature. + +### Accessing request details + +You can access request details such as headers, query parameters, and body using the `Request` object provided to your route handlers. + +### Handling not found routes + +!!! note "Coming soon" + Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose){target="_blank"} if you would like us to prioritize this feature. + +### Error handling + +!!! note "Coming soon" + Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose){target="_blank"} if you would like us to prioritize this feature. + +### Throwing HTTP errors + +!!! note "Coming soon" + Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose){target="_blank"} if you would like us to prioritize this feature. + +### Enabling SwaggerUI + +!!! note "Coming soon" + Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose){target="_blank"} if you would like us to prioritize this feature. + +### Custom domains + +!!! note "Coming soon" + Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose){target="_blank"} if you would like us to prioritize this feature. + +## Advanced + +### CORS + +You can configure CORS at the router level via the `cors` middleware. + +!!! note "Coming soon" + +### Middleware + +Middleware are functions that execute during the request-response cycle, sitting between the +incoming request and your route handler. They provide a way to implement cross-cutting +concerns like authentication, logging, validation, and response transformation without +cluttering your route handlers. + +Each middleware function receives the following arguments: + +* **params** Route parameters extracted from the URL path +* **reqCtx** Request context containing the event, Lambda context, request, and response objects +* **next** A function to pass control to the next middleware in the chain + +Middleware can be applied on specific routes, globally on all routes, or a combination of both. + +Middleware execution follows an onion pattern where global middleware runs first in +pre-processing, then route-specific middleware. After the handler executes, the order reverses +for post-processing. When middleware modify the same response properties, the middleware that +executes last in post-processing wins. + +```mermaid +sequenceDiagram + participant Request + participant Router + participant GM as Global Middleware + participant RM as Route Middleware + participant Handler as Route Handler + + Request->>Router: Incoming Request + Router->>GM: Execute (params, reqCtx, next) + Note over GM: Pre-processing + GM->>RM: Call next() + Note over RM: Pre-processing + RM->>Handler: Call next() + Note over Handler: Execute handler + Handler-->>RM: Return + Note over RM: Post-processing + RM-->>GM: Return + Note over GM: Post-processing + GM-->>Router: Return + Router-->>Request: Response + +``` + +#### Registering middleware + +You can use `app.use` to register middleware that should always run regardless of the route +and you can apply middleware to specific routes by passing them as arguments before the route +handler. + +=== "index.ts" + + ```ts hl_lines="9-14 16-21 31" + --8<-- "examples/snippets/event-handler/rest/advanced_mw_middleware_order.ts:3" + ``` + +=== "JSON Response" + + ```json hl_lines="6-7" + --8<-- "examples/snippets/event-handler/rest/samples/advanced_mw_middleware_order.json" + ``` + +#### Returning early + +There are cases where you may want to terminate the execution of the middleware chain early. To +do so, middleware can short-circuit processing by returning a `Response` or JSON object +instead of calling `next()`. Neither the handler nor any subsequent middleware will run +but the post-processing of already executed middleware will. + +```mermaid +sequenceDiagram + participant Request + participant Router + participant M1 as Middleware 1 + participant M2 as Middleware 2 + participant M3 as Middleware 3 + participant Handler as Route Handler + + Request->>Router: Incoming Request + Router->>M1: Execute (params, reqCtx, next) + Note over M1: Pre-processing + M1->>M2: Call next() + Note over M2: Pre-processing + M2->>M2: Return Response (early return) + Note over M2: Post-processing + M2-->>M1: Return Response + Note over M1: Post-processing + M1-->>Router: Return Response + Router-->>Request: Response + Note over M3,Handler: Never executed + +``` + +=== "index.ts" + + ```ts hl_lines="13-18" + --8<-- "examples/snippets/event-handler/rest/advanced_mw_early_return.ts:3" + ``` + +=== "JSON Response" + + ```json hl_lines="2" + --8<-- "examples/snippets/event-handler/rest/samples/advanced_mw_early_return.json" + ``` + +#### Error Handling + +By default, any unhandled error in the middleware chain will be propagated as a HTTP +500 back to the client. As you would expect, unlike early return, this stops the middleware +chain entirely and no post-processing steps for any previously executed middleware will occur. + +```mermaid +sequenceDiagram + participant Request + participant Router + participant EH as Error Handler + participant M1 as Middleware 1 + participant M2 as Middleware 2 + participant Handler as Route Handler + + Request->>Router: Incoming Request + Router->>M1: Execute (params, reqCtx, next) + Note over M1: Pre-processing + M1->>M2: Call next() + Note over M2: Throws Error + M2-->>M1: Error propagated + M1-->>Router: Error propagated + Router->>EH: Handle error + EH-->>Router: HTTP 500 Response + Router-->>Request: HTTP 500 Error + Note over Handler: Never executed + +``` + +
*Unhandled errors*
+ +You can handle errors in middleware as you would anywhere else, simply surround your code in +a `try`/`catch` block and processing will occur as usual. + +```mermaid +sequenceDiagram + participant Request + participant Router + participant M1 as Middleware 1 + participant M2 as Middleware 2 + participant Handler as Route Handler + + Request->>Router: Incoming Request + Router->>M1: Execute (params, reqCtx, next) + Note over M1: Pre-processing + M1->>M2: Call next() + Note over M2: Error thrown & caught + Note over M2: Handle error gracefully + M2->>Handler: Call next() + Note over Handler: Execute handler + Handler-->>M2: Return + Note over M2: Post-processing + M2-->>M1: Return + Note over M1: Post-processing + M1-->>Router: Return + Router-->>Request: Response + +``` + +
*Handled errors*
+ +Similarly, you can choose to stop processing entirely by throwing an error in your +middleware. Event handler provides many [built-in HTTP errors](#throwing-http-errors) that +you can use or you can throw a custom error of your own. As noted above, this means +that no post-processing of your request will occur. + +```mermaid +sequenceDiagram + participant Request + participant Router + participant EH as Error Handler + participant M1 as Middleware 1 + participant M2 as Middleware 2 + participant Handler as Route Handler + + Request->>Router: Incoming Request + Router->>M1: Execute (params, reqCtx, next) + Note over M1: Pre-processing + M1->>M2: Call next() + Note over M2: Intentionally throws error + M2-->>M1: Error propagated + M1-->>Router: Error propagated + Router->>EH: Handle error + EH-->>Router: HTTP Error Response + Router-->>Request: HTTP Error Response + Note over Handler: Never executed + +``` + +
*Intentional errors*
+ +#### Custom middleware + +A common pattern to create reusable middleware is to implement a factory functions that +accepts configuration options and returns a middleware function. + +=== "index.ts" + + ```ts hl_lines="5-26 31" + --8<-- "examples/snippets/event-handler/rest/advanced_mw_custom_middleware.ts:3" + ``` + +In this example we have a middleware that acts only in the post-processing stage as all +the logic occurs after the `next` function has been called. This is so as to ensure that +the handler has run and we have access to request body. + +#### Avoiding destructuring pitfalls + +!!! warning "Critical: Never destructure the response object" + When writing middleware, always access the response through `reqCtx.res` rather than destructuring `{ res }` from the request context. Destructuring captures a reference to the original response object, which becomes stale when middleware replaces the response. + +=== "index.ts" + + ```ts hl_lines="6 14-15" + --8<-- "examples/snippets/event-handler/rest/advanced_mw_destructuring_problem.ts:3" + ``` + +During the middleware execution chain, the response object (`reqCtx.res`) can be replaced by +other middleware or the route handler. When you destructure the request context, you capture +a reference to the response object as it existed at that moment, not the current response. + +#### Composing middleware + +You can create reusable middleware stacks by using the `composeMiddleware` function to combine +multiple middleware into a single middleware function. This is useful for creating standardized +middleware combinations that can be shared across different routes or applications. + +=== "index.ts" + + ```ts hl_lines="33-34 39" + --8<-- "examples/snippets/event-handler/rest/advanced_mw_compose_middleware.ts:3" + ``` + +The `composeMiddleware` function maintains the same execution order as if you had applied the +middleware individually, following the onion pattern where middleware execute in order during +pre-processing and in reverse order during post-processing. + +!!! note "Composition order" + Unlike traditional function composition which typically works right-to-left, `composeMiddleware` follows the convention used by most web frameworks and executes middleware left-to-right (first to last in the array). This means `composeMiddleware([a, b, c])` executes middleware `a` first, then `b`, then `c`. + +#### Being a good citizen + +Middleware can add subtle improvements to request/response processing, but also add significant complexity if you're not careful. + +Keep the following in mind when authoring middleware for Event Handler: + +* **Call the next middleware.** If you are not returning early by returning a `Response` object + or JSON object, always ensure you call the `next` function. +* **Keep a lean scope.** Focus on a single task per middleware to ease composability and maintenance. +* **Catch your own errors.** Catch and handle known errors to your logic, unless you want to raise HTTP Errors, or propagate specific errors to the client. +* **Avoid destructuring the response object.** As mentioned in the [destructuring pitfalls](#avoiding-destructuring-pitfalls) section, always access the response through `reqCtx.res` rather than destructuring to avoid stale references. + +### Fine grained responses + +You can use the Web API's `Response` object to have full control over the response. For +example, you might want to add additional headers, cookies, or set a custom content type. + +=== "index.ts" + + ```ts hl_lines="11-19 25-32" + --8<-- "examples/snippets/event-handler/rest/advanced_fine_grained_responses.ts:6" + ``` + +=== "JSON Response" + + ```json hl_lines="4-6" + --8<-- "examples/snippets/event-handler/rest/samples/advanced_fine_grained_responses.json" + ``` + +### Response streaming + +!!! note "Coming soon" + Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose) if you would like us to prioritize this feature. + +### Compress + +You can compress with gzip and base64 encode your responses via the `compress` parameter. You have the option to pass the `compress` parameter when working with a specific route or setting the correct `Accept-Encoding` header in the `Response` object. + +!!! note "Coming soon" + Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose) if you would like us to prioritize this feature. + +### Binary responses + +!!! warning "Using API Gateway?" + Amazon API Gateway does not support `*/*` binary media type when [CORS](#cors) is also configured. This feature requires API Gateway to configure binary media types, see our [sample infrastructure](#required-resources) for reference. + +For convenience, we automatically base64 encode binary responses. You can also use it in combination with the `compress` parameter if your client supports gzip. + +Like the `compress` feature, the client must send the `Accept` header with the correct media type. + +!!! tip + Lambda Function URLs handle binary media types automatically. + +!!! note "Coming soon" + Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose) if you would like us to prioritize this feature. + +### Debug mode + +You can enable debug mode via the `POWERTOOLS_DEV` environment variable. + +This will enable full stack traces errors in the response, log request and responses, and set CORS in development mode. + +!!! note "Coming soon" + Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose) if you would like us to prioritize this feature. + +### OpenAPI + +When you enable [Data Validation](#data-validation), we use a combination of Zod and JSON Schemas to add constraints to your API's parameters. + +In OpenAPI documentation tools like [SwaggerUI](#enabling-swaggerui), these annotations become readable descriptions, offering a self-explanatory API interface. This reduces boilerplate code while improving functionality and enabling auto-documentation. + +!!! note "Coming soon" + Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose) if you would like us to prioritize this feature. + +### Split routers + +As you grow the number of routes a given Lambda function should handle, it is natural to either break into smaller Lambda functions, or split routes into separate files to ease maintenance - that's where the split `Router` feature is useful. + +!!! note "Coming soon" + Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose) if you would like us to prioritize this feature. + +### Considerations + +This utility is optimized for AWS Lambda computing model and prioritizes fast startup, minimal feature set, and quick onboarding for triggers supported by Lambda. + +Event Handler naturally leads to a single Lambda function handling multiple routes for a given service, which can be eventually broken into multiple functions. + +Both single (monolithic) and multiple functions (micro) offer different set of trade-offs worth knowing. + +!!! tip "TL;DR;" + Start with a monolithic function, add additional functions with new handlers, and possibly break into micro functions if necessary. + +#### Monolithic function + +![monolithic function](../../media//monolithic-function.png) + +A monolithic function means that your final code artifact will be deployed to a single function. This is generally the best approach to start. + +_**Benefits**_ + +* **Code reuse.** It's easier to reason about your service, modularize it and reuse code as it grows. Eventually, it can be turned into a standalone library. +* **No custom tooling.** Monolithic functions are treated just like normal Typescript packages; no upfront investment in tooling. +* **Faster deployment and debugging.** Whether you use all-at-once, linear, or canary deployments, a monolithic function is a single deployable unit. IDEs like WebStorm and VSCode have tooling to quickly profile, visualize, and step through debug any Typescript package. + +_**Downsides**_ + +* **Cold starts.** Frequent deployments and/or high load can diminish the benefit of monolithic functions depending on your latency requirements, due to the [Lambda scaling model](https://docs.aws.amazon.com/lambda/latest/dg/invocation-scaling.html){target="_blank"}. Always load test to find a pragmatic balance between customer experience and developer cognitive load. +* **Granular security permissions.** The micro function approach enables you to use fine-grained permissions and access controls, separate external dependencies and code signing at the function level. Conversely, you could have multiple functions while duplicating the final code artifact in a monolithic approach. Regardless, least privilege can be applied to either approaches. +* **Higher risk per deployment.** A misconfiguration or invalid import can cause disruption if not caught early in automated testing. Multiple functions can mitigate misconfigurations but they will still share the same code artifact. You can further minimize risks with multiple environments in your CI/CD pipeline. + +#### Micro function + +![micro function](../../media//micro-function.png) + +A micro function means that your final code artifact will be different to each function deployed. This is generally the approach to start if you're looking for fine-grain control and/or high load on certain parts of your service. + +_**Benefits**_ + +* **Granular scaling.** A micro function can benefit from the [Lambda scaling model](https://docs.aws.amazon.com/lambda/latest/dg/invocation-scaling.html){target="_blank"} to scale differently depending on each part of your application. Concurrency controls and provisioned concurrency can also be used at a granular level for capacity management. +* **Discoverability.** Micro functions are easier to visualize when using distributed tracing. Their high-level architectures can be self-explanatory, and complexity is highly visible — assuming each function is named after the business purpose it serves. +* **Package size.** An independent function can be significantly smaller (KB vs MB) depending on the external dependencies it requires to perform its purpose. Conversely, a monolithic approach can benefit from [Lambda Layers](https://docs.aws.amazon.com/lambda/latest/dg/invocation-layers.html){target="_blank"} to optimize builds for external dependencies. + +_**Downsides**_ + +* **Upfront investment.** You need custom build tooling to bundle assets, including [native bindings for runtime compatibility](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html){target="_blank"}. Operations become more elaborate — you need to standardize tracing labels/annotations, structured logging, and metrics to pinpoint root causes. +* **Engineering discipline** is necessary for both approaches. However, the micro-function approach requires further attention to consistency as the number of functions grow, just like any distributed system. +* **Harder to share code.** Shared code must be carefully evaluated to avoid unnecessary deployments when this code changes. Equally, if shared code isn't a library, your development, building, deployment tooling need to accommodate the distinct layout. +* **Slower safe deployments.** Safely deploying multiple functions require coordination — AWS CodeDeploy deploys and verifies each function sequentially. This increases lead time substantially (minutes to hours) depending on the deployment strategy you choose. You can mitigate it by selectively enabling it in prod-like environments only, and where the risk profile is applicable. +Automated testing, operational and security reviews are essential to stability in either approaches. + +## Testing your code + +!!! note "Coming soon" + Please open an issue if you would like us to prioritize this section. diff --git a/docs/media/micro-function.png b/docs/media/micro-function.png new file mode 100644 index 0000000000000000000000000000000000000000..74887bc77269e2fd6111f28201ef650f472cdeeb GIT binary patch literal 86833 zcmZs?2UL^Y5-u!=f*>f;q)Kl}NujB<011K661oaPLI@;42qhs@snV+oh=2-;iXcUh zt{_qbk)lW!P*Le3z1=t8Ip4YeUF&zrTXvbf_w3m-&&<4uw=_p^vJ0^vIdX&(X>5o- za^z^{kt0mYY{!9;uCzpW0v2a18K1qQg-1Aib@XONn+h63=YPbQPx?A%;U zJ^W?Ba5adAGDICHmNzxFHbcpP4S;8o2hk06P;A4V4(#f7Tu;R7@WsVM{Pfg%F} z#m5V11lIy7t13gG8enCRIuxk*zw3j8Aj;~>AfOE6f_I^K{C`GcEIrVT;^zVI;UBL2 zOP5jM=I`SEpVB}zZ-0_86+%Oqf($VgePAJh6uJuyW$fc>K(ayr-5|Cw zdm3;z2D^FL;Sq)e9M#(t5{MyL`B{>UkYt)$fRVatAk@Oz0A~eP)wc}vAo_r942``^ z0EWYmK_0dkPjsLGFa@|7%v9aLlWgWgqB>e*hy+tBRZ|-}!PCM@&6@-_B>4GaC}uP- zteUBdAI-ssMs{__IyhqNfUabFBYy-OOtkkgw?qQ(STr(F%Zx_#Mfe1fVSW@VS6h7} zTQ3mW($GuaM-64=OVAARcl7i&Mv+`xAxJz0=jsv=04G^{00Ihwpsn1zwG7m4QU2C0 zV3cbh+DlE<%f*vOGR2S(Mw)b@8y(?bkA+*KiQaTWildJY!U&2ZXxSS1!pZKI?r?Vk z28UJk!H_jP$>vZp-Ne+u%K>Mk76efD_4L9TqaC5{R83nC2e_AqosAb1?+r3GC)>LQ z_)>!)rbIFZ5`fjPGE_6AJL0s6Hkvd$Gmxo<1If};%huK09Ztd1;rg^7Ykhxn^&k^< zcLSV{TabsVxs@w{VyfxlVFV0BG&P0mySf;_J&2xw6v6@s2pZkN9ct=fOarFupzrDE zgYd-|`KlugjZJLqDb^SxEXmHz1#M#(Xm4k3=>_l-X5<0~d1`tDdE-nC?L18|wr2jO zFh^f6vcHL~pA~_s0q`3Pved$xc_B1C0)kKooGIB5ZES-kd6Hd8R97g$)Z4(+#nQyf z(^%akkfMn-hk1CDOg#uzt{(af=|O1_>7HIL7#9#$6L_^ZvH@sfU_MxNFRV2gkEas+ zE#Nd9NzK;E(gLV*ha>#R-s&hve~`OA4(w&2rD+VZ@+2CW(di(lX&_olpW1TY)U zAfy3k0+?5jtG$6Ql5C(scE$U9Kvk(hP(W3{uttav;-41Z;q>3x*8yHSuS30*C_?y-k6;DjB9`jE2EYEIbe-FwT#J zrTPZo42ejRx}%A$5s^jgX6I<( zV1yzWfc$-Z98JxD8e111s4asXZmKSBBy|dzLUFT4SlH7o9E@#I2s0!_A887M(+NOZ z1j?66#uLnaX*NiNr3)h<9}(nxGJxXs`!x^5JxZ zJr%45r>fg(s!{ckK~x`AvWA%&)CH(R8VCCM+ZoXctPcTUHK0U0npF@PNkw6_Ks3C) zp{1L@Iw6SQ=3@gv5!G?75Jz`E7e@*aWnyn-;7S7f!ySXDc(niq+sMXP2QLp8%pYXM z5Ggza=~)7#iS$kY~Yi!ru0Bhqd0G^hs-MkTv>xqv+BWSqSV z+*Zw2lZrxHII3C#?JX%#8z{jWIK#e1jB`kH_rX{gQPfO`jvzOG1fbesE*9RZNQ9#m zJ`k`;fFzjuAT6!vz6Kx-69XfZCjqbT54J~9fcg3Xf0ibG`UHrJfwdLX%H0*`gE4?p z3^ny_HJ~P_0IC_1;07217y)8rYk{y(gVQi{0>~R}fXAUp-gHNd2H63i0@H*B85#r; zy)0a<)m|ISQyx|CYYXf7jzd4=? z4${Z@y3*YN+YY1BfJwRG9e@J?^Y`_)wr0En&sG{#gg@O|l}yAkrtV>iQA68f-~?ZP zTf8sU*MX=-B$%i}VBV?(vVkhZC;(~)cl4z~9o2jp)&Y#yvb7)Nu3CoH2nbr; zfU2pcWl5tN&{YE&#JuTLu)CQLux>ci6$`Zl;qktPNH+s3Yj;gMTX%$(Ux2we&Bfl! zN&`j5Y5Af^#!v!a2k~$)mSP@YOH_rRjHv1;H8m&>m^D1mfTo79Fj6)5LAcvEXc*f$ z`02YC=xbsfOpW!`u{N#@dA7E-FtIWO!%PApwqUFQ%mq(@LR@|Eu4sElu%Uebjq2#f z(2R5h93N<+=?Y*1K<>bdtGS7lnz@$0mKxDFfC5)F^)?~f`5C%G&9Q;zFry$hKLVg6 zVfq^8M7kB;3ItYn^#kL95<3l7FHMY}nJ+#FWba6$`I+O@{ITXZ3enWS5{+Z5-^&-} ziB=0VvM0J4s*&k144}&x#5}Cv7AC->pS`uIi#rjF0DIWO-LwL1Fvd0z#!fkc0vNos zL_302VVa)a0dPMXOOPj-1OPFZzrjD7Y3vV$;_ZF(@fwssG6CbJNv4z4Nvtr11lZ5m2aqtpR#{nV>6=jD?!b#7$`i)W-Cmkjcz1%CYarO$jq0t2 zbMV9?T)iyS?bNmGtbKtI;elF#mReQ@6k8Xlt0&gN(A71-7zDLMx|q6HAbcF`Q7{-@ z6KvoW07NDwW zNFzd2Epa}E6b#;l;1+~2_Vdz$T6);giJmaD7FgXqz}i+HZEJ)vhX*qB5lvr94TS@^ z0}C>Dfl%$qbaM|79^{Hshx!CsS)zf10Y_tKIIKN`+4}BiNFdc10D!>DzZmczKnT45 z7llKNq>dqP962I>1Zk*mO>8eOtMQ{&&g-+M1jOf+cR?d{oIjhTSB z<3EHi*&Os}L3G@Jf7e}D&N9IxxUaLEz2O=a()`BJnP*g+8M zt(E!DU~P{BSy>FLH}mc!Nx85zo@J8FbZV??g#KrJOmIDRrgW5N+nAnkzm>_o4nd|q zgt$2GM}oGlc}g1h3NuSKivC9S&zXNY!sO0<9sKJ8<#HdE@lbK4?MBc!W|VA`k42DC z(h;fGY^uyj5hS2ncWeURGj^crS+}`wo>Rn;Or**eLnr3{G&v&m^#Zez!(*%5aK79K z$B!(Z{63%T!?Ijv1!kCEB_I+%EcF^UFkhQ3(8(alplmE|nZ@xl;3SXKS5Y?AoWCid z-)yW;07Kcvd(DUo{&&xqG$etJ$zLly)VK@T-?-%-+43Z|4eO%Jh8GgKOKt-_OK*>T zNW}lU%RQ&BgS%3r?ue(|trp#xK@lF->kE&3GPP}gf1TyB0AoH48X|)K&byEcSktFB zIZdxbfhzB~Y*AHaet_sV*2sT1v1Exc$dX0GaA`qT(J)Cyr6@uCHLfyeT3?`mFg z0^PavcRx2QOUY>nERI&U&L4HA5Xy49DYIAWHZXgBU&Wz9oculcPw_Vsc3r_wG>b@S z+$E=hetQxB<%ufur?X53#57(4bE|fxT4x$JcICZKF!$NBH(SEC`=tV(dXtDnS54dZ zH~+S2IET0s6IjgxvwYeTQh=rUS zqb~fBe}GLbnxO19ZSAMFsJgW_(A?nV@EjsW=H*>&@BB97 z_H1S6MSlhk?VT6Rxxc!;{?a}puLp-j#<$@@6M zT5D^x)U)??gFc8>&%y0C9&do zjJwO?<9XkukjRzL^8AVD0?gF8#1EolQSVv~eOW)qNwc%uo(cI~flv+pZOFpP>hN}? z7{glaHNk$RdEfkF=t^@##a5dj!LlX4&^;CPsM!5_&nx8CLC3vUS^k1%ccJeJnN((a z^^cM=NU1>r%rK_p&)C*!y|YX{@QAJ=jb-KX;{Im0da&W1d7-bN?r2pQ0g1m!j)C2Qai1JoG(p?%)4mBd9{ zP4`@cfEaTo@?cp^s!#|JESsoYQP6)>i7In`oSuzbrXl^enwJ!Ayu`S-GRDu+(J{ep z>a0i4g-2I4<9QyNKQujMaGTOU{tFhnIPcRU0KP5VviL<72T^FSFZbqkd`VEo?ZO+i zxvUqnq;=ONBO|N7gEO<D(+Up%HnOSEci7z?oG)lv+!uvTXG5 zrI8eK(b4Je`fbrLZAs)t=AuIR&HwFjGJ`8|DIx}sy+dQx zxx#1FrnBYZgJl2w)NNreDx2*MC2#%o{oAl_ySK7_{G`wh|LqITN;ri+vF$NhUq(uP zzBW}XCdLT%KIx8AFy;l)p&j1O`92-#vM?h9_5S4Wu}b;1pOPAt{5gA5JbfHRnG5|^*D{>LcH4|gwd;SM&qR(a>z)TQmocn?4NH*D|4w`i zxBRPm0hu5q8(WILUNT;+_RJH{vMViP-aTw(*P2iF>1=1eINmMWe7V!o>J~U4t74b% z-BALI%m|VZQ@S{Q0jJX2bguuQSI;-^=&>5@q|zk*Ut% zJN&hOUyVG{4aQ}#FD22bkz|WO$D&T0ZJ>JVyzs_$j+|I~$9et{=}gJh8osk`q^ium z;PEQglQ+AH=9V}SKLQv=u3qW;vHuAzm*hVdkjos6xR!t#SRL>VT|N_e|Kw;ib?VH) z!G|pcn7&xXe#lo9q4Cg{Cjrbrx-lA`^UDvjkg3yQ4D?Z$B$jlq9C2a;N%5F478L)YzO0kDX}Q zQ_jgLnys4gokGsO``Xms=9SSEEJnX7-)Mk{8-9M(wPNJHgv8JOUcFdtG=Lwz)sQVG z;{p4>JZ|U2C-wCf+fVdn)WMfC04R!nH||57$dS7M2|d~!tQpHnp~$xt+zn$%uh+q@E;dM><%sjmrazqR`& zw4uKu^vX0>arP75F5E+Y(U?}K;ml7RiI=B9a!>aUH;;UNZqKZ%>x}(`xp+}{tUl35 zUpT#IB-npa?9z$BxgLSo!-I7>|HW~uSEo#<0>dGH>d22F^W9q0G-Wpz1!3ZO$jIU& z;TLXg9c*0et(SNnU7to9sEw6tl(ik*oOH`Gow{avIi_=z`|SRtVNZ60-pAdr_s7Q% z3MN|}e-ga9UlIu-gPnc_wEsYnoM8zDG^)uGc*{mpVXl7`eBTt5wO`9`W~m(w7p~-~ zkzPxZsJd?Y4-TyV8}+eRv|8)Y^NACqH_g>M{vPYadu+!OcD`}B*i;uMkR9;?51{LpTINOO&g4%&vSmxkuAOmo%u9TbM{Ce| z$t}8=!spiU(7Is$MPGvJx^xIZ#a|F{=e5pxVL95LBhFrLzZ6Y z$%Y?%*N}L)xp@#CQ%4;i70~ro`wf>Ssu)+8^pHh{Y)y;RD zggtv!5`57zSD)UTkI(oY#vRetnu+)ILnZ0i7y+=(WD;XCN;uNcEevKN4+xF@1v)G2? zG~u4guD7f!UCg1+*MAa-&sSC`Yw>ygO|7r>c;aP>G43B8*gRf}Y!0drf1-w-Pi4NQ zujOnlvtjbbrrLW%SjnJ!MmGaAi3HVDAowyY`fYxi$24R_MpAIH_uv7Da9dtA{Wk3u0S1+KHS}wvnpU zxr)#ZWzz1n-2E3P@yySg%!pIrM+aq-ZTJzFK9?@rhc#?N z?mJ#c`~zrkYcWhsC!2LNKrT!NaH9%M7_NW`DYH~O2h|;kRFk<+CvO}hw2c)$XlQ(T z?3*mY{X;&_lGs515Mb&>Yu6WL<_RTdrWZ!n&WCOJ-XSlnzu8@S$9at;u!L^43#fgA ztE|^$Y7Bb`cw|r1XZ~>}^I(8!$GiyoCJpF}mr9>vP;~y^BFPPauk%Y8H=-#P!GwIqjmT1o}Ix-)l+ea7Am3kX4 zBy+ELGx)H1@aOkgrgD8?s9{pEi$t@K-j!zdM|YlAnp}wcha}ekH_JbuGF`CrJ>dD6 zGpsT4D@_Qn#wCe*R-Zk1i_gUrIG>J`^sye+3dV>5v+BnFE;5qMG-vJ@{Ga>v|L8mr zGhGzGDGpC{fSu9CpUOeedu++#CV*N*D@c!UNr^M84f3Y_4L~X`A7_X_6`wL|D{jDz z?H2eyjZ!)ot^l?s^5|+9V=aebYwUtd%Z#;bF34meQ%ByPxhB-j4*AN#8M1GnEvw8G z%}o{pXqg*y@CY&?81ApUYiS>_s#|eKGP}CloILtavbW$vYQg>?d6O#q@Yli&c5^m# z5=$i6Ufn~9?be;u(b01d+YgHllv!# zJm=SY?uI-$ubta^_mq3YwV5m(k`njM0XWMsT_S~$HekfHRnPj zok^=>^TF4d6TGqoamw45P5xAh9G&Puh-bAH9Pd5-xlAJxJEnziJ6av^E3WXpCi51n zRO6>3r*7UfIL&^=7oTyCMMY0s!{gH5_MDIKfLWayrxyi{EPaUAi?}~O%On?^9zxC- zgNzi;m>iIdM--Dg9xlg;KRw|tt9{7#jZG9*$e!Mnu_tol@{jg&dQ0)4AFstz2~Q}u z)YLqsN*9&b;^&h-@@q(_D#DkBOa`%F2ak_q)E?ZxQH>Y_3S(;b@20KJ+44S;zS!u}%;dP`X)rCot2ln^Z$C?6k+^`&F)jJx zf{X5S;!YtvPN!s|LD#c-d6tY?$^#_v-p`93ce{!*U#~(f7_j{DB3sAoB3lVemioMV zGf+g^J2cgTeYU5lW09Tp8#{Bpv8>UVoQ-(_`46b{myLz+=cjoGkGJ;0mAH8)Oypl+ z?q}W7zvF-W81ivU!C$%MJ&6&jGSUBM;%L(j$F~6R!dwnxkjlX1hWk33PA`&73mICMBg-XiRM7ql@+>?%SV*OTJ9ir$~DWct5?*#3|D zntak`e({HAkFgLY%heOTTF~!x^y7ZGehJUBHybiqH>aFSpN5;f2@Ka{n-JrASD}4z zVYl+gh=NQ)`5OJ{@S_R2$3uqK0C2YV+qR|n7C**q(0VJ2w@pPArgo%^loOY=d}r*h zfV~EPz_Ory(1>=9Ja6%}cb}GZU^_l{y*{vcg&qB^ds*a-*~QN4k_e$pueWIv5^2=2J=GxW|`octG)Wh$3Y;p=*P_TAOI)t!VpjI7z(6Rzye2~W1b@Acqr`Ff_k6l%V}~6*o+XtI2M0Bt6_#_W`_%G0EWJ%vWAEso zqaixy)&nZB04bYkv)lgd=c0I_WX@&CBJ!g)lGv|))1Zkpt`PrtEc$*%8~pM7K*n)xhF(Z_1{ zF~U6V%cl@?Hf$w&vK%Xe33>B2SB)03>ST-sJC{tZ2Cb5#dHV@WMF629LFwWPF5@z;J#O-XIvJtmJrUJwXw+I2=u z>^k|q&rO2opy~yj5zjI23jTkM>ZnzO=y?in6BwBT%=e@3=OY~1@tOw*MqNHV!@{_%&NOzu=e<02raF@cA zulPrdl1<^ZynzyL?`M9U3-nB2hp;`ausxh1AP(_cm z*u=F6UG?u0ruQ%1>O(#6#i1vZ+@RWGaDm?JOE<#XNKm_#It>q z^@?lO7XJF#X@Dg^W;?!XwfgL|H^jKIn=j45y^i*0rc~9u>@hrJ zwYQ&m)pDbM^gtd0uFLN%;y4gZzVo+uuXg^SQQyIRb>w#^$y<1;;=R?w3!;8rPbp8r z%js$~kXU?#aM!mO86WZauVs|?-k?B8Sf1*qT?|y|LvKp=JmqAAV40@NQc_ z+3|jR@ZG!`IjZZ-)7tdax!UhTcU$&zW^9}QR6W7RxBegZfFcJld?H?X4A0Un1)!qw z<_lv_bTSRaf_2V#78r^_aFSjVnju82wo4M*+#Juqy+10g-+Pkbbq5LF05b zxsF4-0j>J&&SdcEk8{qkI&w_SZp~~Z{iyyJnG3=_MQSm@~fRS9!Q^#VVElj>r!^ZC(L`N#Y1V{hip`loX5NP*aWI|WbnM=hl zIAt^0k9Pl1Nf*7QWCkw6u2iL4nBpQx6xN zfBdl?<9KCGw-~{dnB&a{O9~rB_Af{`xzhkBA+0N!6j9I6acg?Gfwa!Gy2)iLly$Do z6hvNR@sNj9L6?kd@$P)nJ{yy<_Ixq*;K7aS=hIW_QY->!&DM?R*|Hsp>|(i@SwgUyUkfDK?<6CDTsr?Z+`Wv8m0;onu#3j=#kXe44Nd3}a*+t5o!a zCy$TbOz9SK2i(wZhBGNh4zyeR2kWj_{aDvY{qcPxv}`I6y6|S~u8@$1)GAFPY%DGD zE%t|Y`Gs|f@yM(iM2(K{9mQYH-T4n^XXsbgEm(GMBZ!4R)_<2%7PWPy61s3N!<(8o zjudx&Yk#>c5xUIJktVsTb0gNGasD)Uh(DUGSRTeCCa{D`2m}mDLJ=oM$<<@$2RQoW zuW8GW4~lcnnv!XY=xg~g@vmw>OB6Y{yZ5rMWuxj@3T85MP>Ng%!li}`376bjsCQ&Y z`1Z0z(3b;X1xZEO@fQvUjhj>WW*`!ogr^6d-GtEspXcS(+K5@J(Zj^52dDYwQw?*r zF6%~tGjCJPpMB@~khmelk|mw_D?B7Qk$3@#C6g{eMQhH4jh>EE^%KY`66ZSgJG$~r z6DWU0cv*k;j=Lsr!TIhdy5T8B>zE6up#|D`SJqx?`vsFkKP$(lN12IwJS0t{R&)@+ zB9%tEUxZzfj2_2_XmECAaDNMP9vU5EI>n8ks{H`mvJUV0Pk3-(Q174G!l!oJ(4}F*J zsMJ)(p{HZ0i*fIc;!U5Nm_-Udk_Z@-TK6Wf=nH{jfA3z2uPiV#qh5o_7^lUsm~0nz)mfQ>x=b32=Clhy%Nfu;G@byl>cM4h!4|96NKVpC@yq-Pgs= zM%HhdWLC^1;Y7lB0~5D?k8d*zUB2A7@?rl>li3OfrScYl zWf8S+ymkPabzDif>;mJ^@c&t;75c}c_dc;61XV?z+bTqrw0drDH@O)R`rPo#e0s$0SSUq}TI#jd&b6o3+Mb$nRAhk>73a*S;$da%BQ6!sLs@##qJ3h~2Jl8zLdK(0#hIp^0&VjpLK$ zqF+_UvOFojUMw{|%h-w4NgdcI-F!11Rv_2fzgv+DzvZlsbLpECgz5IU%MKgO);xMY zmU(bjeCwg4W}kVPdmbiT8;$nVcD+nl1m%=U`iRH zn)kf@N!!tOhhcJ1n>B9fu;1kp=T1w^#o8-pu3mxrBOm*E&KzEd{jIHfHemVX<;r>T z5iWC04Ignz%At2&akBS~+sod}A)%txEC4K?&93u{WyXP52i(31+>vnh@f_n5#L?AD zJ3No?yq+2+Ba2>DpLB?M6!b>u9Lw%q<+LLHEFn7|?b|l?2{ZF;2hDoDdb>JWVsa~W z%}SmN0$vo9)G@`&kR1QHaHTKmQrB-V9NW8TIi>dRyyN+JZ(a!9Q+AWR#?znwlFx59 zRO}RDxx?(3beKayy!QMPIoXv3-fouM%r1`B&Ezo;Agcy)A_kk3A(9ZvIx2nMuXB*Y zViNg_@obt%S&nk2*ImAw4y7f5<%rY!e_6iUB3q_2(yAc&`jd50a3!y{9|Wxr8DB>s zzG2hzojR2rny3!c6^m{C?&1ftz`^UN+rEwP6V}!c0KNPmE5ki>-f}F}WW4&|4`~ zwl&f0*4I8(wF*YoLFdGXRKo-N-EXwZ0_U1ikJsg@lCnVq#c_@Dm&A&7ia$oH{rGI4 zEYX!I$P~nIKbIc&e9M4#H8cDrYdI0Wfa>yxFPjM}=Z#Vg8Ys!ELVnS>6dmz$l^V;-2YbnDfzEyQpG#-s%xhziqdZ8(5o=fNEY4#4@1wy% z>Y{#}S)05s_@yjuPLnfGPP-mT%09Us6(%y387Zx|L%#{+Ics*h3W-(~&(@$bsCeBE zALt)o&!-k)!YITAzEcUi%=N1!+(U$u7|fB|Trng;{C_aEfuF;O8JoPJtZsJI zS-&4WzL+%9=eyjRG+CzQ^6lfgVJnrU?|aNfxk7zqtF0!s?%4dx0S3}iGQX9CA0LjL zx_HLHakuPOZ9)dmqP)CUU%zJ7#^HF@4jin&T447B&|_Ui4|m_~q+?LsdbYf%E<4R$7KxT!}y zxbmR=OE2Y-;-kz^+NlpJm88%!o1ZU6L+3Ayu>u)Z%O{UZ#B=g4QOoGQRdVI}U#A8I zfUsDv_aE3(9%jX~E)wZVo-FSKcf#^bs_b)}E14<^p-+7ORs1b#Iavunpg4e@{H((< z;K}ZN(-GF>a7~!-MrPB`$hWha+TX1>_Os`7^`0-C>a4k6k?6qtV7Kz*pW_Ou`OEj%CA)}b_PovtgJX|fpmFWmmW zal;$k2!UA+Qqy{XvfQ{i0BD-s;f zF|+3)l(+M&G>U@k-X>o?Pb@>52n;vJ{cXCE^aJX`P0-#B2I7Udy6a#C4%vWPyyBU= z7S3<8)y68mM`;Wt-)jmw#w?)X#G7Iq4y7iT&QD{@l;3m!MT@gUJa$UM`09R2 zj8mqBspZ3KDqVFZ3b?(Oobl%oSF)wRs3Q9m)ts!T4En`mcAF2RRZcLy0kM_1Y_*p` zfats65G{ofTMXkrd*f+5L-)-;;Kim3SM(Lx|Ap`E9embg(w8)S)*+4jeWj0DtE~{e zv~k!v6#I`@-|!O#bbs!$G{TFO$-T2k=MrZJe7)kum#telY%SAECLP-=h34|-`-Nvq z`d4)cV8V^kS1HNAIYMiGDbtfTn)-1ot`2^;EEP>!B6+Y&FH~&~@87>!Z|XFC5)hAt zNQydzrxsQa$~3y7{t@o)KdPFEe0+a4{zx|J5B4>iwHb@Gc&5V_la8z9!@7LSD97*` z*-Z2fde&qt^UvJUx_u_{2@NpVy#g5zYf>X1xB=Va&wG;!rk$%&6fGYg>`o6ekdT?dcET<3ffn zy)wQVD}aM$#${0U^FerZBA+KGn%T_$LhbQsL=v|p6O&En zHw_L<65?ty@eC$txFvhb%Wv8zE9dI^h72+k`x_1YiT_tH5(gjrBiD^PE+^e(ZD=>X z#L(F^4P;fyL=*ouJ<>_>wAEDtBDsT@okZ3>?x9yoC8F{2#r2m(g4XaHN1m`*^q3CH z=qvSqpZRjr2{?kn0c}2w!pY7xq;N@(&SNn}eR5I(oAigr>JvxtJIdSqp=uGIhf*yM z3_n{7F%@@8ujdqf7QfnS^Go!p*hZG(YpFuM)9eIPQ|mL<$VL-*A>}kf%6EgiQIEbn zpHZ}xc`56>@wC~*24piTw*G)Lp~M^9^5MvOsr6XP&*k~f;?RT7i&#glP zN3C+c-~d+U4{2S%BBG4%$*0%qB*&&UEvBq=k5tQEDPma2p{4bkRvI2{(4wWCx31o6 z)X!3{D*R(tf7hC(H3p=&kAKG0NQqb8SDb$j#FPbYH+oDzTP$_fYp3B(WFj3@pWJ_o zLvv=0#QiU0_!`3S)xxSiTEixtVtoc`_?cmbw{26J39$Eyv+^1SC0R{!9qOk$rMqS% zPQ0Qte=JQXeNvJJ`Z~X=_}%&Hvgx3ZU{{eyh|^s}4iE~=-yZd~HkT?KX0i@IKN1lh z5#Gu3e;D{T6KmDbhXuP|Du2`va=S8vKgXaFfA8J}bBlMYpxP^%l9k9Jj0tJtO6kNi z-3J9?Drz?AzE=+JCfg?i*_H09J{(%iT#*3Ev1Y;rO8hT-286r;k8W7PjtTb)6We2>b@Un=r%Pc3^xd5@duINvmi;wf{t zzd<)U8nb>iWmvEwGP~U3*LtJobMD;gQ@4}*h-*Rs7HT_hca@}RThdSXYTy>{FrJ`C zp@7ZvFUNaN)ayU{#LSh3{2fQzT36;@wMrLKw4L>?YxKQXws_TjFgYMFL$L}SV`~)> zvj5R@rk1T_&=`y&>gt3ERo`t8Xuk0VFbbBM7psL$*iql|mtx=>p;z-gWHbMe(faRm zQFwRvsL3W-v)tEHQ_g`baeYp2gU>g=+wt(}%5O_Zin#f@F50jsuZ4x^o*E#^tMlXc z#aPk}?lgw-`ZIs5Yj_tfBy4bd_wsgwEv(Z})-J_7Ye+*?b8a!9PD0dAVD<91|C7wWE%wI@V0Sa4Y=^6z1c!?kGM* zyVOf{f-X3yWbe5vACmseIWNNZ7v+}}@Hb3e$4xaSUu z?wit?;udmlQ;}Hwb!p*CqO814uT2Cnn1HrmBd^6jX~yzp$ZBsSZo2Hgy$yoI>U!{B zzs(L;{!CALUU>7zAQGv0z`CE>PKMhg`K+|cGW$yB3>`xKgNj?XLXXbh-;H`1y&MoE z!+gInr0lh8^T2!spxWody}~XC(fdKe;RoBSDouaSaGld3t(vbdjtS@akz}{ zvjMK<$}kt;L9r5!o?m*H8@%K5wlC}rb6nuL1E!Wj)mm4-@9(vYN1C6)&V3%~TH|m= zY@}hvzXZxcs?; zzibC}S;rw+)1yH4=D>w;krk2svnn+h6NW&0ZH{&3LT?ARANW?yClK0n&iTjYhhtJ zVf*WL)60fp#Lv(LDI0Op#OR8MW1>?zqAiwFf27amneB9pzy)MN5;fW8s$N88=7|$0 z;2eh14HF+LVCbAsn#KneAyVG#!xMUOMvpG!a!h}@=a`qCgvk_xBb{zr$(4Fp6jt+U z$(=k@m8)}HX6vrn+Ly@f54%#ogX^*jA@ zr_zNtv2AwAMLw3bgrudxFA}9=A130)ADkJ%4dgf14Gzp7{z&t?|DdS!WSFg;%G;_d zlpmL>?KKq62lTuwQWgF8+xV%bmdpM;yrkRQC1^%ODeTS-CI23q1xS$gn*08LPt#Z> z0&(S>ptoekC0(=j6bp1Ts_11C0zQPeGsfvQubV^b%C6&m_AKK-N=nG_bocj%JTWI_ zMlf{k&p5Q_etDlyWNdHK!y|q7sFU#pVLK<39IIdFYX@7F=TD#IN9ya}(7S*%1S17| z_|DsY3FXer$k2<<{Pyv_L585|!0vS1Ir8R2tW;)BPEPB@$T5zSoIm2YMA;?lE>V|w z4_1v3F1wq{sTmn(B#1k+sk)INleF1n+R7W&n5mUa(r7i(-p({=AZYYb7`Tlmn`BOCweorF3JUL-DM57a>!so{~v(8-Gk@yKtIdbrZ%|}fS`0>Rjz1PQcpnc}K zao1CUjs7eynNxa>KO!{heslX&wch>< zy{o-StzXM6PE2W!JQ17mWOezjduR0%==WpJv|hN{OTroMXhCYnn~RX3KaNf@J2>oa z4)ns#>=~|WpmD^~ST+BX*@8_=zZnMg^?1G5$o9s%G)^fF&ZVa#=tr6gqO7jL8{^68RmH~@LLcb zMvkB*H@tmFW8m$Wp^o%k-j0E=L`XMESvWu+J(YCm@P)gjwr2Pd;%vU4yCT8&IzqNN zJ7A=&!1u1Br2NpS9EJAmg9X6``aS|3JD_)wgJSw3#GkqB?L4n@UqnvDyB>zgR3ZH4 z1HQDKytyfuu|(i-Ef`QlY)`cZE<(z+hs>5YrKS) z8kThojf_sJ$LWxpwS}CtZk^v6q5V_FIhzFP50i)f@cxXV3DYC0)P@F_tn(W8#^-F#&-Cm%&7|!>umd zZSz#FwFBPUav5E2;W94WeFD+T8z+Azd~tNV+A}bHyLdNdd2(s+?90eK&`w;{clFYM zd#CqSTpv?#l(qgW_I2G$*-4Gi68Qf4ijNw9{YXo=ZoU7nNZ;9af~il?;{ft`%c(Jb zee=UN=kR?Q+%Y5HEYyI{oRpMQ%&#nuB5Vz%69+(&7|qA19LY3&$$S2DyYB#HR zp;O-xZXSd0LArfVnfDDEL_G|%L=mfLn;dp+FD@Pat|>M?z~66wrFFkbwzlZ(+6;84 ze&ofl^kdn}M<#Chz3aPSmE7++pzZ*=BGA?kuhn~B;oO}&Uy9ziU*J2L^mfP7;Kg!m zdd3fv^=X9N~q(e)%%G}rD-q^63)PR!2 z$CrkqY-bbs)8BmWl-{m&dJl}&U#kTmETc>K@E&6iv z<0z|9O8sR{^0yCiSR@}vANBFRdH6CJ7UHOL{950GX1bq2(l6opvzCfP$Umv84mNql zw>*EI1tA~3j}275WIpCi7%;B1NG`sw=1mB+gf_5JSTE!*$iPWs>n4fo;?)%?d_Lft32;f)+^uEfymT-`Spzc zdcbdSjJAAs+An=fI5T0z5+vs5vGWcc{j#b3&8JSgTAObK({bV-&KHk5#6P|Y^D>MT zrYl}LUq?R|@^X{Kw(sm*=?R-3Hr5f3Jq%CR=!|jSzY$j1`HeX7z*no`^u(P#skh3H zkECkvW9`<+eYsJQqLSf;aAe8O1@4~s|HIc;M#a%>+Xey&f#B{=a6+TOgEtb~EfCz@ zH6gfmBf;I>9RdV*cXxLQ`ik$IbMLu--me}opt@?y+H1`<=PVcYE(e``t*Ac#F@E@z zqr8cat3}X`l^OndoR%bikvtZ$fw_RDdG^R{kIH18cwaN=8H3LEdwP;8)hIv()Ymjv z;YJC2`~kW!em3#NMkxr4!2{t zKCxFZfDle!cs|0o6rasWM&;NX6Y)J{yyBZgMq?32g7V#P_HH13L+gF%8tH*O2zp8Q z_{m`#0sE`idXxQ@REFSIC`&8tY(?ouX;J90%sd73`Vd`VxF3Y=S#X|YZ308rhil79 zSJJUHRg50c%5Ni_=UifI)uXBX)WOI$m(QWuypuYZ?L+cwc3vf#Jhaa{YxloOtgNaA8 z=k0_cUE3%k+lG~Ln4KK4`J=BK^Kt17ab9z@cDMk~ECuN!25MpaFIoq=yuYy0{<5l3 zCh$Q6VDvO0eZpRJn#$y$0%Z<08tAdB#VifwSJIb^Jzm&&oDrcyI_Opf|KnrNb;kz^ zY0=f}%baejxvayr-wCqeM*>0e%pM0si1t!pPsgsg%+@~hqgv;obMdDmk@&g13C3rf zK@$eQ!*Y#9L9Yo-bVj)A_4!|$aBx6gx_K3}D9A~Kh!e_A4F{!7{j#2w8j&~ z8f^Mt^C&R=sK`%S$>B6XmPIXq_6~iELL{^^oHDSKfMu7rUlF5{Ea25>E8{X}r$6iW`*OAS6HWb!bc*OUZ)8C9*H z*d>4A!bw(dr&U+HzyqbPGeuiTa2#;vwqob9W4N5dO-HtQZ6zv!#H*|xc5JU!ZemZ(*o+Gv5JnH+``+KM`=Z zKBX}-0V;k$-;c9E$3J+H~Lelz|S+69b%crGs5{h;M z<8w;<+xHrHfu=0v&<|gdg_1Y}U}dQsm1B-SdOttjbeJ3rQbm8PFeu~>jEH>mmN4S| zC;LICKSAii&Sw$4$7n&tw90<524o<~IkCGQtY{&OidU#AdQ+zC9VrqN$)Z7|-naVl z zu8Qau`CJyx{obLEaafzHleYl($|#=^tXOqn73AfVsznk#nI z2KHvVouztciLH0uCw9*Cyd}^}vv;8>7|G^;OzyyNOthhe6?LJc!vz0y*}XZTYY`}J-L~x(|6WYBOCa2Fb87!$kQ5nt3+RR$8a8LQGF|RA>kcFmyKm!k4(Y26- zs8K=fPu(089LmU{{%pjLM4XntqJ=_En4{VD$-x@ZXT#YgH;EDEzzJ6%kD~IOy5sim zPTG&cKZyg?W)mNc!!jV$OB2~1(MY(=>=1C_W~22I&j$L8_v4*@AA}lqEN7!(vIruX zODoE_=TVqydhp9a?7I1}%?Oz8j4p-c5XtNyvFkBCJ8!?er_{(YQXWRSXVhwIFioEsC#^GMXmTM?Ayd%>Kg# zh?Zo%E7TsEnnwAxqF>Fy3;`2(JX~Z6GoUCKbkqo6sT@p`iPA8Pr!^n&#XVb@N(c)( zk6(oTBn$UNGz1|h3Ce&j?brt- zHGNY5Lj7dANr$_}(UphF4S;4AoyX^xjAY_KJuW>qA|o+;5)TIP{7os)&D2D_=NFT~ zD9w8hOXceF)GIa&Sugsb=?`0a^xg+&Gsa5BAZ1Pg8|G_f5S>7OPEJm}`&FTBWTk3} zrZCQ|j_?sbiTf^j2HF>U`^xCB#QUsN=;a3*8gbgeZ%i?)k&%%SNAop5T}yrzmP4!v z%JlRa-I`+fUGxm|_zon7b z9eh`gdif0n&Ji2-K807my!V}}mi$08`oi$n2?Y@gG*&h*ONVJfyZ>|yee^(B%(YlxWM02MUfj^W@3abXC$)ftGVyg?Eg+;4 zUoG^sec}Usn3~zM;`N)MV78Y7?7hzTco7I{?RrfuD{%VzweZv|0J`drQ4BCfZyKt~ zzlZ6Uf?OVty|W^C`@3!s6^7&ejWGk{-+T|G*zFUbne(mFqtrh+_3|SkGd{sD=q>z= zP*Q=QAL5uYp4K!6kUujZjszMc9hYGB@#zbEyNpx0b^K%PnCmO#gD00DprZ zA~Qk6L$v79Us!9;xLZ#90iF_ONVQ_LNh;&3$Mos>ub1(#G zk}tJfPo3E;-$~|PP?788)c#I!8bB=y0tT&{vI=poX>AyRPk>%rX!n2`d~0;UQE*I& z9l_9&I%C|EF?Th%i2)opI*YJlL&z?08p$HQ5q0A_;yfgTXlSd+=&4&6u#-tpP@4fd z)vnVk4z+l?z&Dy0JpeOObZ9sZPARv*-W=fcuddJEFt$cE9#BvEnEqmfvd3HglJ1F& zAP~d=Q&*ZZb2Kgb&HBYneYN^j#Zh;>^jiL;tzUJH??F={CN>UF#PssPP}K3ctoTZa zT1{Y^9+lq3LIVmeT$cLTxe1YEZN=PS*6$d)P(UqWbn9y8ePlPqp<2v}sbt|e4)f7cu@-BF1I@8woq^8K zdkv9jpry@3d^4}nZKGsT0Vde_a6-tj=%pt@cxuY#c?aluF2a8+uICfw^92=wz*7X{ zg2wal@1Hp$OpX>#9avW-_2pg9~P4 zB5>AJ)GHjx9>30h(1>I>dcJC43VUI{b;j2kfHXK(z!8lUa70v40CGj66DsXFDcXp&uHBVHiEw^~ou%B&hWDQl~~%y0-h1~5SBkwTWGftsfe3ef*U zKqUzini2(cQT8WwF$ps4%3|0>Df73VO!6dY9Lj;Uh4JrJvI&1__4CZnK|{QC)V@xW zS%|9XpM<``zpD0=*DoW#oqC6K=Ac_$J_BF}aN-=!1Y3uc9<~692j_yg&viR>G4Qs5 zMQgCkX`&^_&8%_gS0&107*c4UdYA&L^u7@twJ24ve4@0e^gt~YI}RWlQh3yj@e+;S zPEI@}a|AePKx}t=KPDFuiwMSJ>5q_5ICfj3)ifRSs@yJzB%#au%B0HH`-3mkzV#gz zSfj)Zc~HVijL>{N4?(^)p8pyjrxta`B_)N3hBk%*!=Y7g82W(?fCAZHC?OVTAZUOw zsWYahgNqZkV-O=#_F%Su>ty|ZCeEikDuF%fCI0HoC-!AuUW^c^Aj7=vGfZg3>k+>e z2KyD5q7tL$WMvK`Mk`SiY>(S_aE(rLUFOF^97tQkk}>az5`CPvt9p4Y_QCrbq(LZ1 zH_{ED2QH^;q;$$MMGX0-j8Rghh}lM#J%rN#L(d_KFW#_*1K1bKnnP1dqg7t7VWm_Y zhW>|-lOE3gumJf9$O;z&Ux;qg7PH)3?SH7m#LccQI(4`Ziuf3!a+Dx<;>Lv#fW9!j z0hF_+i*Z2*cr=7*=+X-SyMD!^GmZfU#_P#w*8yWyYx_VxItqytS!CKTEet(y#g&Vo zjc=j=d$!*(V8s@fpbaD)*Ye$egZr^P3#ZY3TM3Vi-yAKB$~!x&&RU8iz80O z22)#ejmH&Wvrg07+XPD*V4Uk@YVJ z7=d&FX!jTBmcYpU+$ky^1r#YDHD*$6;or0uw#`n}e+U@Sq%}tW+DP*#u#J8^H0qNkvqw%HZ0@50Bt`wb9^Cf`m7{=4|l+zIuX)@vPhiJY925Ed??qLYa3ab zoOS%a=teXQ*2%|vs2_TI5Pku+LkWyh(y%paz)Hwu-xWl3vi2D!_q|{tYELMTQy(lC z%U}U&4f(i~ObcAQ^_C_k$F1w|Y;Xau;OFsfGn|XP2#O_@7)ZzFMenBu)Vt*ONK-{C z%(b_Sfq;Hf$!>kANkLQjYqHjfUwgjCNs*#HUJnq-0;KrG;Crdm98_$Yn#Z63SPt-{ zHYVCF&JAB!vV_K3*NRo}y$?$PnP@Qy$`j-JEaO8#kpg=vbvZ~!8X z2@gD&VTU1L&1fg_k5r`$>*6I&rWMn3+=)b7```Tk;D-c)`??}~C>~t~%=7GQyuJe( zwCr5O4M2j(&G7_-Wun8j|5lV;=%7HbKhZ{dZ&YX?H41=6yIV^nwfVbEhb1;5<2Gu2 z>9_i^0R>aEq6EwTseJQNKnacnJgEq@(**tiwf@Tswf?1X1cl|u4kf>$>hBoeRzJURHSY-oO|avH^~~#^ zGS99)4+%}Ed)v_=Ugj3D*8F$~y8tMjaCZPCCV|Jo%p~HhU!apl6lth;@rcH4(?um<9qI5SMGhfhggrSmxR1I}pKXLp ztB47cJI08HQ4yvg6nUrN`AOyW?4ak$L%F%jAtMBf2@xFs__kku7Q6zrqgI@j)WTZ$ zPfZ`xLdKalHgE6cRkaP1Gp$C6n0k0eSH=btvJ62NX{1r*p4npcvTs<#0b0}+^XJhC zTq+U0Ux;x2b~R#wQ4W!niiYQZ8l-=fJMsgh&7J~)w8{ELM>@@n)tS0nz_C?RUt6nC z_r6<0Ef}d)W4vCq|`&vslG--|Kly zCJvIU?Q4m=suw>N?jYZVzD=7I?XG~i9R<}lx3|BKN8mjg-({p_3@#+~P+x7$S9NzT zKDDrjZyfK)igCBE?{KwiJwLE$5YVx(!O-MAXXY)B)7OBWZi14!T1x1t{ZT;?7M3I)K(HL)8D>R zvPBH2DsGna59lf7W1I-Y_9WJJaQ)LI_pY(0*RXS`RxdZ7XqniPWypf-xAfWFbJr1gM#H7+Kv+8^32Rrw3N}N`aL>I9|$)00h2#iFp zAt1T5vs-dSYAYqG04h3-kw^k5sc0~Vfe~q#?+Y`%|9db%L8E>Vq;U5Z#9wEF-lm9UgkkoHEpz3y%x;BxQZ!P)h2+#2{km#bgffDh?hvDI3rV z)EvK47{PSO(1)jeilY8ghI}T%j$IpF&gH19rSB8eOka_j0Vo+FTE+l@y{q7CKpy!& z6sU19c>W`HK@%fe2(Xxi!>_$8H79qnH)bUVD3d>rF^w4<8qc8Aw~QM0 zV$5Aw(TzXKHNG`x9$L|eTB^1Y}Vc8~LEmAQjJO<#~+=zmJ?6i{#u zx{*h01fb!RT7gALzas;t_QBG)nU$1Im|^=v*GQ-j$09$)IfqNH0@&-|@9{rW{HH)B zQS*xrQ+zz^ErlN^N>dpXjdpwk8ik_D7=+y^A_hJwzk z+Vaw9YE(CuE5av|4tBZek=h`$qEl2ON4lzmY9N6i;K}&_Xf6m8YSs2$$7{?o=h@Ft$XM zy5xgTq%Tjn;X=F!4IpLsS!@XQqoX96ZsbiwscH71Unt1$H5}LPUF66RjSr~ocz-MW zTF>X{IiShbxQQOHf>0DIpHp#qq2PiOz;qhtNg0*`(K(-fL`oG%M*y;m@r>B-<4=Js zK!)fC45Z1RRKLu*AR^Hc*Yu6;OPW?K+`q5j3;-6bf6+VUf6cpS&w)tkRd0Dm}g4-c?7J+3V5`OsZBiz=?zUMcebheTNp zfAn)*(Ebd+suB|r`<`Ri|3V>4M@tywzv5coQ76Hi0@9iZE`jepC5^&D(;B>QGph>- z#;Y;c#hYwXnwV-&HNua+62Cd|9-Inwwjh;{L}J)B+bry0mg!|+W(}Xw;d?| zq;W2)PR1Y&COtD2y=q}Yh5DB3M|VM z(MNNR1DTCT*`L-BtY+n+)h$)Ts5`F!1kvfl1KF(2Qq*pmBi{3`nTY>1rQcOzyQ-y@YUZ%gM(Y62TGyf`M?Klew1TySG(T0?P&`gmImzeG>h z759N4_aD@hJJC#~llk3A-tk-4{+gTPLT1y&5TsM(iJN(b_#;51C^T1iEVUvb$bkZ= zzV>6)Rjc!rPM+(CqTgFADAmgq#sGJN2!=lbKG0-1RT5rqO6GFT#py-M++clY28c6Q zBCLKM-{2wY{gU>M&?SozWqhVKaMQ`Y6JUPs9Q9A`of-TbNcAW^=is=A|NJ?F;I-Q! zX7I2v+&EDrGHLg>o&ae;R~ZR{mUI+uunk#UE5a>`(Yz}K>Tc2L_LQwC3r+)MK%%yq z6BMU6J%>L+#`2^W>gOADX9{v<1qyJ6fY(rPSGw{adB9yJW;;&^6AcA0#uBrvL>Eu5 zeDU+p=&f4W4|z#FQkmk<`Yzcj@5H;S5kw+A4l*6mBqvMrYQT)a@`!)zM>wj?OAS=i zCgh?AQ!)oP(?u#Dk_tQH>UK=iz!DEP&2_0!UfE6y7(91PE?S_cM{4APcqDr5I=m0i zzWqBXkCVnFFwMIfpd2T^*-YDdMMa^K)v|`y$|e1fj2rE-&oV%Lcb7R=9&1~@6@>NW z#b-#-h4265+D<7|T;f9dFPrK;ZPGV5s+aS&G|72>E!=dH0!y?qJBT{ESm`ZjU{0^1 ztn8FHx-X%O*m1V42s8U3bTb+h)vljte;fv9FGsIf#=U%RahO<|oZ#q$>DDSizG@8u zhw`&s*=_34uIzB$^;P6A?XX66h!lJcnJ6Q(8*17Lrt&rJR3oq6l9g%z&HuM&Mp?ZV z=Pn)~uqN&dt>Gv1`##yGps48U8{~|TKi5(9V`~==hD8W4JUA~JQ0ID#k@lkerWugA z!+$l_P<9kX9nI9QeEfJ!k0G~(;KitRcpnMq?bE-NJ~wWzsOrfSv_fkiT#l9Arg+S} zd90Qo^LggPf9ul_U=iYVFQQ`AMQJF7|>yAda0OL z|HU)UUNqmUxA^g7LtbueNllRvb}*@vwtk+Q00WDOT@ z&Dj)E$J{Yx6CZPdi8d!s7Q?~2w0(`YxF(dArHt8ZRjs>M*ts@A zpUkh38mm91u>y{bg)>$l<`3W_nN8!5$wjIKN&@Ad7aMjpkY;@TI2U8`;`hXM?U$90 z^H0f!kr1=XR}Ylo=W(zRcYlEN=d8{K8tqEI@XHU2 z*{Kmf@{DvPXjYY@uuEhxv{)P=Uxw!0++bUq$auis=uUR*>-iZ$wCFm)(B4+L--3Mo z-?%95Pp$n#%MnB`Z_7?Ulzz3XYuD%(A3Iw*X-LhYxRmL!1 zu9u-9bdH{p7eliZOn5lQn3mypdmPRT{zPzmdu9?1W(e|C^=m}IVrEtP|<=kZjoImtGkfx)pGK6?TisCQI18s(^e>+7s;Dy zUt}Q)E-hi{yKy0R@m2u5W0|k40Bj7z!9!7MAjTEKu{Y_%y#gBHX~8nywu{Ayh0&iw zWFS5ScsZHe&26QGfPAR41=UXqu+97hAOD5isfQ=~xgtl{Q$%Yy=-=Kyrot8tUM#>j z3s1Kb_ddDcN;zJi#J=G$|C#U2Lh;b;u}A{tfBWCapHNO$d&JNSH1_{-f}ZNlj%E&a zffu{`lZNa~o?M+SmcQpXA*exQ4?O?AJ0h zI-f^m9RTl>cj}x)oIsGB5>I|qad|n*nufmB+;E*ij{zz2u}xikiC&ry{#`QM zZQNgqbaA#w4Pxv%@ckB&A!)%c<;1r{cvEf~LkyQ4T z6q3C>#X}#q_daA8!3PoY1xZjE>B2~#4AKj@MR~|XlhHscYrp7F1IW$#(DGscpy8_f zJP?2nlk|f6ShogEkrHuTxryR?ew|i}7Hon?1-#|DJqZ6VO6azD9;9sia7DbEr=7Vo zEC$z8E1}+`wF;(E)MkN#U5=ZfwFxpj?}+3s*ny?sJ|AJrw;b_uPBT+LV-m2$nhAQ- zkP+(NMS|0=R|m7}+FGV8y;8r>bRDI`aywqeO6E|`Nm17-QAKggUkL;4W~pC}p@3|%S8EEFv_%W!a?qn1A_%O^^y z$-5&_p}}U~JnXa%$iO*5r;#5ur*$%?9xwK*I* zk_>M}v64qN{b8|?>+it|%lu*yfUAMPNx4F{3I}q-9O!;xf(!;RvQe1O#lo+BlUQfH zzVDWyxfrra7NjW@2Nkq|-qk(98~u<)YzxRfEt14an_<)x>PIMI(m)rWrVp003J&=$ zTBrad&(no~8DPoPR}1?Wue-&yo)&x<3v^rVgl6}rij+{@*`}ZXkA2F~IX1JSqu)n5 z_%JSH&^Kp8y+WD>MB|tnnl9L7yz!Se-B#_{3`b2 zR|P>}JL(uC1DkVDv7G$+#cQ!8%8)rXG?{+VMN9|U{+1DL%V4QZgmRui{*mUkce6W#VLaJ9xx`g0=X zm${8)#7cT`j~{J0wEtD)p$)+LIu^vhJxsfob2I>+afZjI8_Qw7*uYh*VHvFfzYtir zFkrU$bYI=SPfJ9Ln9P>^&5Jgld3BT(Q?vPEliJW3>CyBawr@-=>Npxj_Uk8R{!LI( zM?gK>i*1gZlbdyzZxi`f8&F@Hu9nNsKN6ZV%aR9w^4TOkT~SWYMdWL&oyYp5>;c7C zpEhjok`BDzYS}ai7_311 zbpjp~d|+z`G9%VCHwT=IWQ)3L6JNSzdL&`K4(Re637%+IXz$(ypI%&u+3N4$wB_2Z z>`f{aPapPW$(PE|?UWKlb|Y-E!C_F!k)18Gnl^t&lixSGA6$Nw5axc1z-6=KS67Ei zuf~YV!oqSN7F)2@ugrGMI&d>f4Hq~9XWp5LcigZQ8I@tJu^sLj}()*U%!L?2d^VWEsF>1$d@bt;GuCs_)n&xCF zQZx(4CZs`=hl>@T28yHe*4!cn%?{4YPXF|p0qNvB_LQ-}!T^FHumq{}&|ap^)&tb= z9KUk95H0vQ!y-17HqvF;6TV9%)Q=BAA|efq+%nDUE>-ApEvrYp$~*M-=AKxur=+~; zc54)UvDpjP%*@R6w$0tO!tAv_76YOeNF!JI-QnLovNvIPEO$P)Up%nhp$HdkvwR(q zYYRD9wthwo!Jaz0(yZNoOGQPq{*wk-zDitWr<4a+8^8+_fCrZoIEh?|eEf;H)xUag zRJC;<^HoYl3geF=r0V%0l(-3%>|xofdA6Ed*FA$3@y(mn-(`WUcHOXN-xMdrpG6*d zIK~be#6R)Hbn`*GQ&q5zY&WK@l#At2O0=5E25)yd#2(HU6mHFHb}#iMh`3$xe3H3; zG_Bo4K@vlD2p&<(YRt%cGoPwLTD6+=8E}~OC>^iCM`r0coEO16O6u@sZG*V{e!Rx4{XW{SSJ!TLCV!>L;L<>G4;!%o4M(D z-9*k3U8-LFB$Tuu2M?|?3>Ndt@oAS{Q>=H)VU+h=>px1pPIvmM=I$^v9<0y8h*(TX zNQ4f!obF;OFM6A*JCevZ;>c<3 z6aq99b5m7%o_T&oZ{&vVjE|*pwogo8cJ|10HHI&oX)eV5I=vE_yw$rP;=DN+gV%HX z`?05L|IeNS9;>rv#Ljx~kA<;%qqh?yg=l)A)BW0%%*X~PD+ZRLT)?!A!-(c?z8AI3}KfIb_QaGP7*`=Dx<48TyS#~PXDDIB;>dC0cbRp@&@UjrF!$@HTWh*3&BdJXZ$_R za$QxqGJ6=a4L7*&pWG?>W0-^WoQsD((};v%w{H`Buv+(PuSILO8IZ6i!mhuq!M})0 z@K&9p8&r9~yQ zCze0fSyNiI6QQ01Hi81mbu92(x@=c?sSZt}NC7)$@!)p`Wo4e-++rVvc8&f8mng5) zUCx-P?e+=M`rAT3F9C@l#jMhbW3lN~~tx!umT~6K@@&z*0EZ7a3W*(-yW7{7~aG72r%fCs86ySiCTS z8C=9Diq8@!c1Xz|G4a_aw9_)-Am3-+8@hA{Y08I;-`(Y{*Ow<_*f*3}qi0Z-pAyQ? z8b(YB?Dxe6AhR-tk(|r?Xqn-KLcc&*u}p5yWcVP;(_d#|AfW5n=rD&T{+r`vi_x`s zq7S~U^rufg-Gk!V^HbE^rBuICy{-u`!CqaIBsshURffR$-6mu%*MVJ$=>PYAd5v5q@_h-ZN{u)Bpzu}RFBD=cG+VyBCPu|*|AC}6- zTg}~b*{yEF@~J)c`Z+2_8o`|=AHC=K7@w_MT({*bORvkSg$Imft7L62u3PM1fJpEqLTKEyp0TE4VD>4s;iz+ za#xLI)*yQJP`G)Y-LgO}Eb>Rd9s@c;PXkreF5Wjwe7L0;-=IuCV}2iQV;9fmIYOFB zHj<4dQNKFdmEeR-dzx}4h6pULHr`nwalpm79ywt$Fv8oa&71B0V?YFYDlC|mReWSb zVE9_PS(#9=E$FtoLAw0wp7~g8Z$@NY-Kn}%+i}^WT@o$45S-ms=AP+;rPtxyGeh^6 z6b8Ouje`|PVg^VUeQbq`2b&MnJLvc@fNYHn1P;<}@kZLn9gcpN?XOt0J@QRHZKR8B zb!@{lTEl6kRnHJ@Pe6~ygCey+j}Vtd53|oE-xHy4vZC|Uy(w<)RUVu`%NuXXj^(rh zH6)Apk@i>%t|5VPG-WuhSiQS- zWar4ZJL76&Q)aoeD;6f@9`$x2sxC^m`dBbXcy63pOv>9UzU=d-@Gy4-8y1#|yo8S3OKJfD7=4${wVj>7 zb#k$)M{Y5zV8=Ia-lY5bnFM5qI?C6Y=KOM3U8={X`G5$appEegwp1j+=qIy~1Rf3o zfkZg(IzySX@&szF|gkr5-T`&V6} z{3xtvki@L;R3;aw{6sd8<*d+M-R*P{)m)p)k&nZLTFIc@aZ#WKMNaW^PQ}^TfD@cw zo`0*Z6xAE;QxN!}9hLhVo_@ZVz1c-;l2rE74_n-x5B{{$>%F8| zga6zSX4Wv-+1jVy1E`;;8XE{U|4xtq4O1W$zf?Yqje#Uc!G%ORfvt~1d)~)J_5E)_ zV;VX=l6J#3l8A0g0sA*mMz!#w**6j6T!xTK`_RtO|MJ$H>iWS^{?LqowfqC^UzC@; zd)8M-fC{?v+~TjcvPbbd(`(uxFD#&}Z2HaVpbP6i0hdIyrdA$1;qsLmO_hJ<+n8Ye z+gWti!NY`7#1SeexJJN#*1Cows;rM{D%$gbTa#+cwmM28!&aXBM@D4?NzxS??6L1F z>UZFXJ3@HG+m5NNHe zHj7J#d(C;PKKyLhp2Idj`z=Gm6c9oPf_45(rUwNBenC>eTMK^EAyA2@3az(%8+C;z zPoEsP##f>?92bDr{J^1sI=>ndQ^^mL8D0`CaH)heNP#7YA2l)@VQww>PnC^WSiL3D z<^11x^n;CL!=G<*l*f)2bFl2twUMMnEMck9?VtE8+s#y2&Se^RuZlhbF4PBQ=vuqF zFZFTR)#ltsSnE*VBH%nOH=@OlUw|!32Fk`dZDSp?D34Lsw*{H(y~p2x#{tK8VJ9fd z^zWOGY(!Czn4ZRv_kGkIgfsqk15$R z4)mO~1b_Bw32enZ_f&m_SEmnzkt*uC4tB+Ka0blnX)c<$!gQqCtJ~ zCQ9*mAM=6LYVl+9G-uK8I#HUvt)m)FCQ&BIf@X1`Kp4HKie#dIDwliwnKd&=UeD-~ zFLRcqqM{1vSXX9W#CoSfu?Q5^{>V*Sr9xXF*!IW*3@>i%1L(cdAU8n}B63n2dDx@V z4o?j8R`YyNKq_y1sdi@{+jF{6Rjx55h*4tpdz>=`)PM?rtDHQ~*^rE5Pm*4etiNM% zIzFFVK5*Ks{uo(C^lh`bcCWn29JjqTppQrecg%&-1xZV))gv6W4OFONBW7K}&WS85 zKuX%EzK#W`2S!*7Sr5&5@hPt*V6C2c-+Df4e|wc2D3l86D+`Fk%+SQ{k42{nA75rk z;?+oP5v3_`?0HGjZobis;A9w&yKM78f&AC>-2Uxav}cWzgUo|*`KhTC?|t(X;T{ zm*V;Mc;aRSgJgiRM{X4WRJQIf_ph{OYfeli^EEa2*qo2=;n&b_&I~33OlJxc5Kca1 z>`ZoBHQDW*J7F;pguNM=6gx_s3Kwwk7I1|F&c3nL1b5fQVnifHAFyIGQ5y{GR=af+pw~%E?N}&A;Z~@xb z-J@EA8JZ_BPZIFBG65CT@+KV_!6p9?N{t4ezZaO2kB_!ns&hCS&g1{n7D+t&JyXn) zg)^X+s%3OYx4y#wunD{T)chFy<)(cJ@F-%V>UrY(iQ0JGXJ>wN{t1B|D`?ur8?v#u zJhaljApOJH#$^~sKpGj<@|i@Cl;^vh(sriI9^}@jM>F~FJ?!$sszZj!S@Ap5Yfs8* zpJ%o;@<(@Do6of2b3!cMls&SzEM5{m^HkUFD5PxI2b|Wp%i8Drl^*4I-ry&*`Fmd^in(q)j#Tn%84qd&0Pm#E_!}x)Zrja$_Dyak z^#}626goOqs@#3I-rg*}GDHO9&d=)Ul2ts7H;ZNvO@ZLGyAO@9PUo?Bx@@4FJzwBU zVjV^@jT)KtP5!yT`OVSo?h+TPy*$gnDF83xf1$U?5dbB?q?jm5{V1GOrX`BYjeLCM zV=d5&I)tI(uyF3yAMkVi(`ACeSzw(5e>WJu!@Og1b7eS^-G6Mw8INxJ2G&iS#^vN0 zoByq6xTc(HXD&x5*%8d0v8iD5%2|!2Ap~JkjlXH#c$Tqu$)Zv_a-#?p_neqF{^G-swBlW>Kk9vnXK!TO}|g-S$zJ6*{s`Yt0y z@@9+WzMmgD?oER@#-x(TeH^fYxg3-m{uF4lBlj7A9sYz;x>3-y;NObh|j#a(Xot;&IiWN(>xXm&H5)ZfnX5U@E|(Lochd2rl>**e96n zwfy(>SyqB#7{80a;WQUvLQJa2xbAs%HM?@jicEeYyL-8-u4HPTj$o-!tQ58=f>mUh zc!){wSz4XC^A*rSc>f``Mk*1J=b57^ zYKl*`nlZzKV8~kyC9|^agQ15*0fC|LYY!BG*O5Tqe2n&!SEa? zt@s`v7{p<+qT~^gV>`6>jCPVTyfVhHg!{xWAJ14<>`Oj`&M!39HT|exwJfckOFk`3oZmpEyvPA8f z?PWF#-7u4WZ6BYq&!5-J8&0TRi^R-3)7@GA?m7M>cg`1uB3(6Bc#de4g%3jwYb``W zclo%$L1+k~;}_|UxJ5i^PIzoErAvr$ltd?l!#~2#dratjd;N#-NO$-%&CTNjVe2ke zav#--J`Y^)hTKg&qTx*R`@y*=W|L2`*ECWZQnJK8S7zkwHoFYQf46=~YPY1&oLE(7 z3yN`Ru%$L!L)#FCD{LlorAG_3>Vvu~<6Elk-7@U~r2Sfx6zD+JBf+`>40D@#zl^Lr zgpqZibr4;VosB^?EuB zwpA$f-yRKsj9y=P>`mR+9b6NmCyKL#cyN}8=6vXH8o27c_zEXOxteKc4}f_<_W~65 zvw@x;dS?jf*r8*Ly_RQ5{G@wx9#7Yu%6pgEchhv)e%AIS*pLU>^WG11f4Dw}snGTX z&`5dOB!~;C7=nl$dfDi#5|jbf>>0gRj*radQNds~Z%Nb7fd;d%8m>GRt{n@NtM2Tl zc9aIt3BP1#kI3mw4sbgc{E;^jIv+8*wKL! zh`iwYDrQ9Qo_s3H3PO)_Mwjv#zH7L0JMRyvtXy}=~@8F@~dXO^}MkCnA`*PQ?xySqiVwRWYrH)Cl7 zT$m=o*<3N$W6CYPE0Irh7#pKcVqjX&xVvz?SxhdQl`fN(z#v7E@d2`;uFLkUQSNY|l3It310 z0@A61bRJSlx>H(GsRKwVWzZ7R-Q3Odem?Jb@3`aomk!il?X}k4bIvsvFX|cUD^aki zZx7|EOvrfBpqscvpQ9=M%$f^Ku(?QAbQwM9CrL{T;7e!?0|>QVonJI&Xi9KE)VW!Y zk&De*Gq2US!)3rG7w*P|a7(~tWtfNF<<`l2>u3l`&0~v2%=p7T^``Q})-RDy5#buv zai_af^DCk6?SAg}6#UsoXpyI7TuGOz9FZjffUbfB_ucuO8uO8S{|z03(oluv<*JCa zELJiE_jAR3l>?0!L1#F()}uUj!Na|IOc_zSorD};6Q_uq3E z%&j;-6^J8Le}byYjPSny(3?1yMojK`P)C1nG1rvyFS!>BbR@XAk8Rl6>NM8UTmvEe zkha9E>;P(9RvnpunL5k%LWd?7c3iHu{Ves1sje;I&1y^0ZP3bsf&z}zl)FQ_b*2df zPvDn%t0-4Vk7yWnRvPZ9`80@z`9SRSHpERqQ9103&yv0l2*@=l_}Qb11^St0{ViRq z)K%d7FGQ@W)V_J|%1lyG<9}H8+6XfDVw<2;_zCPp49KECkRcvzIB$9N&Z^Oh332X!XRUsG>tlOvk~(`l|&P|5p5^ei}@ynMLPk1;Y^wzts-w zXvZV@h73~Jm`#(UrB`YZX*s#*G0gan*bqWY5*K)V7GD}{g5?V>L*5#^SJQn9#IkRP zrz#8Yfjj$f!-U0C!uTmIK!*Kj?DXo%y&PFaW1Z=-gWMOVaH+~e@>=U{31`4Gc? z%h8zv34kWkVEH2z2}_0Fs^lC4#MQSq448M$>T$r|KPRMuzXovFrh8fzjQ!-HDz!`& zEK`1Wtpts)JpHMZ?ahLhWOq!aYMu8^Zu8Sv1UiZAmR*_&5*aUa;A~!bETHKfpM;2H z>>MFZ^jiIl;^|f}l6vKau9;d^^oCR7qGaW5Koi?yDRPcOSy{-`ng#h{325#_gPb)go%P~X=+qXc1tuZpjd!C;G#(%#$0AbqmqIi z5C?Jc0q+{lx`%geH-gt$Z)g5E41N-Ee-Wk(H4N}kI-YO)0lDK`hucYhWfcv%ZmnS1kv@PT)_Qk&7aMS}Zmr5TyLw&x8Tu zJ@i>H!rum9w1NH4w&up)z)5n^fYV6tZ)Lg*D=Q(2No+ZG-%9N= zV>CV@5D1r>YyU(x?E%Z*y|;>w*Z0i;H1O;eyvqK=$WKpI0*epwq_Z}B`N~q8Hck1< z@3h2Y3PtsIB9qLBuktfub;amghUh`Z{1lAIzmt{aMTl$WFXVGe^0TE3!<7>VSg-6B z+Z>^Lf+G)li1-YfE) zJq>BL>ZcJ3uZ7WwS@b;%4Yu-ziZ|QV1_otgP)wZ==hvF+JFAD47PuapGDNoE?kpeC z`xfGILKWDMLE$I0TS;|a1Fp{QuNk0mP+Z_-=2^}4jXi5=%WBx*4Vi20+Mq+A;tDEP zHduXm=g?hjGnOmlvWQlfR#1v-oGwGqadYi^_LaS=^>u-gyJazrm|xiZ{HA^fBLf2g zQSL>TG>24Hf5ZcJ3O>)p?(m0vHgN`p=99xWS37~H2P5Ju9)^uhJ!Mtxb`9Bil;ErJ zeJale4TdB)F0SI1i%z)z@Z5VV4qCuf8OWuPU8B>IZmjp8#RC5}* zqWpIBAgissHtOxsy;GlDb7ALTQjR|lwfPf@|n? z>J{`nXWhhV^I#PaFH4*DvjYRLAqP`-BqUSlt&#E5RQ zoHp=UT^v*%?7F+N9ThV*BHa940xDn68321@Ptrs6zJc{YOT!~!I;RmQk1-lu`)%P@$TknJd` zW4zBOX@&K!k=>fbo!R>^$rF*KJxSI|r(R#0>-VzNvOucgLbPi(ny zLr^SdrIu0-dS1=8@QKN==bEI>p zwd`1JxKm6veg~tdPmV11e4ZfA;2b*{yz3o{!|Z{OE@yX%bVQzqd#0dPT=M}|^Eh)e zU&lK2Yq_JV@|FNsUN8}??0ti;g$2A;E}BBfbDK)^>4yLUavnIQO~?Coa7JQMO71tS z3WFzX-sxkq?luSN)aP%`O>@P-gEryVpbk2OR zt_i#e7>gBkI&6ak-dqXlRGHjAZ+)@wx?kDgqlaUi-8XFD*jFyX3yIL*;TiDuJ6#B6c(SD?eib|yaG}yrZ#|OrzU_me z_wGCjDW?(3W}Y~nuvm^N3 zz6YB}pVRlLs^ON0SBGD%wdSYz{!aU#B9Q^*WNJ4mP_KPR;5|ReoVTGX1-}7Mz3HVfM z>&Y+QR6%E&*RPeCZS1G3>0_v$SnX>v5Gi-x{#VK0HF^!OQIdme^TtJ)a{TiWbajQR zz&Glen-ix@dxqC;KgC(+^mEqk^6h=fw=07w=@}UDuCo}54>k2_A?NgMy|uH7Tef&I z<>7afr1VbK#=y6K+BBHV!E1xh#LIKY2wH6sgMG}P+TPAI2UKRzEn62O&6-*-ms0=r zE=|8W+`WF;YqpxGIBA^~l6!hI^n!4p^efq#sYLK+8evIa+z++A2Dzp)0khQ!wYmvm z%QHCP&EwYVr|x#A1Nmu{CJYI__&w9XDSWi`aWJsse`$j{*sN_!;6DQKo?=14!HP%Q zcZyGWakw^idj6+sC6qK1A!;%ihx`dftEi+4KxqR=R4FMa-bE`@Y|sHz+G9O*nZjuzHfhbeE1CPtCZv5F#eoP=?APrBje#T<4K3-s{#t@>Y$%@4w07*_jc6ZB+ zn#f=?B?XISC+>!{W=&O@l7$EMKaqRr>!NJYYi(2V2{iF&O{t@10jutrXk|@DRn|)ZCMH<|`|vyL zeGR1I@6y|gzNw?qSeR8Vb7)OcGMQ77l0tW!^Izy$+OQk5Cn8g1vXzO#wYLomM3U>& zw1{SLF1|if<4&tPMGoKpH{ve;Q7A<15Rqt8e{kJXP-0s7&HYkz{sTelWvf#x_cv=u zyq%ol*5{ofY;zdWb=X8fLfNn7+mfT90m`+HzWEnp#jCzwgck2=vtK?GF)hi!FN{_v zKuU9`w(e#<94GbH*XDJ1NEDm()hj@pVX_rBzWh_ldISdl-^C)IOyx%1?ykkV1yMv+SBD+xQZy?nEiMSv; zLUn*woEb|MVraV3Dbm0u`rNbfM<+DR(<*-`NZoLog@r50m#yOD`u~wC)*J4dCn9Rj zKR)z4^C2={;w5kqzegC)nua%&vGlC)o8k(Sf3Jn%_eN~gkY5R{zg9}CLq#h@V)HBy z%Ct<%4iv05W<0}069`F98sV*HjHuJRX`zBm^gOVs{s}elOpag;p7@0IxX=Mo9@s*< zMPE#k^#$0gTMzb@;=f^nClGxhXif^|L9`!^EA7{`dq#iaNYdB&CIhYL;cA3y&Rr<_ zTFFOKB!Q=n$R9#eqW`okY{dhv!H@stKN$v8xx1(gPh2ja+O)ojnq+q`@ZJ_m4JI#J ze2|XMlxubErhYO_Fz(Q zYg$)V*FN`_+m8>{vHIP{W4yK;0nJQ^zF1na3rnW;xejqm=YrAeXO`=P*b@a;<;u`6 zCgwl>DJB1@D9ZE%zHU!6^QxpNweHT&&vN2V#+bUpHAndunh~`v@5HnA+-=p(sS>Pq zjCf|m>r%!#zTw>C-aSw^8(F?bIPJ?aTY9Ed_%wl0 zkv$B~2OY*A8Je}D!MEQfhS#?KNkK=d`9jxQU}|b)?!>I&06#lsNouSPQ3ekD8ebnI z28%i-G6@I*0*#gFdp!I{lMBOGBt$-j3aN8bqn0i9UWWU3w*il^)zCv+S}`LXds|zA zjrX+e_K$|X8C)uOI(;$%7T>b3X<&!EgS~xyk+skSbw|y0A2T3*z+O7|yU6b_J|{xq zPe87-FOkq^xK>iJTE~oytTPVw=kI>#5`3|4kf7}oriXq?Mj!&|FwLY0X!3hXc%b`J z@JWDG3|;fjwJOEjy@?isxGMMds8l^{mwE@WBzA)MM+jL6z7-J+=fY4V=Bv}flnj)g zGf$nPLXY*ScCEG39E8~R6fU^ zvgV|wC8;`gSAj#0j1N*tPG34H+@$z8*LAM2#v4Q~iR$-US)Ar4gw6wKN>ch-wsVC% zmlJxKF#G=e`qOwP?6ZOw=CH%P!X1@wY57DP1Io>b&qIl};?x}#EFINmZxk<{!$6bD z$2b42wIC9x(=uv!RK0f54su1}w4BFZFOlaB48RkP#f~ZcacW#_L7aMsKHCC}Y4w(& zafJVDK&3s+*$xRNxaOTj>N_@dPVTEu5XwX^ zoI9=rCaX-d?@RC75Mqgf^9LO#8K)6JxalK$M1ELpy(R+82!z^Vr#EXE7l-WWTF<`S~Ac6(M-a-!UM{ zbgPErA>mRXNcIxQAm1HJPo^KB3VvgJ&HVXq;4j}t-8fK&nx97qrFXvLju1rzxSBE~ zG8P5XUj{^|oV!kxe8UNOyc@aLLe`RWQteWdOPY_>lL)sypR!z87OUI&uv2W<%-xgQ zjwAm-GsId``7JWPwXnepT5=FgDJZi}SkS0+BUO{E{5CZ74bh(;?f&1F`HQkM`m`+E z;5@>@`iVX2lS6z3BPQ^1ipzc)2ERl|UmQV6;Gc>{x0=5G@Vw|t0#A{Ub{ zl*8u|h-?0hRU?U1}DXN#@T)F=l=X)`QcKn^=__~qy&rh)FtOJ*QDmt-mq1azX~AXjWykX7yYTb>%<93L zHuT*(tRf3GTcmLD04CzGdF${inH8207T*`o)5*31z_Is_$`4jYM!3DPsjsdtb~Ng2 z#;8n`r3)k>_r}J?0Lr3{$3>M{RIR*k#P-?jOOBJnTyE`LjYXeK0s|8_w2EabGvE7b znXa0XYQ3F8 z_;|O$(Z)A+3@8BZkiHCf z`&v0cUJdq$^~cePxJ5{4+_8i~ZfwFGectxkD=x~H?hBPhYEmgEQ$sOi3N%QK<@g~; z!W3fE`s@Af-h#n{!RV*Ie}7y{r#n{uJzkGMlzyVp4xJ1PXn9 ztO3r9_v_|j!#LJG61#hP7KYMz!y+PxEVKb#3FmcxtM`VszTjOtm^8zpTS?X0)>a`9 zufXIj$4ZE(s;Ww@N{mC=S(3io?I%db)%$1X_Rj{6PW-mnfe0nq(@Z-NoiGdepr++% zLK=hj^$_(4m9Z)`j?1Gd2yg549<0xN_hjOmcOvA{1Uuk{5xwXpoNPsUadE*xi>$oU0XK1Zb0A{etB+vlRkVWO!88s$X9J-sN@=phqAtPrc@ac~PxEE4M8v zgVX=*%|X5pMn%?0*yXZ8o3B#Pluc>U^+~yTv0{xT#}4;~oCk7_5iO5_MSh|VKb^!I zJjXX<8$D9*UFqHi_cM93bD1ikZGC_ckrAf7-VIwGI;Ygsmml0D|B(kV36NY3@ji(h z#Eezo7NM<;CBo1yrSpamk6ACPboUmqj<*{KwpUhSuW;55nb>vMD4QKCmoDO&F_NRK z0!NwgX0HRAzv({c5B+;6&zT!)VIZZ2J2~E>%7@;>6y!3_*2pT$XN|@}ag%@=g0+c< zHGBYOiv~x{5Wsgw0+xw@dzbjG|V_ZFVmz=ncTy*Xf??bNoHcyr)3Zl7kj;#5Q0V zP^W!;uoIBuuM_VnJ3l=< z0iBfepGjN^bRPAR*IX>zF`5yfUO1nax2#)Vau6OQhYlX&ZR=xKnBWo_w;Xo79@Hhq zofR*Zht=8X=+!aeTkR}NNtmco%uQcH$ch+;xy*Ue=CX-I1LZpDKs(dfr~f;cJV)Dq zf?CRe*h_5~k{ihvOG8sHDipVhDG7QiE>4mqHA}XxFjLdgg6R_7l>NH#Z&+QGKixXD&}jIabp-t*_JA&o9U1$bQ8uis z{aW&=QcnGAg<}d2?S?#=VtlDcyI}dF{dzRv!SZ^c>G3S!hR1h{6%yP&T+4qSjvLiB z96v7pkRWTcbAr8dC4M@9j^>3ppORvP{_20| z9uM-5QRGrtNLwXZYoEh>9U4+<@u_OC8d_A<- z`1QGR@o=u@wd96q*kp9kT)@@1-TS9WgeRK2Iw?3ahxfNFgA`1Z;#$_vfQ$LCXDpZo&^Fe-?!GzY2X{|a#*-Fp$9vu9L=9R6^(Oxb;r;Vg9xxH(f! zc^PHH&%VYv`G*xJsp;oYT5}2KC!3ns)F$6Tn($}?sY7GLNay~9!K+WjV#1b3+0Dfv zM`ecWcd}cFv1jdBvEoOcip$T41|n(f#mQoUPMz7PgHORglY|G`t81c>MYIi-+HIm* zN3IhEbJWBNw(+ejl$cpn=sC$n8IZgEqhkKQYz=bHR|RMhr*|s5U+5t#JFyTfo-WC7 z$KvD_ODJ5`xT6j|BGd=x)AV_!o4H;AwFrZ^zLyg0mrq41-FroPN?-QbWo$I|CtPU+ zrPw^Ig)6taI-TLTbY4_%&?Jj&?a7w6{=1SMqEHg3v!^B2zE|WFQHu3-XTmq*enmnk zL=+hKlLiJ08@=+_Bvj3g{JieQ{i)ujBtZIDt8y*W@15dh@OE{D=>jx^11x1Oms z&#{li=vjP1#QU?8I~s=VzH^yTJh17vuEFD1CVI@${P+Zya6$> zuhfnHTjsVC^}*jV032OJ{&@wDVu+qFt*EQ8BJHdcY~RLPU^^O%6&aAeqV$6i)Hj;o zNcK%dtk5Nmn`_o)4eBnr2r}qzT1G{yO>Ein@n*fuIy~7dJ>bEk^nGxRau3b`n~To& zzUv#H8C+>KJNLof7KjB1RkI>{s@qpa*?6gvTZ@RTepGw;S$OH$i65DY#NYCq+MaJd zbd}yVf!ifV+_(Jio5Mo+7LUBDNo_gJ$?%h_oJdWJ>ig=l<77Fyz@MpGJ2kJ=0ucb? zaYIL^3cU&W9Q82Wv$6RUA01Uu?VI=ZCWJmKbV&UO!6mEeja+`3A9(g-qxdqoYBzY; zz>iY;Vna0HwZd>eB!P6gW8wR|+R$3t?}*v}WPq)xJQY`3H#{MmA}WaS*0n|9rM}?b zk^yWQ@m?+K(eaPDoNpC-f4|mK)+ez<^a>+N->X{jq!&7>zWb`tsPkUIPdZzZRtbYC z*Jr~a%0~495{{Oj9%dKBke?j3ynTiLNIOz>C#AD!Cxu|^$x##CPF0Kl@w)t0%H}UbWObP0knRmP|#yjFF!v& zYzI&o#G-zu1c0LIrVYHLKe;7tBm)(5JU&=`NeHAW8u;^93ouVE<|owPJQo9y`GxGj zYeJQ5|6~1^8(*>9|4e?FJo#GkY`WGm^0dX? zFBYUSgx%yW@1dc+2PXYCqwimh?yMv|ogukmd3ky2viZGHZJLOb^ev^JQ|I^Zlp{}1 zGCE(2vEr1`&osLgt=*i=1u_Z@fT3C+V40r?W_cR-%`DZ9q&!^cs*KWZ(pr+@X_@3)sQ=%d-P?=FvuHQ{_w%ZRm5Ejg7A*jEzjLp2wT| zZ~Vb5rby3U-tuCAu@nW^vNRP2IyyG$`9@h4161xLZ}=9`N2oA($UNKu0H?a3rKWM4 z4}Ym{6=$|-qZ9Qn{}W>b&RBz^p=3bP0kf16B)MG>^3?aZdvoSP538lP2-G2ZMgiUc zN0z%vdb@?J$ytK?UOSln`|^U=>A;S#IaU;rAgHEmoq($BZho!@gK`;1%a6Req37iM zxp@8ikW%DktCfNWC9xdB(5&PI;b`noiDY;WQ|-Cnm<4 zTr8-bcnsNen6&v|IX?>LZ;C%j5lyV514$the~kvY_6JV$2GS%k6<})IvR+{_MrY45K(8> z+V~4o*7@lUl+X;xYwOVdd-KEZ%UUFpMt$xd=K1jZ-y^>!%8$O~3u>^rYHcmk5c-VCG*k$}fbX!VtiB<;DmJ`wl3 z*lM(yYkwNnskjeDL%!~R?EM&a1DLUe9k_kAn7_<3Z2q53E{t}QwrmrR>JC|3r<|h z200eDwds7*_&4&0JEuM@KK>>;CNp~zm1a``)bVxQCfK$G*LBX%OnvY!$%=;6XA&Hm z1F1Y(9qd?v#=twaWqO*c{gmN$eyQ05?>%tH7N3!N77h;!(ylZj*R3*1`u>c?y2iYx z`emMcu=U50*JWt;>6~gxa1&(mGdtPuQx;FA>Z>& z#Ut%jV-@ozFj~|HU7l4%z@H@YPiC}@@IS)cmzyjze*FDgPF-_fP@v1XLzFB~;9Dcl zET18H*O#z$%V3n#ytX$?xxw6tLT~#`3=Aj+k~t#J4pt+V1t61gFn}3k5-sFfC~iy3 zAgR*w8xpGD?Mu@xHo+RbUbOz`>Zo99=4q(ng`GC3s_7R6(HQj9+ zJeX#zoW|3$jI9Xg;p9|>hb46raWMlMnx9k-od13DJ6MGBainDE&K7WbuLj+teQRBrkBFQ z8+&(A`HPLZ)E*098&?=1O(Cl}ZAou~6_#tY8{IACczEbUGt-tE`*g{ccPe_il8-^s zyPmB6_=-}%K>~tt~=NM-9|8(l*g$~vSNJ3Ywy`dEvLY@@fQ1_g?=y2r?SbB0#uxGVx zUO5j&;o&oz%^r3aD-{;P4U5Fb8=g?LwMzdJm$hB#AJGZ}9wHcEblX$3k#hQGn`%EF zTL3hnit~FEh{OSrQj$uMf6N0mErPy8y|+X|ae7Kn*6-^;x?tH>ml9uFc+2cu5VK+t zcvHdvsw#77<6HbT->-qkD(;-TasuwL>cPl-R0`} zx0nVIz7RvTV?-F9$XJYD4w)}$7MG!=r!9GdK9jVsZ~OD9*z6?(v1K_37o!J~?xNL{ zYqBDq`*cEP@(tn=)NLG;9o}K4L`SRiASYtob81PW)KvO;VS$jR=h=-d9sCCm-mvUm zdiaoQ$HB}RfnODJV0QiTqj{;F02pH}n?M^2PXQ;$;d(#T54y*-jM4y$7}x zf5~1g3-aO59;`1dF)C(ehzFYJ6dfujv<2sAh6!o*8rX`-q?Wv8!UBF&P0n7Vf45E& z?NSnsaM!`CzEn{zgfd&Hxk4mV`{(1AqR!_C039)9rWAO&&<>>^Ly{|6nG&|Uy9*=o z1(MhD1PXgUoSY5QrXU#*SJ#B${u%t&`{b4yD)+KrHBQRVt$o})IPU;OL~o*j6!iX4 zK}*ble^_sSeop(J$%?z)*N~b-WzFL$kF8l`noaZ<+so6vnbt(d**fm;p)XmH5NhIe zNNg!LAbV1jl9K+B5B!svB~0jVF<@J#V3w+!JXfL|-at`j009dy@}#|Lp2#LyD2FU_ zh@SeA;8DkXat@_6sF*YGEq9zdTN_{S+!RYX)A!E)D^U)iB>X8 zZSy@Dj`w=2=mf+b1_aDRmTmGPIzH3=k@CJ=WLzd0j-)b>BDL(SitRixz<1M!#9vsB$!{m+nnbkN+DQs7 zbM5{;t%*_>BI~{d7>HqFfu-JPX`n@wakJE`;kis1cCn2UZNc)=`|pAUPH7wc%TD{s za?^FXFZQQ5Y-WY@?(Az!O_*1i?{Ez+Z3(*9(;Zp$q!pO(@|l7?ke@}F%b&1pWw*MnL@4x2FO+H$ z(J0+v9*6m_BYJZ>Q14;ujejfn?gb~{dGvS1-C>O5B2) zVxjzw(g~62Xc+SR^!-5YPR<zK)On9{J!j3!i${QCRI>MmYTGpuTP1@{*wVlrI+U8O+!jpy!WWH||*GSA?7U6NM zgzKZYcQ);rICayt7lbTB--y(*+A%mEkK)X6R4@|DF(g_*O{B^{eZDQ?SoK65kGx*X7bfGzYdKuS=Ph- z>}SciDrM(r9_$(+81@V5?MI$QWxW`qUrMVD?8(^wf4M5GD{@u~k=-JIJx{9SEqKzV z*gKcNbe{j{0KB7v-t{k6%BS)%Q<3)*z`PvJKt8*J=$q;%9rqCwB@}mPdXwqPKtP#p zg)lMP8r#wBP$ihH!J);6)jNgS;BOk5TQUtJtV#BZS!|^cY=8X zK&K#d;RJQSPI-UYyT8a0((*8iZ{ z7t<87Z)*ur&-L;cmpfv$9%_D#D59}!mZb)!@_|Y(q+;@5=mS{voyY< z*WI1J_%*FhAXaTDiDlu#9ZK8+Bh2ji-vmSt zFRC&O@sbw@&!g_7D(}nwcmHgGX721HZ+GZ!^Ttks(&+n2JROg)i%#mWDw2ss zf2(uJ$Ni0Ztx!m@)z#SPvP(YTG-ZPOdJD0AZRZ%T(p%r9aP~4lIr+=V?rx26n6R(L zTPFaQ#W}iLI2nEmCzHRR`8Td#Fx|q*d5>LwXNrDlc$Z#Y+yKvZ582Zh2A*PyCmi2D zVK!j{0N>b>X&UeE%A><4P-jfbc+5D#n}*@FGDWY;QJjxGlCMX*b4Oz7+){b}Pkr}+ z$E|l{%aqT)!@sOu8G$-=+7HPr}fwNi5sTyO}kSzzC1#fusPK3G2EnB~uZmuMv8djXzi z+rGQX87@ygZ0CmVs#`(blRmuPuTgNd*A>;_DE49 zPvB@jNI?d3`dBB*{rB^9N}*}VLK(Tu3<|BsrDu7O*)45(F`p$l;5_vEYWW3Bollye zK(AV}i#~4!UfOeZ@PQp=V=iuea3%;9qC4JvJ^hH@cXWu&ceWV!(EC$y+uK;4`vE~tQ;L?0XBS|@ar!eb-_Z@nCBxVy6xb9C^eQ(XEAYX>Khc0O0_^RYk{dSPp z3Zuuu#ao(&)|!LH9VH-N;%*h!FO?nRTSiGstb>Dp$!=~L%k|-wj?b($PaA%Wd-pt* zFP-96Z%y_oG=M-s1rr0?>tHae>_;gZ1ELa@{QJVY+dh;p?q+2_Zj=7@#|BYexy~&D zg&2|0Wen^4!(~BgkNqOWEHd7QZ1Mji?v+ls?JDF>xu11_R}Sa9umrRN%a4Inv_zko zHDSWSBofP`)ItY$CO@M8G1B?zUOIpUjIvg0YsQ2DjEvO1_a9SA5i)0*Xi(x@-`ufG z&rdNS)xOPe_fld(G33NfhvVFS3CZY-$EXdrKk(RWVg}1nh!AD=Ak}NF)DaNrFziFC_teQDy!Oe z!^dsa4c-~eo94m&B9y-OcaP;IW^^}m z5lPcv$_(s#%~BR;1o#b^@k4<@>RUuUrfk5?9PP(#^NCYKaTbLH<+2q*bM+-Svbp`7 zwj%~lxjYDZxhQTQ3!NXo8&ICjfMb9=jkP8xYe@L#bpt_ISf|t$}e~y zq*l$I+AXkr`-shwBbELWM6`5_>-3^IuZnbojNL!*$kD0Yva8J12k*~_Q9=>O#7yS+ zfb~jLWBfbhoG&-CaCW{m(1^09ycj|5mG5)iTGu_$^}GvHgUJkh_EqqHiN7B1qM#Hd z?PFek>gi*Ljcs$aP;!(a&i|@wmyHTrMZ!!l_352kKirs?rejwuleicY z^w%}@k*XQajD8-(_!T0(pxq>dEp|kOS}KM!SNqLzJgF!XWJT6XVRTRi4E}UYPDcTs zV1-*?w}~(83yZ6~T&F8q25679-md$>;ABgNc1ilulE;<|q93kA4`6w6w`)xEYvHJ- zL1x0hs|;zgLrxuZ6zwcYiF#{|YO7}?yXwX{bMG#0OtX40Iz4Q{5XsThP=Be*ujpiweWb#?*;y96>E!7T2zM* zdhEz`#M%dp_=g_cYLjxr1i_um=?v9Y#8c2@U>Lf5{#b+s0h=zGNY_4R6>YKElS9j4yPiZ?eVkdcbCdaEw_?eCUoIjz5B85`bAc z`GrurTGbw`VOtLKAHQU87jrJoXRBroR8@KemJIYkmN58yHE;GX!A}|l9ow@~BjaKA zu>3jV`h^=A$J5}%H=bjfyKI_7zho7=CI2tDm!Q{jAEE4;UO3If09pCd08@O`NxI|l`Nn) z3)a5(6Z_TI()P@yv1m z$$*$FN3L04{#;)_2%Byrv2}@!nkCS>u_P&-Ba%Eah*-`10J)wO78UcCxMT`3V^VbV`e){nIv25owQOA-_LrGaO|H>zxzQSM{veGK29`GZAAPlq;y%8{KN_no*yuUqLr;gAP@A7-NmP^ zzhy65_%0GQt?}9bWnvpj(<>i>TVJJ{BJHM+-cTM*gxeiCOQDGNUA)(nZ76JG3wHab z%Ka;S<^>LD9u&#cRC%CVT##fUK^$6>#Di=WD%by|co0u0GCEzDdT)U{Ief99gFxJ$(wA;!vtoF!6P)fg z(dTtGBs;-SjN?VqrZyjv1cu60h-nuS!T2#RiS4+g7+H2jIa-FqCK}`+K4_j)fZ{ZXV;1Cf z-34MzoeZTGPvV;xhccx?OZl~%gfcSnGlg!vFEY$AnkqS_ z;VBXWCRX=dFNH*3|1~@>z7I-;ogsIFZV#r=E9Gk}Y`2xCh~Yg2MPGFsj%_>@?du-X zo)c(#W$3@w>o&Fo3<e2AfSMay<1(prR0_Ya^#g=ddCx3EI;Oxs2HEUoeHBq zpf-;$YUC=#y&)9KS)s}m=Z9i9PQ~;r5ns5j;rkTw54fi-#<_%Of@z$eCrQ8je-$WO zIL{z2tM}UJGYu=vh30yEPC)&;V$`Nh($7oq*hVO5HUY6SH{=}7^L}7r@(Zkr-&-z; z2sBM7w*GpeEAqv?y{3tlhMX?3;1_vBE?2vC<}^R_2N!|%2RuLYMCc5U^;B|li$yNwZLmq}^^2IOojGaEA9Jgv#r8$arg@No zY8A?-i=C$Y8(VC9Qv|d7?Ut8(<1{{N>ILH{7oKh#yaSjY(b;uF&=p!`73Qe&vvVFSG26 zd@ZvVc}R1z>%?GkQIa#^i#uug`?OQP{lmMTq_}k&_$~?!Unrqn3U@H+=)<+6q4I&L;cM@F68%vZGuujeWg%WEAx&UxY1 z-FJ>Ff4DtA42R_hAzE#k`*SKoIk|wn8F!Okke$4F zUr*1{`crS$;2L$2SnFH)$m`J7P38N>_p}{3Y$Tt>!NBft^OpinbAi!hiGlxDnkv|C z6nYN9z1d$H6pB4w#VoNkpOE=An2Jxt^|rznevKt^ z{g1ra5GhoW=QH1X7UPdhPVO@!EU))DjqmhZR7%nK6E=9zyx5yC*8dhqO&qV>?5SZ9 zQ7M*i{_7jq6s1j%x+3R)<-gIef5Br* z;+LSN>g|I$1EY`g{`zL9tY-PVSt=$-m=Ju544Z>`A=DuKe)!^#Hmjr2_|;LjZRYBd zwGvT_eJNiYov()uz+#>C+^Lt8KQmDO!JmtM~0!U5Cn(})S{we#5} z|4IB6c!KFd0X7ONa{1sHB|(khhtOQZJb~i9Bc3uv2UibJz ztN5pTb5#|Zd{EVNVnl*Y@k~Xe|eQ%y77GY1JHGdL>;;<)ARZJ677ez98MmFC8Y2;4ME}JVSJQ$V#{f` z%lEtnep?!gcyc^QgF8z64vg6RipHd_Wz!cpUG-wO!tSvbur+g8Jz;$LS>}FvDZW1H zNy;p_gS7_pTIsHx!wn1sn-4`{S|2js_Qi@pB*v?ZD52$<>8{x^j7g8m9t$+nBu4eO z|E%iN4{F+9<@7`3i+lecy52G@>M!gXRYd8M?rsnqK)Q2ih7LhOT3Wh8I*0C#p<9p^ zkVd+@8|mi#@qeE8T<3f^U-`f_vuE!+*1gucsh5XSR7D{!50Twj=p}COL3%P1 z&vhl6NR>^GhS#}Eh;#Am#`wTff`9|Hz90}mwVPIpn@vRL`gmf2XnnDJ?rOm zt-s5bq1dN_Zi=$Vw=7)zC=X|H$gQew{LvnjJ}I$Z-msZBT|O0Ex1uQ-v&!YQb+~?cdve+KpaZ-t4ICXk zwB#NbZ1FfMgSS`*zEV^o6-MYi~XZsa}(*#Z=A#Ss0&{;-1NF>~n!4?fdGb{fo6j0NO4&vhD z!==mP;h%XffkIwx?L#_HU#zeZDKO0k$Xw4`>HF|BRE$PNcj*{QeUrEfK!lc?6+bFw zq;)!uOA`fxj{0z+^P1kj8y7jW-?8nEw|r&n+uX=%7afljj%T0aY08=ILyNhc`T%m0 zq=eQH)Zb=1li$&>(GzpGxockrA$6QjeJJMp($H2C*GAsr${u&}P(Ep~a~wX8?c6ca zsy8-W-SE~Vb*d`7Fk}>j2ZZQI$(Yeb9v}eL{iI%dm!Jm68i9bkiULj3e+4(^;G0^CFIv|cHw`j_mtRC1c;=9D*eVGTs()P~ znsfmJBQ@uK>}}k@FP=3{UUr-7xBn@4rVwc_^v(VEiSh8dfIBWB?`l6Ab*$aiPe{1R zGVm%R1<*o^CcaC~;NwS$Scm|hd)zL}6N481H55QIyzsGvJt}Jk6!rDV%Hls(XfW(s z{o=z_F|1vuiwH5fNMeq`#nCqL5>rplou_sdQg^>3so2F%!o~6HYYV686!-8_q?7Bz z?HlGq^`naGpIm(go|UiyXu5*@!99}8+KXD+3i^@hi}*5_AH$$E^>^d2#1Q#H{6=4` zw#zosY_r=z2J@8fWbn+XowpC#cU%wDVB0^hf3S7-=dUHFIQ)P&IkV7$AFnx!NqnR# z3hHViEl<#}YTr5j@|NFf!0mO7!+A_{PU?<{)mwW09uJz2drbo?^(%5ieUj7RjYnm# zU4s2*Hm`7AXW{=biaO5~uh1!o`__wa!hJEA zMGzJtU4 zb#QIHKk=>a-Y~6@;;K?`fH6w_AZH{n<43V_#Fojp-H<%5I2`DfhLa>O$ws`ToC&`{ z>dv@e3duQ>=tO-eB#=dO4J|=;5OYsig?E~R|23KRzk!)(QY)Mrvf;d2n*8Vs<9VupG)A3=eeB8Wi7Ss^*ogL3!Z{$X`!D`&;ov4J-Wr zD1~K_1@L!0O1fIj&n<)yHt9niH+d7fM*J^kfAZ#Z0jE@6Y>tNcxFwr!;MOM)4=L9* z+;FL?9CW0Ud#2Uvb=Hyqx%s%e^!+Ah=yb5X19mIlRcm#iJXui0o#-o9C>S=xKbwEs z$)3riZ;z7dD##nK-%KbIzDE60e%8IKZnWvUsp~_f#q3gZ7t>?sv&Z_I(-CArpkGMF zij|Unx#93|WBgA~x9~^E0XHk$v!JWL#R10pX4x}gy|U~Ll8G6u$o2vph+O>_PhR|4 zKgsJT5kJJ_Ao<>rdDb~BtzUdyC#$Z1M-Tg4C9ZB`x5yJYW4X#h&q{H6SU`-6_0e_D zw;GEVg7i?@Bk|6osb~?bK9jSIb3}as8FB9Vt?WdK9?E9qtD8#_l&nV1-*(^U67d{R zFifwfT}zD`Pgd_ofD5p-obM8g^{CcVC|&EK{B6~9?9--c0Y#Dk1pT<`JH#zdf_e2# zfwYJisL6bcYVT-+NKO#$`CX75NPAx?#kPu*>Wc#?rR5rqVMv`RI_-K=-)?U)Jwx)a zj#Ng-6%2{aRC5j++u%4d{@GG2LCo=;AA(^Ji%JhX%Z;sp>u%&g0xe&9qa8f~pnrHT zuzy6rekoGzPsn*roiE&4TGv_a@M>Qk5)_4Js&^X47VCM>wuOnXVu_e;-(7Z(v?4_O z(X7F|OxyO@LZvB-6HMkpdUliMn}IC=#}(S9&E18sO4-p*^UR6E@sfMaU!QLA!b$%3 zsGJKqGriHAT0v{$q7hrlJ;;t3r zkhR6{^VZTrB|Xmd2uDoAVw+E6PncA{(rR0EzeXjgsNNw9d}^~aXsrwSG?@Se*ODgO z1kq4HH3P&x+B_m1W?h!we7}{6>Og@P6BpMGxqwObE}{Hm*L;dyM@+_lc@cv6fRB!m z!1p_ccY^JQ-7>`e=OqgBYN?HxcSN}NC zm+^J>!Db)Fy%`YV16!aFHyvghvUdoX92U!^p_Qf(co23#4516kr%zFK7b+6;yU+-; zXnR{({76HtHvM;vQr|8V5)L1M@Q>Ss-{%Y+$9*ZZNYj+H_67v5K7c0i}7IeXQ~TM&;GaJ*cGDJLz1 zbSe;F?CrH^N(t+e?sMsRLf&D@o*J|D@d zkiW6S7CRD)H>pr`oFu7MoYZ4{7j%*yPEfC>Mx4Sy#PTE^Z>dNp*=f=s3W@Fi)oGaA z?7%-goM!!L;a02w!S5d68=7ss3)KnO?3k|S1Bym>Au>;Ty#I=qAq>e~QH@vTBj1Rr zHoSj|E(?EGPnh=1Lv@*|hmVyTuVj^=K*2t9=&cmc&(FgXGwIpZ3DfSjJwQB8!Fhv2 zu4;tIfSl4ITu!`+g^}QK;dX!xghb;+!Qiq7^w4Km2n(xhQ)+xIqs+xWu8_rR=np}z z9~Hj30o)h!#e=olj@|A*CoKwHDsbMsf98*j!A)(l|8AD$-Bx_tTyhN``FB{04E;9H)1&43^EO1h&CF*#HISO^2zkv5vTtjxDXpkSwh zN1y*wITBSo%_h>2f}(MdBWl8=uuWH!g7{V){fVO4U6_YY*PXX6<4}EA&cgZzFC1Qw zuil4X`NE%+FW-slkZUuamhoDx>BPjfeQsjYBVQb)+W7BvAgwM0+chcD=RA2Bwgpa=!wO;qVk$A2v-F!P!QCSrO34SG< zI3q*$8@OSyPP=jDg3Z(A7YE#S*057fA#Y=nLAQLaKJndIy?-vmn$l9BiAq=t(OwdH zjcmDvCRtY|)8H{dPcI#LbKovm7i~VP`Ll)^T7#|CmOi+sN^?8|nr?IIU207|N&}?4 z^P0&zK7M{;fB`1u>dNDMvWzAy{F~f6UXA4a`}b9VF;tz!#5-I)Bea2(q2c(AZDj>E z(x4a!LrKZje-)^tOTK@D3&>~`PC&Rx|9Aepabs7B6m_eqRF+nFUu$YNfchxkV>|X8 zVU=_Cl^Il4pIQ{P8_?Ab&*R0oCI6Oh`#}a@*KeYsfp>U#h}s+JL5KDuLP;4Yy}?iR z|M%r$yJY=wM0WJ*qzOvz>(c+#{>&-D@uNks9fF1q3+O_0pUAa2jYuBRV#TUCGj%N4|Z{H>pz%LD9C~Ro=QXWW}5zPtn@VQ}U=48`dcVG0Gq{`%9w;Gut7$ z(Z4Aq4~!fNiX7WoJ9jT9hIzu;FIAi!SZty#Q8u@jX3jn9Ibi6?#^Zv>0|7pF;L-0D?S@{5C;;xV-*PyVp-oPsMsoHRjkh0;oORTnJTOBj#g{vRxf@WhAp& z+MS)#%{0lnM&D4q&v4F@$~t}oQMHRBFEC;_vQ}rkv2pDef2oY!d(pKzk=-Ih8S}Ge zmR~k9a1tev5(byqNq$#5YUwEw++jQ?Mj79kzQm;=rBN!h^g0vMSSq<0jam**t&^Ou@N!QhsNK#?uAc_BDVNe{=d9BYg8CL#P(w zC#Z|Vzx5uwISKkFIHzf2(0_a(h{MdDQyud$g@H#KVjVQ+nd-TeDuw zL_R?@t1BTUKfr^q<3oe?B<7BVe!J1~x+0CcIJl4`TSnNmYxOyy$x z`7!(@?njd?pF;9uHw*JOZd<%$7N1AMCkF(83cS;*kN@;=LFXeKFKK5+Atf8_=W?Ag zS%V-#ueGbEQW?Hej7%)Ux|-a0vBJu`YQ}8k`3q(Ytg9YK#`)AAs|ADmJ0sJ8irWfX zE{Pt=XX7i$(S_j6falE#rEV>+%Id*rO2a|z00_V?fArSonKpCh1X8zX5O+iw-iMUs&L1VL-5%f~o&>+ItU(4??1ap9la$ ztsX#R767GJ>gw!#ohQv4@&r5+ZF73JT|iXT-J*(sK^6#wVoOCR*GtMMDD-3sdYtYR zW!1Q?c%Gxx`g!ZOd8X{qk%GbC7hg%`tH1Bu5 ze;h9QW^i*!Ry4C5QH;5mwy15KKC1h;I^$Tj+|-L6BGiN)>w(8KMWDu-1O*$fB{_SW zBFC_5?&m9O-q~PEtXxWM$fBe~$P9?=pv_>V74GN3(47O$KFnU(d;R2{mGyY{RgV}z zSs&hXG#VIT0SI(NYTIWt3QAq&8|Xe)EHjWvmE1=pdj(;zRG*gX7)1&UI`CoGM#yJ- z&MfbNfU=q^-9!{H6{f5xc`LmuUjR{wCJoE1P!E+xm2*PQ^ok>jUi)J5@#$fyWtgIs z^ytEUZdQSqPeIR{wQ&uV4*KN5Oa!v!zLo1%XCW)E=#^ZJ78@2%E?j8WCyrUMEFC%&znqNt<53nO&qICWexY5 zc3o!E2B1?X3wnHNb~%Xxk{T1Rh}`OLwrE@UDWJg80%UjF!)bqH5Cp%{^8$97_X~h_ zvgBhh;?_y~bJWd^tE(F$a=!T>ASS9d>3=V^naXLA`|lH$29=;~+pVczvjvQeV_Mr7A4X;lY)jE0HZ<^*@e~NHi zs4wu}y51_&eAb*ZJ6a8Nck~X31pHmd{~I~L1m*ze#kz~I_5Ktj+N;G6f!|UJ^*TEn ziQvpguo|i8q3d>_83tAmc<>3})gRt#eMY8ED4-nT;-yCT%&jkNr^mN&6@!=X&&HSA z!Qs5>$Q{RdF~rEnR$~s0U&!W_?m@1BF|V5&i)Ugu-0PAqJx9=bjF}aNRSI|6(a?ly zauy}voI?H5yH*|8Dkqo1lC8X>Y20S5ncX{|19SbjV+;F`(oiltrg(%B-0(P#gVw;K zZhV&uKey=PW3j=NxJ;Fgc#3TEUYIG9W?6UlBbAdX?zqO9ByS!kGEb&2)o-GXa!}Q2 z`Lh(3;cl1Mw+(Uo7;w*#h^zAdUOpCjjj^!Z$ zc1(VN;tbAey3DZ2cT<}hgTSquOu)6H?<=6Nu|J&sxNVpE`ud^t9P7LL`vU?loBybdz$qw>W*97{U*}fUME*>ETuj(0ta0XJ#s936ZK6${RLdSLe0#0%m-L zI~RKsZ}$t=c>#H($#OUMvg;ebb5Gr!Pf$=WMKckRa<71^pI??t?;A+FKo<80E|yh| z@mg09D*n8gwKdE68S3kwC?LJ=H=rU^9H9&;F;kH54!MiR!@-7;jBscik3 zYrf5XdJyg|*))NWC~gxK1jrW_6jYyZd=_(C1RQRRSCahWf4~W}3y1yoU2>UAeAm7o z{O=pg%KCZm@!Iato8^9?giT+Hl$>55O6kvTUYL=WL1S6Or>D%r>q_*+Kj-oCoE5wN zp+`7P^K(sZTHhH-?rnts1SE6feYjWj<(6vKMmq-S#%Nyr5)VVj3jZ}}nA6ZM81Wkc z%`=u^v^OgncPcH(1x19{OtO1)`Z@EX7tQ%fdE|a3Z7uB&px1zODN*niJNML5R}D#-{) zhC%~s%|>fZ)oW6$^Qx52hE)2Bv!8*OICKCGj1Uv)Hp(f#MXV z^%Y~%$-y_P(o15|i-rK6gKCXQU3OFbG_fi<6c}@&35uceD4CzBf^fEFO=_ynm9MkW z$%RNRq6I4Q2O*M4W{?F9KecT=LEk<>m~4^a6mj+y&m{wrg-gj1Db3M-Ip}?5hFBlW zkSJWk^;tLG$0g>>7GvjHdS5(YXL)1^;c`2a+Du|UWD!a1NSeWAJU-6poP>-`^>Vnb zA!!XP-6JmQ6_=VB>OmQM_aouw^`2oteLa`8wKb&)k@q7^Ed+0njT*#@U2f(2#aKy_?D=oNwf(7$yburn)W2TXvELB& z{1twW%PTAe%1P&4D|O|S8A1uushPr+eyF=3=&ib-2@m&A#$Wslp04(V6y z#3^c49E^2IlQ(;_WuIUbs+e_uU(3a~@A-|``;&e1-xA#XeB)Vw=*21zf0B9UN@afc zig+jN|8fBiRee@&aRIq><}dtzX`>-jP!oJNsaopwcoRsn!R*~un+6sDY33PhhA=HS z18b=*D|K9zhfEx1s|;^|A}rpd#^?D-_Jq)_1K!@n#ccT_GC!@qc%~ecUc84)W~XSt zJ43*A{LtlWHda$r7nKsaIZPW(wnZ0*xkg0=hG3>FHrkS(*CCt4^~OoZA#%DAfB2`Hfb`S_eo-!#E{qrZ!HWJ`` zV35Fr*&A3;5Jmt3H(*<^k-L+P1t&2#uIrT|Sw_yA$CZDT5bS)kIH6{v*DYD8Up_c} zwn^x9-)y46D5RKQ?(cq9q&5k1pA}3tixY^yqq!YfLDVnX3oTo8L2g-jkXf0eYR_^w zp(10w%W`N-s7K3eE9yI8l|OXIqU07tH5~gF62n}9@S!LC)fUynrMem=gwfHVGkS2w zXpAa|yNza`=-2UT^p_r&)jXBTEfixkh4{QF*`7CzN@;4{7wAv9!20C9^nVS)cbpX+ zU8aAsT)QtmKOd`i7kp*x&kt`!Ln$iXIttlNSo&L0NUyK&fW(->>&o^QVQ>ZGi%D(& zxSaLV?)22@ca(oqF04nM!1$~Vd+o{&zMB#N4{ojJKedtq95==o@EJ+(x7?zCZ(Rz@ z+B{fH{1UXujFbmevTqg3r1MS9z)VKsg4AFwthCW25pOmeTr+PtOHnb0%GbDim@7!o z>5^teEO)%xbOEUJ>N##bh4P$SPMJTq3J>yGnAGsx8|`fJKJWKEE6(`M-dnUl8K*er zc&z^hP)?rArU;cYJCx$Ei6XEccEVy_Ppu-nAK2_cQG z1yXahGLvW@6kIM`7v!+dARixyeB5$2z@j7ttdrjYF_4`w2UgCRaf} zE_osit4(~0N_<$)!;v?G@uxozLX^}en0+TDikj~XZP#4;IEcr|s zttOC7krP&-Hm4o|&qnIMsSDHl66~OkbrbNj$>_o=8vJk#z}2vp^7s`CVToF^Ld8~# z>zE8r3`W8x8OMnXtIs$dEQaWUWw|GB@1#|bgB~kR9{rsV&&^p&y0t)H=X?`g!$zIz;yKWrGC#`mHB?1Wx`@r`{Y4IJmwN|>7JOuw&=@d zm7^FI?}WK0G)g~h`7L62`|~n$fBDlAE5-Wzw_c=ww9+;rL4+?boqrf<{|_$rd5ynQ zyBw#zR_*%GNun{PJ|l33ifj@!|5ZY9Hs4XNAmwp&SwUq9B1(f#{b)mQzB%TZGm8-m z{&-b=731b>yfh#SlA)})P+D*V8~)s<`DD~Zr(q&Zpn1OOl!%aWPIbY>!J<(VJVu!f zvOHA5R7xf1bNZe`ru(&iJ|mB^w5Yw@w=*jljt=py0WvjI4O5!phg!=I2da`?)L7bq zU}{QGt;3e=6~Eh1$Y#tAgd!QoMiN)^JJOa#Tx0YZRsV*xq{oX~+S9NCKpu<@>uA*e z2FsAUDTBM?z*N0BbaGaZOU;@TnZ2HH{JFcgdxh(t{DTvF0e5{d4e)3LAqT-n+&j6p z^AUcQz(iyWiyis6#>6Wru?+^3Lt;En&KZ45tNroo+XUw9B;SCIUH8gSZn!+dVB7Y%IK zZri|yDjyU7d=3_PqWiJ~A1$JuTnUa~*^))0%zqoD;08|^XUKLgm08YRDx@fp=soV@ zBrpF|CI4M(kCI|5E4aJRaPba%R#qV9}2*nZ`52<}Dh-qzmpl zY!aGrRY|Z^W&o4in`|mCc>TIIroYc(L5o~Uw0I@IVg_df+!Rd{dd~)8Ba3Cd{I?lN zqeQwz8YggT{Sm^3ur*wO5Tz3bfYdK+4x56uzRq~z9CcgUE&K3+lJ`s3Nr8}nI7Sa;}( zX;%8?FPTN9$qRg{iRrz6b$ddjdI%VJ*huIU?~dGEBHO;j{X?mgDuTXeD~79fmm#JV zN)o&H%O!d#TlqB!%;63&CfKNKe_}dq&VyBNq7`&;N?7)bgAeux01cKQ9Iy$b#|i6} zT8Z3^rM^EOQ%cq(sU=!0nYkV%r;A&xKz!gRUk`BL@+J=2qXU5r^W*cH+-k$DV?HqT zioa#+`^_A<`f`OMR_ErKWdA~UponyCMxhrf)nuZ5LT8J2H#ZEWO)#j(<$1QA2JD^O z+ejI65?s36TR3}G%v~ebfWsDhZ(>;UpU$NTjFJYnkIYW7GMz1fR`mZ&5(dt#Hg?0_ z34e}RybBRTIeo}4NR1f9rI1X6K=1WkSz< zcM!*;Q4-FF&Bc6zR~L)mcu&Q8(`;!oQ_RIQU{QT)#9y`?HRoX2PWm%?rKZzuE^d-@eju{#6>eZq#RmXG=d+ruUn`u!Cg3Vxw~;*LCwVRo^ehchadR z?T)A>m%}?LoSRg+^vj!uz}7P|F-n0cOwzZJv`Z4x7hH8_W?AW|XAp=eF%zE(P7bEZ zSs5g`tT|*XBPAttXEcjrlz9sRL&5!+JIx@*V+DG4C-d zMpuoduiRYk313UbE~9~FPVqDU)<)@;l14Y&P;aE+;-+UMbfI^WP)wy_iIUjXL;zCc zLO?NFYEoK2ns^!|o9_33ilYqArv)jA!_*?f(uykW&uL>eGor?pk&CZ(=EpU;Je^&6 zbJ0t-3hub2%0EuF725$|Ho4fgS39t}ehgVmj`n-_KoZ+1S(k;+C{UEA#K%S^4py@J zONqVx9>Na6ozCFSjW>x2+t9mf<{d0)xn&8uETGvthrAs+)`H@W@71jFO;F>k@;)+< zWu3JB?nSdz$9-c^0#DCRT*xoL_(py4D`Kc7?&{c9N`BL3D2dyJUvKc{NEM!4L*vI2 z1nKoDfTT&FToFb6h3=*Cqb`gygREiEM5i%rusvJ->0m16yvL^PXF?1Pe8f*6>+HJN z(;3|=?=5at!_v8Y*vSidx(zYEhxhWX74rKNjya!=4vi%xW483!zfx`=*e4F&TVlpq z4zVYW%}6iA7Z&wVIFr|5Na36?OJh@&#iXdD3BvK1mt0MF5xsrlr%eBe%}%WqDAwHP>%@KG%kd`6sfXJiRXlw=05!=jZ0v5LE;@T+mkd{q<#m{ zB<@budCBfgV=g3K{GpX3L6G$X%{H`e6SXz7e{zUqQrAhPBu_K%EcqIJDuQ8-O8qt2 z5C2w_FS;Pz{P;uF&FLgbczGo{mxrJb3ta=($uceUcL!sG1lh+k4K`6MsFS5W`~~d6R%id1Y{{x!$s13tiUWbn0BTci=F<3Be160 z$RKDLHe4bQcc-svUK&{%u|;A^U(nj;fg^07D~#Jy;sO4*DL~H%RQE2ON9Dah4b-K2 zi8Ksu#R;q%6fI^~T)XVcSDv|oPBt6i4GRT#3}iD^1uEG<_{I%3U5WgYs#a2e{jmp? zoUq^C<3+y;qEszryZo5&M=wa=F4r6cPW$!mJND*RGp1|p%kZXC&mbl?Vm6iFq>U7v z5PFNU*+-8XXGr}3gLT5+NGRrYqv?0;OZLTx-J+k|;8^hwA;1h;*?1SZwbzWkXZ7iV zjL0o1v(i~=>NRY?!98J@P~_+PwtX>u@R{O1^zg#0ZzSaP;b%8hd#^7kYhK?#V12OV zlmu&fhz#Vr$wx?PUw+jJFkD*7-%nYrP6xbiWbt@jLsP-9fxYj83(&u=`$Y*&3K8K#~3G}NCzJF&CD z1D6=|Qe7`b2?O*jP?ol=HiLGA72Eu#6gA<2DtqD-gfYmKwj=koyv}q%Z}~?& zzucI959}4mUPs9{4)4YLGKD-&BEChJxdxf}c2D+*o|TLtFEp&zA> zoPOiLI!CD2fFNxdL-Y%ULKm;GbE7NA2sC`wvW65HX;?S$$cB!~Ef(V6#Hhm<6G__+o*b~^s( zeu7I0743`o^_G}en&)m8<1&8ybl#-` z?xpuoN;%?6MR5pAi0IoWo)ny*THbdB(izfD_6RY=3vt zA0!@Zl2HLDd28_^%r+C}B$(E8^)exhEQuzPx%tZqedO6?SG-aA`d>;QmYVX@LwoE4 zJ%>SIzH@!~)nxpzbRt)GI{w1^l}hT(QrvfLd?h|#j~=nVJm(f5?&UlTn#o~M-d-Q{ zDavD)k4`UvV<+Y|xPTrG6WIsY%MqP>iI}M~k3T1QwfK#HdG)qgpbg-$jxjga+4Ae6 zn^qD`(7R605&x0zGVfp8lA zR{SWdj4(2AP@1cEI?aQ~nXJuy26+KQTD`-$;7=fNgRJd$rwuWX6J@|paDYgn0PLO| z(4a_j#qJ$QYyb`z$CBk0LCg;eeX=MyRiaG2ZCpze=@;wf!wFhtJ~FME)DU#;$T`AC zh`da-t;g{sJy1mh&r095RkV2`4%*T*&Dg*Vs+&-W86-4ib=7*veM+CVlVBB$NJeW9 z&oqd6+zNJn=Z5z-G`Sw-FEO+^G+~0P!b5SUDL#yY5f;~(JV~fudIeI&l zH#LaW&P<-)gjRw%Sh<2B2rC>9-~x$%P4oj;>~BrmWI7S;K>fm`Bz|$BFA?PM$}yW= z(^wG7xpF!6>c$qrNg2K1^4idtJ7iieFgk=Bw?4l?IwGwGggVvO^H>aR8+<_5_G* z%7`V+lWFI~hXOrYtZ$z$glSgP6E5imFY(g@%1fCBL>G7f12U!rqpv|ygB4u^)A}bu znPr4Qfq(!uin`MLG05j5Td5Ejr7a3*5-d@%bv>nd0lK>vd)l=ZQs3rpdc)*u6H*P9 z^l$nLx0VHPe!3W0tHE6Sc6KA&Qb+WH+aL#ral@0TS69b(fU&(!1OQan!M{*!KHW-U zTVat&c#$=x>PmHN;r1l`Ui!2VOPIqnSUH*}eI6nY@utQ`I>b6GU@E&xXo>Y^Q@gAl z&s!1By@4T-8ndJK4c ziw@|`QLo+0`C*=X;_+b@^e&j3aucddy`?F3TLhU8AX($cvlFjS4R*GFbJ^aSG>euI?lt|4ULp z|2>oRPShK7m6ZwF@TbGL*=HRr8!0g~arWNR{13NWsO-b3-X@;pw(Q1 zEnm2)oWzvcQ8b_@m2AY{Y1dLb*Q!hlbZg#eCgYaP1iudXMQ9nNS80nfaP4M=Ii{Rq zOF<9a{+(Kxj|~V0ZV>{gl|e7VX-__Tj>!q95H`Z|=IO*(*^|wU%0%k5O&_T}j_J(Y zp~_F!9IjrcME8>dx(*?@aPRXO?&|)b&ID;c zrFy~ToneOE5lvB#iOgy!U=$mS zR-d|+W)j!3I-}96Al8nT5FB^OosMY5m#~sLTl}vL^~z}a$$qW&JG~$NoFMa^QX1SKEe8LK6UJ#gD4y?+w=7{S5xD%vDLv)H8PS=chsQ**DDPMS5l zL~it>f8S#`SD_jyJ26n|eUylFD9ZudKKW55r)dNa+aSR+2TLji?LX610HUaqJY81& z*#%||RE*-h7$GGo*T`KZ5Za%c-MfSMUsOf;FRBvuZE6EE?$wV&d3scWO=dCpG3$@xO5WvC^JD39qCPL*N+~qirpN5kpG8;9vd8f?n>ywdqrZfW)0laKI|)_Df0s<~Ze2 z!lyrlI}AQ9b@l$xjQX?hMp7SY92rv)tLhv4e+BHf)|Khyn=vm_|8uTWd8&BKObg&T zEW>5BebHOQ$Lg-8E|LxQ?#v_zZ_JPv5niSM|2=PY0}v6sqkfq{0PCJP7{AiMB1^I1 z8X_TB14};CCPRGT5l;2?E@Bz1c_NwMxY^bnERaKaKb6A)S$el1^qm2^r$6n>Ddc+z z^4F07mAsX8^<9#1=i}B@kWCu$uyQBicl(MZoO&r6Oax7RvI?IPFp;3X8~#+=Uz)G$ z@vpHw@YZkpzZ3m_46g9C3gGUBDMxVx%9|F^uveOx$|pOt>E=xXg1gaom4p5HoiQm+ z{%R&?|5K`>19fphYc#2PPl-S+Hs^A+Sj^=P?YsjNka7#9{ZXJCyXi!}(;B?!k19qxlwt={G1@aQ7(fi^1tpsb38?h{lJz^rq?{2{x%`lu%H8rH3Lwua4fRzsiQ5>! zsv>w1mnG+|{)qQ}0TCKAd!R_f>SRA#@E>UnHWkOA^3y)!eKVUmsEa~UdpSdh;hlM% z!qk^n*x(ENo;Ktx7mMPr&6S7dV7lKa*C{NIns$WqIXD37 z3&q&E6gRaFe9z18LOw~-^cubG_P*vv*#lYV^HZUp!~fFP88(eatR-)*w26!vS>i*I zKgQjyGLe0_Q4L z%kTf)QJzEK!bA173K!X0P&41ztNX_Hr&d@tLb~<0Do+XvHNL&}Tp{qCs>1l&$pL<( zWykhhE;G!#0(|Fmspg)uwEHxoUR9W*GEPqo_U>V}L`6GUSQnNYw#2290f7CD^}k@$(v= zUL!ju47@2Br8Ya-4zX0d>)3gtPUw9G`N1}iafZ5|W;=A>a6G~woGtj!rn$wjMN_o# zFT?=LWgVt1n2)o)zgXo?`0RRqltc&bP#YJUM)syOon@BCm9W14?-%bM>GzsLL~;^p4FeaN$Ptt?C~WBXls+IuH$;}%MN1uqoZ{}mCVa!d;yA=j&MUHtS4j}Jywy=cHNw<{b9hj>KxT|tAZ4G%P+(!*-%ewndIWG?ccK3<@1cStkDb;JPb*GMzcACum9ydO}kl`pN zuI34wXwt2?M9WoDk3=J;ZsQnE5&th2VE4~!nI@lpEv|vvc@v1Ht5px#@3jSc-+xvP zAPa#X5X44d<3j77?zH9;*A)VT|mkK8OWhI$5yG-4AO|*{v^6 z<6uJFebsJwOAP&!_4CIKbSB1WjSSSqh&s&fQQQ;k5iWA$Ig6}jBK=ur1!|!iW4CSq zJ+5SbAObLTu@9m)g`$Wu5_A>{pVunX^!_|ABvgIB^q(}Tk$oo2K2>H6YAN0Pnjl+j zP_Sx0Ii)&YZzFf(^Bm4OXb)mUi-K4Huox3fQ>KxW$QTg~enZ8St5uAV5K5cp+<(2E z>!Q142tDqCVO``+-mU(E=9QoAD7W%jcw@p_cg{WoE!1%vVaffBqM>jZGWqq!h@G~o znewj`rG5K)l}yyp4K|9mLX;9zzkL>icR%~2eD`TSwFVY@U&|*(TK%*>f{1~@9ec;UenB(_=(+1XKdH+mT;quX)+Eilk3#S-CPnU57;=< zI_dYutttAeK-Q!AGnk-71os{a1`fRLtDiF6(#@MmvTlNE$LpZ$G;+c`u@gPxBd04{ z)S0_5b}z}!j7~PPypqI<|4~_sRI=tG*nt>{m}*fsO~zT+&n4xffs0c3C%Li%OIiA* z!FD}#ujd+$=PcG!xpv>wcCymO2kZ=eHtlh!)s%zhBb8mP*Mok^G}{>*6b^!}W_EWu z0X2zZwx@i*n1~U8?9JdF%lgcyuhpCQef?Rl=5}>e{OL9%-{nBRc+o6w4H+ewGWr*~ z+k-;K2ojlJYJw51ZXh!V6^M*zzr&*&v|b|PY~I?B1jtL!=gxW^)P!6TI{>R-gV3_> z)t7}~6qg5MF34sM9d@g29pr~!tEpSC{`C$rhKw}==L>P~Nxb});w%3?Kla{R43Mte z{w@Ez#Tr!Ci^KgAfUc2FF9(TURO_RF#>qJ&)eK^9kb9XS<&Ty$&Qeczw|%akXzekq1;k zB0%dw0WJCmwBGWm3)pgo6(1rkL+&t7MS-&2*SD#U#xU0I5pQ(oJgE#lR;jWCcq1PgSu^@jvsxZRgy% z=;b1or#`pV++T&|FMEI+TNVwtTqJ%cTO>jPtUw@em`%u0zC15!k(xW!%z0#u5`t|~e6az6`)Ho-iMw1zL^T#`Jw^I~acR@l;wbh?4)f6n==<$AIS}1lB2w*_FM$JwSX*a7PW+EX9b>?mcaqZtxxYed^} zHW`0N#;?lF<&wd%J`w~FhHze7n-CS?!vJO=o*?NC%$Hg!K&sr346M#<9V8vqju$2C zE|8j;-Y*FKp@-yY-7i9+i>~Z=X%rV&N{@AZPnR!r*C>M0vT}oY%+`pY?!$`S4_JzC z^5bK=c$1HdpX_mV_RhU&BSon4>7fJe5Ag*be&PR5k|p+${%a11ssa)caGx#cNK(@u zURSidQbKA%ZA!_-VlV}G;)IUwCNa>&I9c2De!0CkowT@~PYrOs z#0e}3I%$;=8hl5pzZa9h#T!QAF&Gp;)Iv zARq$LOD!oK(j_9WbhmVebS)i93P_i<)Kbz7D&5^6y-P_qp9fyo^Y(pRf5Z3956kAv znKNfj+-K&T22$-$!%r9663T=DR5M8RG}Q5#2dcs(ylbed?p?C-MX`_&IwKB@{dY2j z6TbE*4lmaR9$V}KKG8rR;fYswsu`dg%>%SgsM8_gq2V~+ZBhPn#J0xPq`{ReK*irb zrDr{rXi^V#nD)X(V{y{OgIk#YDJ&{t_E-s%6}J`jsbqU#Po6(SLxS7*et|ArtvJ^T z0mta>3;3*#5u8!NS4y6tU4myLO{6tHM?){1LNJh>)v&|(4hJVt=mv>1M*>UWMFdT3 z;3=T4T%y60z zPs*492}ppG&aZ)4PJJAOJPlHTFXcVH-kLfbG_H}F{yn=h{5b>f@l2D`a6o?gGhlf; zJzsc6^T70Xk1k!J{ee5_Kqj%!YZ||ehB))SgcnY#z|0)Vu5`&gK_-NNCy@Z?3_~-z z+Hdp4)|~vRIPKBKvx;LDhoO9I9l8H=9~+IBI|+vu574`*=vuI;g$IeY|8ePMM*g6G zy=m$##ug~QZ?+9?8o@T7WRzQ|{B@6+V?xy3z_w(~kj6x{zUtq(p9!7tt*Gh@Zkj*o zd8VqtSJhgO`n&S7q9;iuG)4_M7Yo#W^yV>+^60ro3lVw}|EUOlRl28#rP*%bh{A#n z@a@$$dp)BW@`Imph`pYYmo8&4IGH|an|A-!2u8Q|s|uoL3JeGGw0d< zvpje7DqK$7+!lp1Q#kZSoBdj*47lY{)RR!i+L3E|lgy=)nr1zoZ<(V}A~iBcovzCie%VB;mjvfyUBW zoDV4Op1k}u+h^B6G=kRmdm7NXLK;4K8-Pm6+sMMJt8k%u@5QOzc=)?%6~K+dF@WJk zV0hrO0FD%f7>@)U5CQmi7wV89^AmsQsjdvF$;Bz%gG?_^|K=US2I2sGfC57NLm%yj zTdM4UTf&XSCPy*Yn`f5sAPoQL`oEUsIm2(J*8o-k1tzWthw4s5+Mnh<-oq^7b%Q?P zHS>I=WtS}g&cO73T@PnLecx+UoIUx=jvfLNXY5DOXk1809c zv}Ekx;PqhkB>-Z+;6m`faRz?|-VS`sE|E`VVey00he^79;=f+CHGHGqH(D%3x}Axc znfX9_!uiRYpO~!`m6aUK3~99oKldMZj}%LBMPAug(Arp7SV+#OievU)dUSPk7{r~1 ztM>NQ=vLex%0NhtUm5r%_*oHdX&=@M`uhi%a&~v%#}4PD7;QkI?}48_p@}l=e6bu6 zqMeY*Dt&+?Is2LJxFAP|pe@Hvf|jaxP*&U?M&{@kR;Kzhr|hSNOoV?=b-bH0EQ$ss z49u)-4C8bU9s?FqNmvJ!CwbGkg~{FPD)NNefosa^<}3~4(*HcvANEczoE4E$_!0iFgQqyi zt)g~l!v)HgItKfZXUYw&=FmwdBe5?MUS^9wFW*17U%#e$_XmII+QR{;%Fj zak9~?(?WTZnW5$CLni&T{y~E3KW`xt)lpdDAQXb9Xra-mIpXZt{9m^?KD-q6i=*#hkYg(E3HXHbawqidHJh(ly&I0S5uXv!zPD1VK^(hyTJ%QO4Yfel~EJDCSOvA zI`7As6#GA|X$;eWt4S!bNGa*O792gtuT6fV``j35Mu6kVmkz?Z6(v5{4tq_&ia^OB z;qN2>hh78}u?mf~(8NmoLkD1-K+20eamPO$WJtMqxKdyfnl--gQNA?o#XDm&z(VWl6;gW=QQ*RYg3D$H^MOi@sLmj^0}|jv}q$d zJM2CBLq7ZEt|Okb!}*jprFZ*dkIDb-#2%hw?3?n@m#2v`v1a4 zV-yCL0%7?Vi9ROe?y}yAq^GHQ%Lknq5H` zq|}P1DwXM5|>UO zhpkILSQWcLxC-c#;=3P-8P~H1P;WO$OAp%l;qi)hXBkq_ZuS-G`sBs8dYrE~Zn<|keIwO}lLi{3sm()L6AZ5b+O{ z)YZ@4#R$ZtPdLs9s)w}b{_#E-Z1il^DtbscrQ)9FBS{$TZ@@`RK^)>PdV^I|WJRL8 zb3A&TEMoM!l^iHUTM0Y(-W^j-U&&D>;M*giZlOp#_))1XV0kOZXnro=aw$()gp+Yw zHA}29jmIjum&?!8bgR?Bn;0+SwFy$~0e|rMvN!2d3xyF3S8>z0ciZjRCMhD+THo6O zvU~^Z$%x9e(iEqoj=N{QJLNNBKZovXiH4%1w`X$wTGI!^?lXRlsgq((l9S^{unM<{ z+3Gc`K%=bH*;nE-lTW%NqUca@Ht2&wImTo!3taGv4w@$%NNUbU?$>bGJqPM`pSbju zN|87yQXG?C`7LyHiViI_k45?mZ8EKo5*gWSArZAj=hPMh=g*o#q0r_^`(uRxy+h|# zp6%=3S>xB@p0kuboWa5)DoK}IzjD2kqEQVbpC;YL9W=R2tt)TOO5zzaePre2_xrGSiSXA0j>)KG(TvuyY2m`h_240_h3DE{kyoN@* zASJ^|QGe_rV$^Sh{fwN)`G|q=PIj5UY*`t1H@-=uV_DG;7059n1@#%^{cl`suA9UL z9G*f2^mr<=IxL<>i5=Oicm2ZZxWaiE54R|rG{5A2@y9M@5?9ohpcnY0VZ))3rkPbG z7C4oKOAhXc?xi-beRfW+YDdIAbfQ=}YH?x&doH>qY@}S14?@nzLYYE)#OFSWNhWkg z>g^=zHiKK=(8x|rzkaei-$;TDpAwI#YphO7J!K~RsxG&fi3v50+ofe=-av0zs7GoR z7M_Vp@H;K8sIHbe7!IpS|B-)O$Px3+F<#mrUh9&&fTu*<@oW$4MM5g46d{y1JxpUEk!v zrx`>9+Rq)y?gsA<4Z7Vf%x-z#_VsrCnf|nR;nA+-HqLLnErxaTov)KRv!i1vlfd$K zCmsVUN**{KRlh4kuq6cS;AWn8FfKy5f(W=xLCfk%7Xvd=`!~Bq!O@KOjxIfpxFcib zu7-5#e0&3@m8^A0p7;tr%QnKhFdr%06%4_A>{;Jr)m|(Q&I*0|RX-_aHu)eFOAMh= zUWEpEV=jXR6@||Dq2D!qK*N9QJJ?)ELqBBtv!UnC$k4BYLSXcq0h*=s18GAy{s!uV zW6FsZl`g~7F1bA4B61xXrG2-CQ_6sID|&d$MmpQ(R%X}*|5;7UyH+q{W`)u;JwP;h zkqH18jo~g2n^0yMXm!6{qr4~+cY2S|$*6n6@k~}EjRu5?)MBdAlafuEoE;=;rr7>C zwbrC>OMx=NK0~moaBTh4!WF_;$m2z4vkp8{7W1IlY46GN=kel325-Rgb#@^M5$2mT z@sNX@gbTAEb7hLF>us6p%JY#Agqt!Uo&x7&Uwz;PN(4GkQx!q9*r^8R10;rp#PFq& z!IyZJ9bAR|CZPA+-td>r^V!%WZFkSQ!g^+jvQFM)#WXT9cM}%qG87zd5Z$snZHq-c z7J}|0KY(C+U7%u4u}a&fXS5ijgcw_jPmMm`=B;YmAG}U2`e=$irU+Ku z79`PEh7saf&;ffjhG4ZrLW9e5u$Ldqqf!2cJbKbAAft@Ssp!e&Z^4Oj-LP2oqtDMS z4Mig_-o|?rWyNHhs?>|qkh{c#gVPD$f>EEpGd;?+Kd2&mbHs^BWp=`S-(G82VX|!G zcC7i?9tlASjxudff>S3#;DY7*8G@TlRzjXviatC(IY$LwC|=$)TG1bipl{Lbmc4+U zU24d_LA>L^qaN%HxL5oYnlQv1>NCDeQyX5EzsTvJE9DP0>+DRfm`WAq9@m{0H*v}+vN=6 zdaqux@7~q6qs1?sNP1Aq<$nK}Xshzssoe8Tr}bEc4Ye-g3#mx5hAQ z7qGoP4!4r^qVK@zsyS>IA|+f^-w}I?Gx|hM6$bJLqVs2-T-{BM_xXOE%anm`Nui2< z7mf$`q!o{8&7xZquwjK4Krb;6LZhUIo*V%gdrU=T`bFYR+wBq8uAt9zlfr@Ct(L;O zdW5F+CRfQ?E`r4Cel37SD4`YSDH9p^jTriJL}w89*zI+88OyrbB5;jc?KxG9-i7ZA z3W)NzR@^CB{;U)7S3)l)!0{)kn8(%9dCS!ZsdA^0V+p3RM^>^nAy2T1 z(5>yB_PqH{$_T^JBi2cZ@8xuvF*7Rxg204$;Dp&D6z(3{#rH~?UqOb?w)>9=0GTB2c52cESGuZ#O5jmy%HI7`{8jxz5;(y3rUFw4Dmfs&qS6;D#1am3*wXx)w`&IdbX_=SfTP6y&>!{4>5;-9nV-eI8)48=4S& z2yIY?0`;sa$ykb)E@bD=XT86qsZ}0gRFO%UoNIOmZyu6tqy>YmnrKC!7DM1R?+3#NHNFL^>P}TU)-9(2h6@Em zY(gX!1!}&i1~&^{1$p^m#}0QaN15=6)4ri*oR9^@yF5PI+qPmc4ewzJ`8XPd>G>!4 zGfTD;%OKI!tFeQS4Kj>SVp%XF-zO*kZLrL3fjn@gf=tCaOkxSr_lY_?O_Axh_-pvM zJiq*e^+vau&6oP;7|WFgcqC2RTZWas2zztV#f1$1X6!5|e_#zgG1sn~MpR;RNk~Q# zOo+jnkKHtxX}}e}D>Z;mv%sLD97~KJdOQU(Z(_NWXvFPNh!AsgLN7hGeN)HwQ2`Y( zEbC-CE%5fE%ZBh%oY-xWf-qr;WTu)i^itKQoM>ogAUOsVsjG={iw=WT@3IOThV508 zvyqQSRWgJ(>`03OZDo~a`pXe96rw*5|8Q|L^{C)cdW{rhakN{ITh0~3oYav z;4l?S;nblh($@GMX;B&L~!D{`31Hhh|S zU3?DSXcfw=tnC{U_Td_$Jt2r8=F|J-^!G;^zH)6V5h6@mb6ojtsgCRv?Oa z{>L1D0$ina0z4$f!0;Bn_ULd_7XObQxvi*;AG7!eehd!`4@bpQQ~U8G9920Sg)x?e z>eK!4!t2X}(3C;&EX3TR?L7UwIXNZ6`(VrdY?tkPi2NW!Gp_R30AYoPoQ)hTvxJ9U z561nF>|!0e)X!(JM4EHHXjOTQj32dR`7xc{v)HHECq!F;@CX%5Lg0vvf_vENFK48Z zw8f_NeTL<9LYv=)@I&7P+MvRi0ZU^%qR*j~uR3aOpMO}GkoQ|+ElwlKMNmu<5o`6N zh1S&EecOmZoLHxDd_H;Lk*B`QFPM)`yE@*-aIvNRvLgqTD%w2LcM@iIFDVGrSOdjg z25^S;ZW*T2OHzKbZ?ob98W@lb2pkz9 zaLVq?6#i+Jw&@%>p@Wv&xBU0J`vwWIU8yx(cH`X%LN_a7)p>P7;UaI}IoOPBlm%U# z6D;}^R(zrTj0^5J@sRZ!jEmIYu~|((|I#EjMd={3pJ^ATQc{yQVXM489hj; z139=Clj2cvj382{=>j%C`CCvZst_*Nb)39u(8gGc$4fqj{WD4}>`VJ{$s49ZnNu)o zOl*!?g;=nOW=C0`7fLt*2tp|L0|Whydb_HTiaSXEbkVw6Fh@lC&tWL`K#QzY#Qy7x zJsiY4%#(3f7A%;ON#YZ=U|cw`=+6U(`VrW+5oNZ1H)0 zlXNW#TRp5qKiNI^H>UeF4gDL)71p~QT~6=Ztl3Z{DuUE0S)t;~q~1rSmCV#}fL zJ48cr=KN$TyLMT#)E^~w!OeLP(AE2Jwse=$gzl++j&uxqAa;&SOxJlyf3^A zOa_oY11Nn#wsd424!m;B0>}Hwh-FB@SkMBs?-Yp8Cy{)z} zDxcgLkQ;QSAsWhH4dWB~kzV5Gb8Wm)=QLMj*HXieYcy7KF2&7E4SA~?Z=?SGkx^BS zwExwbd^^68)3Kp$o_wKm#ChmaSdq%G%z)!eD`KU2*HL1p9wO$p*w8RC+rTQq#TK`zh3R#K`f~r>wZ*#_R`T_28d9QZf@qo* zxqxuY_^Zp4&V^~<#H7`)(_bPlliu)VHLDkCM`FhW5ta#A3Z%+z<`S`J36OSHmK#Dh~Y96re5=%=#scA0F>Mw?Z zoQWPU@OY-S-*ZzgaR_qORGH+mGs3!VAf-PiaM4kzQob*Kv~-iQ`7}=5z{@pz!F3t^ zIOJW|+Lb784`ZRB<+D10eXZjS#WpQEFjydNVZrYsi-&imp3hPW=gHE%#88vTO3>zA z-tiC|jDt-KdQAC}hHW5&4Ok?S6l6YOrWR=H$@otb7hBFcRe>O-%w6;gsRQK;C-S}d zu%{Mjj-F0Q$AgtPghPn}Xj6$FVnklWh+LMs*!smmh|j-nL$kN^+*(rPu~~B|>!rQU zK01CfL~(eeAP&+%VPb-`-fcEHA@n8BjZ^v7KJ0k*))@K45CK;PPj!-GmbAUbTbd(xP9FmmYs_@sFer!GEID(oXMZ^AEi~-OsMBL^oH&iaPRpBb z&`ec-(ed+2X#BccH{G_)2EIX*K@)_wK$cO5WW*^D&1x9JzQg%?GNBDv2RBhgNCEdK zLU`bsSI(O)RPM{7Os4Pc59X!441EJG5x2tUF`U(pu83~wDT(o%mcq+5dQml(Onqws zKPF#e5Uatv=iTwNdx_=9#OIlYuHM=pKb0+K`Q(FeTMKO>o6L*#IlhH= z4)f~QWS?8Yx0K4$uEK(45XZ_fJCx}sT%$Tx+2@}qJ;cg7**)jwTL$~0=?jNB{a%a@ z=h8W}yvR6L4L0KB^Uhu0U!soFO9%^>mTrY;Qb7_w#SnQb`?K%-RL+(cApk6b+A@#m zEwu?Hv@e*oM9Z+glud3=K|nk+^96}OlHXl|-q@B!St<)k&|y~a3Ge5S|SUy7O5=2Ap$A|*5I4Ss`>o!2GbZ-Hcr zIsGoKiIw+d(EEDaoP?XxCtxq-;RpptjI0XCiQ zB)u#`1$~yOjMZwPa&Yi0Gv)h!N%O{4N&Z2N=0|&tsd}l7vPU#wOLXLl{6*{#Ru8L2 zZh>9g>fo~i!6!tp?T>x)uR7VS;Ii+Y%M?*0SU0?zML~}@J6@ZlcmaZVIVxGk8KMdi zfM1#3#uWfOQ@Y$clH!DJ%5i#iu5CsPk4ZU8CYFi_BFu;doB};B;RFYJHRi4E{bsctS-jy;SeBaM6Aqy=8# z&5y=y!8&p_r*f7pUk62s3l3|vu= z@i@_$wBzOjc+8MYN4T~*L05&idr!#L34?m_cNkvtbsp$c&VOBzmRnhwGaTsmkWXw&aU@Kv^GY6Yka^xjd-s4IdzyPO^qrbE6yI*E0 zBbC7-Ije}h`JKzRJ`Ak)>r2hF``Uf{F+W6$goU9~*(Ikrl)t}smgdtZ465w0MtT)@ zcj(S+_ZbP*BHdZ*>e|4tVKQ%#qiRGeVZ~okgA5f_1p!0a!)!1FNEgT;sbQhVTKG_`y$x>Mn69?_1Iz6TqxF)drzz7kz zrI;Ut5MswSzA;S7&zyrr35oc6^b|i{EJf7U7N#u?L4Ct#zevlCrpVav*)BpXCLX)X z9qv~vLdd9IrIO1hN1h1dmv1GQYVaFGZM*NH{m)R%g6j*HRQFcc8@#7N1_->C{zqZ^#3I2Eg%T-e_Kx% zGm73f4lU&7NhS5bRc3Rf=0|RC49qpPUR}*K-v}M+@t3rEa#8XHXj;gGMKL9l?=IyB zX?GUK(2p8Ji?A}aZM}_|k9}S*3M*TH6)k5WI+;$Pvn-MptT?6mawl?ygf@>eSM*IM z^Jh7vQ`^(ik}P<)vq88?$P}3IjSbU~p8Q;UFqvL{!zo0kj95O2DNFOO*Y|a$lH9CEub*V4T*gKE z+3NJbLIk||Y!5S3&c8k$@Vxqo2uIlC%#thn!J2+pCp$A;CC9FsP`p~$Ulu5z-XQ83 zoHo#|Z`v&w)LkDFsY^Ah)^U03vQd06=r^2o`+e3_GRw7y)MooxrN$^-iK09iRhbTV z0;8%$Px2?lWXVPs&AP+sueKpFw+;K~^L~etR8VY@{Xge~gOVViRK^Q%o8fW%><9J! zVlxK1h+x+^>{%8Td|8RNfCs8wA1G% zDK;m|c^qC+ou-k`$Oc)NKDTUe_4fBCu9Ha1In}&)&tw36Z@63(Orzym2DQspsClM)klLkRqgwTbLzL#S*a3c1M+Y%Kzerg5mI-99G z>fB$V_WQXLZTs%l%Tq!Iv=_w5Z7^L2x9CZ4+KfJ!{_Liwqm`AFIhg0-4{c+x{Jr}K zQVlH?Rma)$D>~&aglLo7C;Q#p;h0j*{-*iu zN(sH+yl;|Lv92+%vvh#=jgVwvdN4r}e_d3wwI&+nQZo8btSK5ol~Vg>THih{5{Z6e zf#uShyl5hmqd`n0@hIRos?bYtgo6uN2A)y!`Y4FPNAbp;ttwi6>Ht*`XFdTQ1#=Qg ztntlW-=DMe7NW~d0S+D12^03*s34~p0@TS0ij5)MTuYtjQ>~)A#}KZrSQV>qtZ5CO zH^!axQ~~Te9WlhI>xu!%IPp^z+bru!zM3c32+YH$-dmo+l%FE3DVzkz@_4YfmB z%P!bR#UdWrul#vYI(RZo4}bM1{~&fivsi(tg8`gu1Rl2kn#?C>mcY%uV9zGLgvU+K z$npyicJ&=A!X^cJP}56J%z!tp@JC!?HLbkM`kyv4GlljBb#-W`d=QJA|c-Jc|9KG2H}T2Vym z%oFWSFrZoi;{CkgP;M$2+Wf|00V#K&AApdLYyh);qWD^*K<23E@f?CKXV~5Znv#fXs@%T7FWXi1xPek8zzj9OpeSo)N2g?J0wkDAcoS3zEmsHNZ9e0 z4OGHUO??>y2Fh){)8a-UDx9f;p{1qEL;_6e4lW66m8GXo>D;G(J)b6qmC0D4z4Kax zMZ4PTat;2`@@j!aXU~p{^qwKj#5m|*1^=Boe@b8=zGUiG!D3_>>$Zk8{PUXgXRjM{ zOk`kFJ!e`5Ak`{9HrHpCMsCD|OW)Ow+$<970kM)VjiV~6nSYHo<9bXUlRsrm^NEqT zw%eqaK6+| zX8o@W0&@y`WHhGlU@iGqkpB1J1Bk@QPxdj4e_Q-#PTKVWW;HEMg#I1a{~j(RfZigE z^6>v{@t^+un*fn?Zz;n54`qiTKyO4{@96)Lmw%dlgyaseXx~ef^uLrn1$tu(jaB$Z z`2IJHeL#j5PYZbeOBoT+n;{lW#{XLU=hFpXF*G9N?fy#{8{l%bzI-bX@V^oK?Vz4n zEZJo`ZSKF6{XYi(JN5sM!T$)x|C8W<7xe#Ms|XNsz=FP?>^=;;)&i^sW9pqG;WwZI zpxQMKXh!Q2EVzV=aZgM}RJ+O=T9cGUx7SXf@iybAvz{li8CueppL z^&fsN1Fk)kFV6)%V1@|YR);BIfNf7w10E1(P@ZN&UsvWi2N;+|dvNefg4iYz(3mNA z(wE3JGKuXcy*h2}l|%3-FMf*tD`>#F`Fz->qid**&2y38;fgAG)F&=M7$0%3{lu&Gzwsz5SE;?+Dg+wV3$@{i=i$^-kGkmg=(i zDw`K|>Ad?bhLCC%EV@mu1fVVY7@B|mMU{OK659Cj-1}c!;s5B`AIXo5IDb8f+@!`O zLT*5cO)stAX3B^Z2mAx9XC(5#mIVqf0}k-Y^P7`A@U+H%>GMvF8C_~YFmW(U1Na1A@IzXScdXEh<#_RBj4t4mvn&hkoYFT8Bgr% z0$@%y6d* zt10__-aYQS!(*B9Wtz>#hdKc%944Vw=l)2K^ML%wuydoeUr|o?x94eI!~9!hJ2REJ zCZw6ZS5}um{#iOkMi~mvb-d|$5?Ci&+l>lXA)TR{+&%qdZ+=?UE|=qB6uN++s>>@v zLqef`4gx^YA2I~AxKZqvyVb*eT{xm-V?kc0@LpwUaynt}voBL+x=FeR1qvBVEnWmd zu+8dWk@&<{x{12_3PeB>`WkMlu^(g?A|q2BGr>=gkYCW&y%Ww@cmQ z7qLap&E@eRqv+j5E}7em(dM$>?P-z~!uNWQK7m>DOfAg{3*axV9l-1FQVkTy=wD>~ z*|otU26{utqv-K8($Qa<_8a>v^WB#`3%B_bnAF3)9MI!OX`n~F^c$%*Fb=MGAbmOT zesK>>zsWQUdd899b22LJG$unYRW1R0@Pj;*04JeCJX;3+M>QZBnbOPG&=|Mmhp*-P z-d-Iox-a)u7VqBJQFxoUBrL>{7fJ{KAr}s<`E)#4`k-dw;C@9?j372@*qb> z|B()Ky%`$$gl5Gd;6_-GPSiU>t#6*@le+aqQ}qe!CQ1%Dxb5QiQ>&%sh7Tk8aZw~Z zocA!@I@k@6tUW}ey!j{`i&A8PMSgOu#zwPR?d&5>H2eK+`(vD*9I1#r{U*06i(v|9 z!}Y6EM80~72B+_h2S7j+|1cxOdOMBXD3Bl4QL9m=EHo%faSje7|lEUb|46S3)s~8)bo=h3@l0$-!MeF_D?P?fh>b)qUwAvIgRaP)4dUF_5sTQxQ zz%O-me&DcM^KE*e!FjN4(xBV2?+fD*z?HNta_`+rl`%T}HSjgn=9$c#n zK#X<@NAuXwFQhlwbqlxDuoK<&fD;ka>B)z()}&xOE#UkiOas% zgTZopLHd_KTJepQAe?6y@oroCo*N0Ac5~d$J**IG&_t`{M;0BheCqnkh0@uD6~sAE zF{FZRN;sv)W;$^&jc@);T(b2{)q;_y9{xl~=k9Wg5GGhc z*@4x&gbsMk!hmmj{wtV}I3Q3u=;jrMRgK)O<>wV|aF7K!BD9)-StEJGWhDSDb)%dl zkh|HEVO*Q-6;MPZ^<;aLhSp^Vk~Z|j8dU8jKlwE`djfz#Y`6Y&Q#!!T+wO0NQL+?8 zZ@)X5kS)I0-bga!<#GdxSQKLesGqGZIm3Lfb3K{E1k*y2rx|YhEmUIh zo3#FS-zJqY_M#4Dg!O1n$b!%DpgEyhgn=P~kp#?VJM+GCeWfF4(6cdETc76yp<<2+ zXbT`%>dd2*P7tBOMF87}T9o2`b)t+?wEQg-P%I*F7#6Y0%SSv6JN92SUXIfxk}Q2+ za2b~ezlX1Jo-Dg%%Oy4GoFDJ-aHr3O$Y2Y5VZS0FbWKuuMPkZ>W$m$0X%eOlFYZw9 z2Pz^^H$EN zV#@Vur*QrZ0jShO&*ROM{Ic^!_bh(Hq;ERa`3g;~iQEutL!MHbO5XWVKQ`T3h{EgD z;FeBP9i7yHR315Qkd4vfOqKiaLkS?Fr2^C<7B->06v!Sh89=%sj@eNstoV*>B?|<1 zz1Hf`5WJ``lQZVZv9V6cV$uZ=qHbQhIa5;bLH$~Er*y*2$++TJg^{G{q*;=_xkOIl z-h7>$wRJH@%p7Y5bo>}r{~Oa;h?%*6*SI+5XZ>O4(?Q|SQgR;vwBoMO6=7~rkbPcU z0;}3fvUkiSU7R6czL+CtmP<|-fi_yj5Mp1NNShNrdh}#o=8d?Tz?znec^o@&eA^&5 z2@=ZxG51b@nM-`kloXjN#vdZHs8#^vB`!$OU;t*Gbk%Zn<10`g4SOf_33E&LFd&Ys zgyPB@@BJ~p{tS_6S*~W>QF7W6Al`a z7`>J*8w?GPt|I{R&?2fuYJ!_AI6WQ)QL{|J3fK-2d?0T93nBa)!9wRhF@(zK4;7sg z!lA*9f<>;wUs=&64++TFc@``!$8q!J_)jT>vF)zfR)EoMZkJ{cG3iuW)h)WEr9daL ztdhr!Us*wq2l<}5GfbK^?y6hdm0Hlkpo{|G&HokJEeu8cG!hep}Ztaf^NH(`^y7E zL%iAQe3zAgE|?&9)-2PZo3FKtmt$+0*!@wQzx_lgA0ytO`A?|J!P26hqWkEiW2t!a z_L{QKb(45Et{7dk5ca{2$ftMdCONjI;|^pz&}A(Lh{m;a01qR zz2D>n$Sxs;^>Qn8b&W01oo^D~Wm{MZtr+BlZOtgL2?H zC*WX^2ec;=JpZ4MCySQ2)+tsNp^M66iX_vE@eozoZRVUM2D1N z?y9UiA@;L)lABU*Lf19&#ToExEVytS$pv>Loa5G^B}*kM#8Q}V6w|7a`y4cV?crr!3DaTGp7ZFQM@^w-wYqTieGFj+&fNQXtrUr%0 zd9t;}c2>ou)_tM=!)EVi~)AbGGndSv@O0JCY;Sm>2A(Z=JPIZRkCP` z&XKL_$F(Pj41G9K)g50w#2W!Gfu;Lv#(z`~<%Sg){WW^G+x>5T2pp1M{o?ifeD#bzr zKBm4{Hfc3Iar7}mc)EGP{s9X+|1Vhhc7BbKc#xJZ zw_&eRY%}S3&rP35Z~-}J$F)gds=;oMyW3>vv{B&6%tO$|EJAI6;jxz~BO>z;;P4F{ zus~AZROtc7TnEJVnQ=BPNdWCTds>dEgAS8t6PKM~nqFBYt)`8sH;ctJN$)IxSZf(4 zV9As%{^DzkfLUIAtY1}Ks871W9(s!R7u)&&nYjO6={{U^E(1*Z@TZ{W&0P^1t55oamkC{eX@E@B0Md1Qo0wK1wlZHO79?@giu1S2{k}S0!bj$&{b5LfC$n%3W@?!q!*~XBlXK_J zlg^!^=%&61wCp}9IzD%f=D-_l<&7h{V6ez@{8F0#-tkL{qusr{`K3Vol9FI7(#hM? z9S__B?KpR5j0*h~ONiS`$k@x>0dCbjJg`Vhq@y0j zn_p5(MoLapN)~7q($hB6hw@8m0{2*q8xpuckWOyyha+0DFveH1u|L#vqLP}ItR03!-MYte5G5^Nx2@6@Wpy7G9c?L_M$>2#v#vYhq!Z zRzAS?JY{^mO}r)WS`dF9g1(=nl%J~(%w5hKZRum^B`Xb6@KyIR29!Wc*Wb+3)K$k= z*A$|or!Iqamz6?69Ocn^j;3zj`s!$Zw3h+I6ioD!z?wmH)x}MWwLJYbHL-95td{}C zndqbd(>HNLnHi}&`AHBgfElGd)V*ai3wZ*1}cK31y|P zX$Hl4Vc^cXekQsw6ALqWECCJCLmTN?S`oYz#7%(bBycbjQ>>h>x}iC+9}Qo9O*uCy zw44sa3+@HAFxG=h1%M>Xpm0kc2?bXl18Eb8uBN}NP5@rkzz3{t>|`W~GzW+QYf9ie z)unJ+ZkC>YShTO32FA!s9qK8K@(%!+%eZPo%$?9~t`NA3p{WxADPuxZ$C~=WP)@#3 zT^)T5xVw(Gr>7;{R2GlKq9t+q`Vb-lWS}pt;jIf$<*0-AHx3|5xS;*rq=*D>1A>Ph zRKvsw=yLMbL18f#5VVFf9wY})f*?RWAVec|Pgf^tl)Sv2g|E4nwv)LyR>L3a?XK?& zv(z#YN4o`RqGXT~ng}gPyt&NZWtW{Q#o^}tEH5qk%lH(-U15fm6ksUB7ub(ctJG57$VFIV`=Vf;YV~P_gKkc zr7eLQ6Qs7Kxx5vTfR&c9^71h?aRP}5w((Z|n7Urx#wUc*3K!o=4SWoQiam<8bB5Io2S zi$@uoqooWG#&XWCE`SjN9!U!hxH>IOuqlY>jo0(BFt;%FbCHw6TN%o`8iR4N1Yi`* z)De&NFfi5E!r-;_T+Q7f+PW}^C(eZYsF{}q0=U3jHNkoY5Gf~+1QBZ}XW{As(b583 zn}(DL4)5oR(~*Z0kWwaIvRJa_!a>>|NEaWV1>s@ht!EaXBab6$Ys)|&nnt>2-bi0_ zM+uw;20_rn5TJUN5Tpf?0F#!nfT87qwOsLTL~~t&w+>ndBju!vlk-*}f=%5Oh}zPw z5}G8JY$tnBe7%&8-MN7(*|4umuol zv^=G?kyuSFOL4%9N=uu-tSpS2oV|^806o>xmUh z$9n*aBay%a8hCYIhzZDF%K$8C=;A3!Bzpxbh`byeVl1WO39}*^BH$niXH6p$KufeV z_KU~sZ8)(95Nuy0rR)CdhKr}4X!G1^&J#(B%0Kt$b1CvlU1KJHu9JPtM znkcXt+T7C!jdXR>vM@IU8Tw-^jQ!0ljmdEe@S$2{SK}-1Bj7O_rYL!D83If~#s%-@5n%2u49~`K`hPvAev}nCkePe+*1dlp)aoC ztuJR}MD~eR5KRc)6K{e6;jFYEfD3ei129R`2yUq>r){YL7`m1@!OO+f!cyG8$=gX= zouH{;<|66qBJ1m6zocq-Hd3rl6fh}bcnq(6gMaz^9yy4!(>(S1I#Ajci!0Qd(cUL{{8+(cdr5XM{$De_;)RtvV-eG`G-Gr z)p2Zd_qHj%w{^A;cIVDtu2cQOK#G2}E;FAms&ZBTYEufZf`Ehir|@>ENoHU@mP-^& z&2=0{IN4$v(dg%wNu$R~2W`UX*-y-f7ROW77Tz@BIraWsOQyLdLdU9;kgF z+*5g-uEDYWVM(B#fpll#;RH5(-B_7KyP5fUk^{fn2rsx^iA;Nk7cFlEm{6li!A4qB z)mq_U-q5CeLHw}~VG(+vT)sVVhjcq0FvjgQWqr)baTd+wNOl76?4*g-oJWk-#%xHdi^8HS#sDyLT3p1}s zI4KG-a%=RZNz?kinNd?n($Q;KfEz=yjw@o!Mppo8imu=FO{5{RQN-U-_^TAOeaygM z(OaR|*|=#yd6$*MJMMcZgQnCS>tUVBJpZ-PLWKOxO-0`fnwtCM&8TRsa5HZ>QwH38 z{&N0{@?4WYGsVj&lmzHMbZ4mnL<>IS-Frw=!w)=wR}fxdVcsCiq|rI2@m2ai*V=Tv zAuw*7p7DMc)puRs77mF$aiRR5rz!kmdv#Cg(>{EqemkNS43*z{-z4D_SInfHpHESd zkQ;-)h%;j@XroFw$Nc=|xo8xOP%a_xiHegK*gua=P}va^1InO+=sQW_NNRWr3@E+s zx+cUd#0C%&ec`^`SE`f;w?56Jx>M2f0FP*1d{Lhp0Q8xwKAr${=m)^&`o9|=yr7?2 zX^3S+E^*>*lfiFBrFdM>$j6Gj^T9hKgdmA&j$^MmAq`EMpC$TZ4FRS_5rK=}bVzk2U*vE+I zCbZinw|kY*Q{4YVrIZGc9LHt1#>wnqPgy(qwrl9;<2V)CkcaV6ienY)g8P5>ep1uX zwKdsS-yKV8?C3Tt30sz9>Yq>jVb$yzUk2YQw(k1+RV#AJAyJ4CTdI&g%+D{FZ?dYT zt>2hF)Lv7^!dbm?!vZ2^8-;eprroLn5%lTt}f6}=A_Xp>7A z+!uZ}O?%v5Gke%xaX;qbQ45t)9Iz=8hv^z4v(W_#+ZOf3lJzGYs+2rs#jJl1-Y$$I zx~o?4e_Q*1#Epf+RiagQS6WjT!!|KzanU`<-%Edqt2j;Pdh2Ar{*f%NZDslVxXO$CsR?r&jLr}ISYe-1Q)foC{l)<(6{wuBQfJ-qF0yOyv z?+h)VZAOnC+>b^@Ju}(d+`QvCe8&@{$0HJ5%>5C8d>0{9W;1i}&b=USQm_@g-Ffya z3@%f|UTf%lOHPixsj2De=;1dzLSg$i>=^2}Ka74VoyN(y5zcB%GEo}*_Pew> z^C7s~B8t@AnWXvhE30un+??*LQuWu;gl)sw#9*;_j-TPC92lD&eBjd`HwNLxKQz|7 zlp3?$=3ek{SMt>F_%X2=lc3e_dcHkmA!5TLND5a#4E-{3J+HCbvLr9KbFVG1QY?-4 z6M1=F#<|Nj=3bGLE9@VVF0L@Zl_L>)C49-Em zqgUx?nN{I%38J2Q6RNBKcw$9*PJ=%C(~FJ4B$J}+;FSQ~xzWM-^*3eA;-Q<88Ona@ z&yHF}(jr4UV>zR=t}KVCOg8v%^w~x*(@!i0&iDG3PQ5G3XW-;?-c=sl|8=pZ&;a-T zXN``{(Xp4I)6(#)v1q~jn!Y4rQ)2JF^To{(3icm$`GYn>1cP=yA6al;zUvvL zh?W+VV)PF=-MA9TOJ%=NHeXXi<^qEZGA+vv+>ko0m%8sx!TkDhNXE=39(yE4lsR zZP-Js2dyS_DIG6}ey^)ewfX_&m0N3@=(DA0m%pzSleEIG zE=7O%V6=1Q{dj-zyXw*7H>!RrSIyTYguRX(cZ}#(25AKiGPPC%xhwtSQr3)55xo~1 z4lN3UhWpYEWvbSXujpC4|GEb|iwn$Ihj8a$Sz9Hy5ZODeT|7^<)Bn&1bVr%6{A4_1 zX&#V)-}-d2OUM4h-H?HlB_I0QTqtR_dOE!QmISADW7ANst)%-!yU@S<73$obBV?|%K_jAgH1WO*>EtB(c6qoRz?YR_(sH613^#O9UW?)U?b zx~88hOWSxD%&WpDp`TYr%E?WUM%EF{V+pId|pC=~Q$#ENHEM~R-} z%DCP*vI~1}r$~ZMu+L=& z`ym-i9XD-24}QF3ufmR-F09*!pS5?9npq|#%y!p~b+EQ?EIvv~hunB?)p*s%bqKTy zA8J3&Zyc!9nEhj6=rEXu%!{pTd5vF%@1NG|L_|=xK96@Qb2*8d@zOzCM=Keo9A|Fc zpCQ>=d$@-MEN-d0$6G-I-V}B{=td;AS8%e7UIf671@#Bw{P-gp@rRB)QwB2!8_f`c zdj;e|xJqMPG&0T%%GV3IdMp4EULAeiSbv)?6kg5A9i((_uqpdqUVq`)PxlEyeZ9Aa z*~;NPJ;DSk=)xK|O*)HAiIIwIHjypcw&AvNLd zTET281jqI7Mapa*e_LLsj@REsFH^s?51n)hVp#kEtA#1ulVl$i0(b~S+9qc!1$7lO}XQ$S)*SlCm*0vt<%*ud0h4Q4Fc7qt>3tj~MrgN1gs)4Na+eN`XlWWHh z%}e^CP?A4NG}+%|3W7v9%ypHT$3L>qi@@)u<#P{k$hm{lE$ISZ z;*dSQAf>${?;3{lW{bI0;PE#MmKgi};&&**?E(+@5h<=u4|WdSti+e^zng&t7@=`Sufr{)=xR8%U`pNU z@i=m_@r1lb5%L~Y$Z*tW?-=o#^Ug}AoJcZ$_YF_E4r3By*rkYO)tf3>w;A$1H{$Hu zR5TUk6eO#j661E~ubyEu_N}9qxK#Zw``nOWUspc*o6L=%?Ou#74859Zad@i+|I;xhQh@@K%G!W=kX$e9 z1L*eLJ*d*4rw8Wf%OWD%q3e^1MfFG>sw*LXw zQ~+*OMzGY6W`_$+&@1ldDm;btOe(L%x6^5`S3&N{J+Y|8 zvdYkLc*}=JZJ3r`5T7Q~PU7cu-nlz(-_D>jUNAD|V7uB9zYfoK=AiaO9o-d>J0B;u zj|WNPn>)0tZ68@~<}1%vN@w(aF3_mL#MKrf$2t9dH}ur`XGX{8#c;Jb3Q**kyK25p z{!_=k{$Eb;19iqJYsZ_Mq3i&#&ZQs(i=6zN7y)UMQ zIpQvBs@#PO>;d8@r{$@#yX;v&|0;det$Isb92B& zq6QZeKGwxXp~?|ypL)K}zanHm%yX)CFXX#j_X6gX$P%*;k3um~i)0bmDpd#J2gpHJ zrPJo{pIS=GQY9MMFX<+y&{U6yy-WRF;^gi!l77jCiZr{uIZK48())KDQ&eW&)-03? zaR-?6qb5G**GFV#R~4>yXl@}!HNx5Xx0|%M1%IxcVo{>J&V!}3QG~YhJf8pFZ#vIl z&s>^fDt!+HKd-nGAX!!WO-@UL&W#2O_8TfLh&TMg=hxJO++oCr%N`XtquN!-Jl+_nH^iT?= zR`MKil|-YAF9t`AZ~Gh2+um;RZKO0}!S-P2cw^^&CjXWk^g#Ev*ei{9s*7)w?$A~z z_Qy44EBc*{)KEg|3je&KfM1!3f zJOz6s3c}g_^=r%MHaqBL(aU?OkuG1ZBKu3mU)ApOxCZo1kP2cY}k2Y2VFkkzh*ooV7z2m3>aXg}tS- z)oNP5{I$hUXM5>;5n}kbF<`Z>tLG*o7yc!8uZ$vBToNjs%{82BV!#h};Q4#&X7mDA zzWc_b|G%7&o@+$!Uu|UD4XOE0V+BI%1 z|Il&f=X#iJ&+sU3V!w--S+UR{n>COg^Y-sxF?=Qx!d>O|_7&%Y>h;4bs<@w`Nd#3O z7pf`UZ1hY)a!4{7RS^4XsyGy?XBio67%31>w?mc7Hje+c8TU>K0!~GuZ$eMNh%9h+ zc7J>_4N>9$&5j#0F8bN8QhopbWUppNMjy`X41m-xdGg!@V0z+!hq`>;Wg93SSqTEg zjdeOhUI+Q2yEILok!F5otkEdLI_6rjr};&mIW)yR5cADdvZk$&H7z#riX;$J>47PB zjb_};z-svyDA%}P1#FWrrFY0zBZl=f{YtM6x}K0LeYd25agyheUcgc#5P*WF!`9@U^?@zygo~P%ZM>jH3tyDkF)&Ec7?6*4UUm{3s81y88>W z!rim7A>47ZYqOtDzi6wyo=J_3>DF()sIR7je)RP#^<#aBhmJsHs5a%3R|WLbHURv0 zk0s{0Bq{dzbA~Bkn6+i@zz!--o*a`+;X3W@=kt8*0#h_(I$DH0xl&Ht3Ey1qa`Spw&p z#!NQ;(j#>NZi!RCXoN(wDngYW_mqZ$fLc*dP|&_TJApcF>_Uie7BW*93#9;<#`@r^ zKy=uH|Jx0XvxL)v-4fcp2KEWKYM$q8KzVY-8J(Z5&N0-6J9dNsU}%GmQk0QYr^BHf zmJ}7hsI;ogM!I`Ltkmaad&Th8#zLQr_KLz7p*=`3nd3flBklq@S1F^S7v9HQQrNPg zW89m1yZ*UUKy2KiQ+mfy45k#gITdIz3|z@F`K|{DJD@XG8Aa)OYl>;JCmuCCd6~bU zku)>j%#Z6{6=%hG+=zM zw<9>b9zB?TQ$)MbyZt-AC}XPAd?NZmT6+c1w%ktz+Aua>^RX_IGhlGoT%nRK0n*+F zKdEeZv!n#@=cdlziaYaR41fN|R$&XfCp|?==GgQt@8La-S?-6=M}D+VQ&xYWa^}l% z+00<8rZ`O8?$`SMM7BH^3msu#7P?B-&M-w_NJIF8nHdGIRtjgM7V(6xidWpPwWXV7 zl`NkpKo-5>RknSBYtCzLm&hvn^Lbh81%RHO>PyTX^uQE9oj6ATuk)5n*PtN&L7YyT z488v`9KnT<658qkO0j|^f;-XwRz^QRd!R*2_4v)z%aAN{Ip-A*1QnX=ThJV^GoYB6 z3b073bi{Wx$_KD85{s-Lx$audhYV}i2aJFacdnX5MF%iwRw$MF0X;oUUTWhqe5`EZmGs?tk(m;=`+=gK!%`N=j{Ku&oo8%2scRz zKeDN15O8vy_)flCHN4y$3!-~WN5;}*d340N0Yx{51VA9L>JU|Y=*NeAeWI~7gXK7V z5rb<~Oi5CTGLe>vqzd`YQJ=sD zzNRx^baw%x+?+Hp$RK|C~^~qkl#MXFJpwOnw-CNJ&KX5B3 zT&IqBAO2t??e0d3tup|S^vR@{HosCP+1Tjh%n1XO%=O|F$b3wgs!6M7?C0ltDte%b zZn?|%%8|p*tJEVD2nT%;rA8MXR_=@RqXacMe$tJ-5h&V7%_PsLOvS=Zy1u;2hob~% z-RZ7k@%L#CJt<0lQh?Rj9};r=t2W>8oo><49^5x{d(KYZ_vkb+1KeHZG~^{%Uicpg z)?eBMOzjd-PSklx_6MFLBN&048)O&q*1m*QZH{yYCl91~u_N?BHCK;0%z?0QxBq(t z0sU#~n|GI@HybQ8Q}f4q=W{RqFRO>_3hBHg;jEiCteQstl9eS(q52Iqz_us{WIps0 z0+8-atqxW|&pjSIpl#b$dDUNz1B}hPzk(&wcgXE5?Ki{DQdqx=Cw-7cT7g$1n=z5Ziy^iFe zUOcAx`K|p9&?m8i+g)7X_ab`uw5zGjT;Q>cRhPei6fJj?$L`52XtI%X`#7rr;Q}ww z`fVp^V?wDk9Ie?$xj2A$rK8q6qacDmzjJ3HH|7m3&bf7_tqUjhkeAtE)5iHR7Kj56 zDXD=tFgR>7=U+^S+sLdO7xgc`!ydU|Xx}H8_P4O~)=6hr*YWB#Pf@`r?XpV2amKSp zr+)O5+$FTDd_LRYa#NJM=3&&&oW^f`V})G}e5WaPq?y!(#(H3pl{LP$Qw0q`z4$8k z;Q~3FfDpcxA-jPHbnaia5EPc5_Zi-*^wO*Fm6E-waaa)M*jzrrzc?z8r`%l5s5My0 zuIS%GA603Ya%Sum=rLC-u6^uZ2H1?v`~6x%D$U|QSq9bQlw{F;u5dn*JRd{K=34UWm@w-V8lEy7!w!CR8}kbPy(LCKZ1IKunYmF7QxUoZT1 z-W1+;MtE%j3=kGGteU?_R`AcaKF~tXJq@=4v++ga)nXT{)zqQixx4aej4sRs+&HqcWQ@UFO(B49GX7p zTqhSN83ock|2Mpl0UZSZO<8z>xSMg@?)qdxF6Bzdu8Pz&RPWVb(n$$AefLJ85b^u> zl8t7sBR;fLuWPvMx}vm-GngbAmF>P#ZjasR6qCL--8g=0e^j8w zFiLH5-=X6tbtPqBjvi_K$+=(KE8kyD>6Y+3PtS~+ct*89=iDkL{!J#v^B&nMf!B-* zb?IH*&_`m@8-Fb)vvB<3iMV%UT=()SXMHc#L^e63d>b*3T2a_7gSZqI{z2bEZ=k*G1d!!z#J(MA&zZv}>&) zGjlr2@pXwwuH8<}Z%$$F);VrGTl`b`c-+HVW2t;HUWt$?tRy@hZKoE$u!Z*@EHj0E z(pD4LoWOsgx_!jaMEj=A+3un2@GUCuCb$hvLwc|(?|mBnzh64sNEgf{PI3NAst?co z=PbZKui4GIxJF;%DH;jxV~sxkmXuzk?vD>kIJRkA||;K zx|xHPb|PI$dE&x_Q1?%%>*kGd7vF~PSgADG$Dayf0NBr-)~_36W*)EYi3HT{idE_ZC?3) z6@Aqu6^+W;#T$?}S4;BnUfRtqtC)V+w6P~6O#h{?x3##(W)}7N1~=8w(G7b+=ed#N zXG_Mxcb(%_borI9QBIP%qa;^KGJRomP{`XeGw-h>`Zv1x*kd1tz zn&Tw{nMU@=N-Pk8R8*b{5Bl-;_cdL0HMu!3SWk2D@SaZ1;r#8nf`V=rK%A@=lix$( zRlx@bW#vbt8Cc1k7GDxhiE`{gDaC>guSBC#+qOq^2E_?8 zAX0;Ijb#+m{_>nZ5Z9PoW&xMlrT&S3=3st7^%~zhfjSr{D%1aFMGZZr>y0E8`(@c) zVbA4fjrZ$*VL~(Bau0lDZJBiAKYU)kBUctQ4&(YU76;prfMoqn;lXOc0GoXIyZgr~ zkgvd+kmJHxt98HkdG7%>yN&w{__Q13uwiPsP9ZYRHv0DU`)}a=YEb$SgG@uCLweQb zIVLUPm+d7srwWdR$4_}Wl*g0DV%7V8-yW537e2m5;gezi=*`pgNl&|tm&wd5Cz@qW#!i>KdJ{E>~CaxEcK%I#+BgCbD^TwwawEiA$ zesrok^AkHH5RcV6YC@<}`|ql}ItySq+y{*w$B)sxVU2!pLqhv#;P$v5#i@}pZq`-k z{@@2WsNV)%Nt3F%Z1Y!FGi@ce^lOh>U&}f@zZp7Ma>~*n=3?wlX*Z9ATf+#6lJ18Q&|af1H-@xne{$tjv)Fi(D({$_%C(fT%Z$or;& zwU13+@lCV#^{d9Aj%%RoLD`kgm}$Mt-Odk~F{7^{YppY|D^mT@!HK3y+vPa1rg-PY zI?nE@Kg5jpJM#N4Bfv(f^OD5hip-voD7&iFI*IMJq&aw1=KnzC!ak>2C4xt-A@oz& zKYA^+rR0K)=W7U&;5Xjv%%xP0>{)J2lIP47k$V>|@%3H|VhMP6hOnI9)bky`w}}pZ zT#1Qd6381}9Nyr+3aPwzDi2)=7U1FDn?TRKUW)1glCDd=CiJUO88fLBxWGmInLPZL zcyVY=5&8U$=oY-mWsZsD-6thTm*8&G(EGxMrj<%AEnJ$r_8-sU3>+xh%-9%>s>k1F zoPHfq1V9IdcPzj4VGXp`FBx!P6&>QRW)sqMO*{w9MmjYwdfz7`w?F*;BDnd3gOiJU z6w{@jkwMn6=ZESiep{EZk4sZx<3jnliUkkBjLYNqMNCMalT$3K>ZG@l98}^iF%hQ=LSJBWyMlL=bk~$T@ST zcdrLu`uT9M{g-N_`wA1hsu%U^t4crCh(DSkh@*(FaL`(QZwFrvcQFv`Jl3_7rI3lW~z z&NA>rw)kPr{m6Q(F-gB$Z9bAX@$0m-E7mpyrb@VT;9cA82adYt=BUT>h9Ki)|2LVL z5ZKvlu>M7~Igy+uux6`IJQ$=BZm$rPVh*I|)T%hTp}}!&@%c~R^8yY=)v<5P%@6X6 zUP$gx@9u$fI;xGh|JM3DDA%EVURGl`##S6RZDkO^y4`45i^H$AT>SsLC@lE z$78{!7f}5n^u&qJxO~}^I`H%~C@Wz~->!i+axkQPJPR54`cgy0hTNGTw$tyFtuBm3 zLUwxVTT?+iebc#g=UuHvrSKp0_W&QD=fO!dTHFAC%l+`ezH}G ztrrDqW@*RvL7NxYL~SCzBnajsyOWC6(||I`Hc&c|;xhl}yDcV9Sju4Nrin4{&Fe=eG3yCAwmZY-D~&|jankL`y+31YFIzWt zPtcpy7(!bWrm@3xciJUD7H$#OwvxQevV5{JUB^5^R8rsfKseBDmI7?O#;H(_i7w%D9 z@WEPOa^X&Dfb+r}PuC>-=TkrKq~L?)3&);g8_FLxGoSYFf4iad>Brxzax3brb6=}O zo&#mOocm$*EmS~-=pTLUZqLL0A@cumaB(aB`0*>BuP=RBXKjuKlMtY*-`LT1wl|Pm&JL|L>8cAd zy-i>7+g`2MQ%JSG&^DMqK06`JE=Soki#2I?TX(Y|a1XySQOj(odLn&8#&yoFqSwG3 z{YRPR_tca_(9Qs)0}dR*q(41cSEb{WHws!~1e5XTGh3aemr-A&*dvBnf~zb+_e8Sn z?R}~0#U{$5j*~@Wj2g{8>Spl`{)xWm0txk<;@#6v+__ z%eS-I3l{EonqU9>>cDOCgM(Qv|B&BfDgISmyGm2xmj!#2Zpo0hctds5z7Nmttv%$hFH!$GrrJAJN+6bhP{%!|uI^MdJ-g@5b@j|MzNNZmxFdaN z?+UHP%ih*_egPRk$e)K|>da328QAuZ zN8dh3Ph141x*PD8xHeiL*mSaM4b4`$X^T+wcyRz~yv9eW2jX56Ewn?pl|TPRO9mTR5Mo~2%8qLZdn;0mt3Wi(6{+t>8@wWi? z?U?!A%!)_bn9Yl;rIm$EH}!==XrfW=j9%x-fK-hPNXOnFpU$Q~ySe}iww#Stx3AP{Kk z3A^2=3N2Qp-g2j)1)zv?pc;N{CE$W zN!yzY#j-vzXf7oUI8tQM_yR=GJk;Sx76> zVX72rX6&Qe;`g`Az_MY=fxFbkdc#I6DPN~s!^<#(0>^)c?cdlpt7HXj=}5c%pd%0n z7sd+e3JtS6%8}h3YZD6J-bTr3ZrsO$Ct(znq32ce8v~f4h3XdTX=jP@dI%98+)cM?-nVoI7Vl2FCPIqL% zDrV7Ef!P_YJb47Fd;u}n9}lFlU#YuglX@5=!jn_{(m9jsiXcam)6z?t&xf&BdO%B$ zG%dw<7Aj`8N!FIF>3c~}8mo#w3Pvs*eGQ*3E8;I(>hj6Z@A(wQ+WO>EXeID7v>4ub zFM7L`&w;uMtcLYupcBg`%lN@o2&(AgZg(^TtgJ}Y1>Ed^HuXN}5 zMMqKBR=B6{dW2TZa{l0Iuq@lDPm*jBUGEwshnH zROAo2mBtGBbVtK+eft$w1(hlT+u@{;@LBL~5W#>|;b-TWdf6*(H4|@$vb>&_^mY>Y~}B1#YRj(;2|hsM%e`SgoEEvjU|H@YriH>x?^@^a_5-M=6HwCVRK zdyIP6R~1L5^sDvDMsqD2MC|>lsTM9uzTC2MJ~@WIx69>;he#3VBI0;(2yxwCC1lq3 z;c&uFkwW}Ty>hb0eiXuBz=rFPh@8F5j)|>&!};)yLuk)^?+b-Y-_&t?!8J_0VKVz6 zlgO3Gdj4O5#p>6CzUMvqN#7f_td)2VVFf>CTm0`q=7gE0tJU2=ZWqpEWT#Yme12GK zFl#|6LAhSV!hU!}*&xD}sS;%!_rX6{4SR>@+1ppE`|Qc8X~-eFeOmgQl|{K2O+TMS z#|ijRAp_g*g&mdw+q;4sLC(pcCQ~-ng-UmeuiaYul~HwFuJFX!BKw$+LWCx$P86}^ za@$}s2qpHBzUXZ8Nm(ho-Oad+MDKSeuayUes$v;v`WA(kwo7B>G9b3pq^Ryg_2n65 z(rqjs-<5dJZVkq1_ojo3qobo5He8C{T`MmRwiogNOVyw&EGW2aJX&IVpC=^rcoQOx z?pLE8$__cy5&j~e?!P^+zkf9O)9nTuo4`_9(t7h5SD`^>3t)D}6)yTb@84oaKB(`D z2h~igNQyXzJ(i&f&{O@RSnf5`M#GcBA&19WBtKpN>`^_h`qub(6^>bBymDu8;QZgE zAxQ{*n!5;3ysqAdw?PNcD~$27 zBDWRY3@7-0xen(%+ehF^ac)jLktnz90s8r$KhvXxq-lJa){5EX{&Tdm8)O^j7-f1;w_%u!a)giaV4yl{fek zgO-g4xQ4`fR0m1=!Tg)h7OSnFETXn3xR3_d*?_Q-M&;Lgm!jfcu&uWJCA_1>Hm{)E zd5#UXD(jordZbDqQqCPuYj^O4U4<-+Co2`C$NMK+-C|&>>Y#(I9DW#!^6M@Uu)Gd+ z!Uui{{dmWKlePMF$6pQpi$m{{BOEVLT}x^;$)%QzYyo0LuGd0ehtS6zh1E;=!GbG& zS<2D5n&C4;miDaiGlba=noTHgVqUrVJB#*ivF2wzJJ7Vl;v%d@2T7tJg_!)R$Rdhb7vMk`RX5{C5Li(?@tbTHjN>gU1V_&2d` zN^eNbC%YUS&#v?3?JkhA+3ES2nCJp`Sj1`-)bPGdF6HIro9hy-VOOo&%|M~jXcnN5 z#dj#|m+Ss^IGKylm~(K;<2QBCkD|1Fb^Z38@ZBi6rP+s<4;Jhz-X4K>s$HEKd>e+X zg80Uq#^KqwH=!E-8&2j%%~f22#oqno$~D zPjTZVtqe2iCP(Mg$BP5JEkFK**LM%ySqc$XVHFcOgw$wKhDo}azIerBO}duvd?6C0 zLmZB{+|e?;bXnrKr6m;9mXTCLAM(CDRs8vja^p7tuGyE2Q zBwf(UtIfh-UVqM6;IrT@mQ$WskprJsH`_~I`)h9xvBhhnVtZm%CsPcHATHt<-guZQ2AnPp?`nXeStgc|>B7A?%%&MdyU z1hYnP&X?piSx{a`|v;`XTyoHDt4Yap-X1+GzP*(O+Ld%L<`1%|a5lio2e3 zi4O!yi!Hyr@_9#fHiqU(y$VBg@>*m^YWko3DTBlei~OK1G*V&Xj!Rg3g(G@Y95`4a z$>b4Fv~zh@GZvL{@u%f^)`c6Om3D*4sof^i3tCos0E#l^RuU;uHEtG!+OxNX?+Rsy z{-&*1e%r(|?mNwByVcxwa(m}W(~Av#c;)$zrN8sDppnEh%ced_EqL@}#dK&}&7FoF%JV^=| z{N)T6(0{^pZfAAea>x8`71s2zExg4b*njCx>sIhvqsc{{2fwpWdYjOOJ1m)upAtx%(sy-oyUa&fvJBypzY#XLV78deIcHX5;|9 z`wz(A79!=i6AV38HgHJzRpGq9@hmJt??>dDrGa0)ZJoO#RkCb9c9q1GgRX?Ffj-|x z2oE*BNQ-lSGv6$`0cEM{DL;Wb%QpQJwOMm8sNHVGtosG3)>xHMReL$7IT*!&4BBYhw- zG6(pvMt@uNFFFB!4{_{2f5Rn)W9f&jun^*!^2k_!Zth5dgW+7NMV^hpm$tCMs}U;W z3F19J{z6KBc1Ug0-ILN@d9h!hG5T4@C@!GaiiiZyhW$8G4 z+gf^5B6ik$MD5@3ux5_f$Q5xo18L%{(7in@v7pwOpu*D0e? zUZ4wJ^=sr6c2HV{G#^5xfE+LG^~N~ccxP-Cr7_qAZB2$VY_^!;MXNqExL~$T^2bg zVL?RHjq_#c?>)9&CPnWhb_|n-gxNNs_w*RJm+Hancnf^LkeP!jwYHfPdw<$)&E1+TgOH9weS9d zAl)S`EsZoXgrszLiNqiw(hbrj-2y{*GcbUZ(j_Ax(hbtxefE5w-}yezbAIRi1utUn zJuB{YuX|nBdsmXLhKbA<{-f!m-`~+`fd+0@PI+PFrRVzD_f-0Kz z9Gzp|9p*(d2f#pi-cnjdf6SrR#RJGCRI#i3fW+1WC7BG)?%zMDF?_f;mO|fp{dkTu zmj8E=J9MIKVB)PmVR2}f8sL9z6M+yUm3{_5G7xf=_v)Fg)0e%BMB zU0kv)MOKsjyBg~m7nXAu@Uv6G%O#Q<3@srHB!?T3YqH7v4>InaBf{uqbB{k#encPa zIb6KiX9#=i=6#QIx{1H8=@{+oHy}Nz+b@an3abY(LW|#5do_7QT(C47(o=zQQF>J4 z0H16NQzo#%BpUnpfxLlXHDfP{Q&CsWptkH+BG{Wp^1%?QvakN0ht16IJVpPby`fE< z(Ed5;rMx>#AEwgFd!iiKy`|4(_)HCtM44fYafj915YgjlG;+VDe-V1j_NyrUPT~45 zxk09Y9-wadrcU^?K{+`paRyf9l*>?NtIQ+gYQw#n2f57LH!G%H$1>$(Oi99|){`C# zE^V7*e8ymC7>8^Cb@++q)8i6cpVxe7)a~`FLHj1V?-f0TfOjjM_g<+d#N#MRpF&kO z>f_kbMFcpiR*%}z(^C@gwS;7(PS;9mvy*6ZtQy4H&)KRzPyG*h)%acBXq%PYr%NmmC%dE++7ZKJp+;NoV}-Y7X9i?A5B)cBKZwdRmQZUK5K?#U@~DP zr3NS^7|%+m_#~9Y*9w}@ILvwwju0yp4G40UF`Kt|9GX@P!-`yzmb^Bp>kcz6?h}_A z^*|GZM?h&RQh7Of2Jp5qUVMn}Oo=!Zx#Ciw#8^# z58*5k)Fk$iV51q>U}2F>>Q@a-kXG@gQWLL6r#(h8Ca$ErDwlhfiqw>-65}@7!H^J6 z1)4I0VMF+3d+`Q7Md^=2vc%)#u%tewC0A_{&Oz567?Y+?4<8esw`JJMn}IEsihSv{ z=VNK46F5rB)Fklaz}5v#X-)p2*Q$c73Gb&S`|A!9SM&uwke4-dX4ZeuA~s&z4F+#g zlO}xfUasA#y6G#lORkKhq4RDiVtWySv1zY827!n zK=n!q@1yD!Ls6_&gZ2khCL(W;HVV|OmzB`{x{fTf@<+jDck|Yaf~&n~Z=^EmM~`zj zcv@rg=NW5@UN(t6WXKiU?cZxM(oax#hPaR>IPRcDo@V{VHr{(BorMY%G)K#;VK+n; zyim%e`v{}m3%Xs+pra&lZqY505OH&T5_|fA|E&f1s!E@eKkA*3(t3pMl|u3~x4qT0U_mSd9aY4mPk>?m%ufIlNQVYqhP8;UA zvzC$VTNFzvm2QjK`9M_eU-&S-XU%LZ@=Q&Y&5SZsbd?((VKslwnN%$017&?c`hcCfoty$cGQHeksmFYk?H@O2%)B_26$qz2nxuBs%g0u}Jz zHo-K?90v6==uTR(u)bhkhY4Qq4;(MA$@h=ldo^@mJ>^78DbE2wih$M-g0W%t~xG+$USEQ$ffIR}#mX{}!e@ZsE6 zZp&XimM8c8(GrSz5MhISAm6G`dJtengZ4?^ypni#`oYP)T08dAOC2N=KRQx;Imp6B zOnx}o79?C>F5KgC`)2J`@i11YS$o^$A&Jl8$iFqaRpt^+hEY`mP^;fFsWz!MUN>D# zzJgXX#j02HRjnWQOWEvjGY{UtE?NMWAoPM%0hKjV%&H&848i*L0Nvj_x_@X*@UKrw zhj9MgTXnx&&Kn}2q4W}WzCrFAF%5LH_^I~!)0y=ULJgcF;TxR4yz6-16jUI1?F}5* zrhk?}RBKNnibD51J6hL-R(q{q3jK9}63`Q{aki(5zj)=uXf7fcBNI}Ie*^F-+9LcY~rdr)z zXB-wa+6U7wCc8%0o1r~>_Id-ElbuC0H3PC=mz|QrME|p4Gc&fIm(!I7*d54!BGKNW zcnyn^c`aK@&3X1NyvM6dv&fP*Jjl0>8NyjG8VdLpI)EyrMnlR4uh9W{F>PaxxFNaP zl7cVOwey;LsxXc1X=JAL0!yCoe(0>VK{IuugRMFtoN->^yVfg`HO*D-*A?!+xxq0H zTJNjx(=b^?Lo*L}o0LIJ@4`)sYQb?vQ|V;mKoPqZz00D909*hjdeL;=dD*qt1@& zb!ry?Y+Y_#%KS>=71yO~M)N)n!jW!|3q1bwhbvL~erI6=Uhmi-tdtVjW?b1nm1nNV z8e997K{?w?#xezE)88P@v_NH)U};|fl$?U;7r^l`AZ{Sn(IGbdAT1T9t-89^|sQgO1y=LC@sP#9H;Gre?eKF1%M%i~8|N-{CKM&VM>1+YjyNloCE*r?mySOp?#VE>g63eJ=}f zm3d~@Gj1b-$@xkJKKdpjK4^c8aPm`?`BI1WKu$$jMzfQs(G@Wfg$*%@^VQ!{98&mo znuFHw>)CUZ1a#%u3FGH_jS-t&H|EzOVm69H19BUQZ$cMK6v(}k(T^H$^#zQkCN8n} zYl=lkNvJ;a<{??*T~qG|Q&a;k%P@`iv>CvWR-|VvZHJ8Swi1E9&tuU`ex}WQO9O4! zelEK6wC=Za9^M9o)M_EN`i0#_h$t@~NT+rq z$iC*?P2(biRWUgmN1s~tyEm*C7G_S0UiaWzny7MIJSg~77=T1y=lix-U=Sxe%xRb< zD?k5R$_=aT%uWejaB8YOwNH%DZ@tZ^a6UJ}abJJ?{IA05%*-n-r7j-uZU1>P(+gnx z2ndy^Szx0mZP~zSEcC;=0Wz0tKDCz$flZVgOU(>>tY>~iCBwO2caXZ9KdsHKz8a?V z@ORd4fLhTdv{sP#@uWzm@GJd9s!vUkohFRBFO+72`b7RDhkg`kLoty4=WlTm@KyRr zX~zyxEXe0}PgnZ!{Phd=ssTv(8xUDblD*_BmBrIBd#Pytsc213*D z6e$fbO+gKeOx3y?`(}Rxedr3>Zw6V1ni!O*>}y};Gbnak<<2y#ch!Yl&m~-JV$_9y zi{*kVI6ncmJ%xyQqP=}rMU(&Th+~=VQ3#Rh> z<#nna>N!p%H*s2>u=kB|GXpyZ%Q; zNHwG=5^S7fY$L_~hRC@3Evy-lI3cJyfc)Wa{Sv-}uTvhuLKl76nb)?5Vg7tcO_aFt zgKucW^Es`!dLzA?YSAtuiqY_ni+wrcd+XqCg7=Op?x?nRtxdw&!BtM^fwntfc znZ?Mkq$Ab)(-02-I?um@)tG=d4O|3us0d;b-R4IEbOyVGc+zQiwEX5N1e$d*6CK1x zvgAF`66-lG*sJ6Eu#F*D_J8?dhF>~+0MlOmD?%zzWFBp~jmC6Q4qbDpJ50}q_tVgF zJT#V|OqP8fNTcbgatL79SKBQ337f@q^x`g!p*#(68Yua?8-|`l-p{>aX(WB|QAF{l zK(NRO2ijX$9tT2CePXri4tSn8;PnoqaQB6ez6m%8oz9>C(dh)B0tt)|q0zLPmA80! zy%>(#IqQ(mM&^0Fj4hU(UL?GNdxzyhO-tndkKXD4d&_LzfXgQ_)2{L`g{?{Pde4iU z6_2!0sHgSu9@k~Q(Cv@anN0bd+fkI?(uh@IRo#mo9+Hv|ck_r9kjqhPpmrEhucFzL zyh^&vANq|KGTd-@bCyYD>6U}g+gQmC^(DUmM2>&$=M=GHFQ=0k%%5}5JrkaTU5=15 zd9wjqc2ihY&sMDpkd-hZgv=pDfX0QD|yKmrMX;A_kU(Zi082{x6Ld{U!t z-6XGH{x+5P?Wqa~A0*!VDMB&0ujpOP0Jmfk4SaJWG>DX6-XsgjEiINkN&UBojeN?T zVbdLi9K=rlqVns+<lufr z|A^@jnnto!n;Cagn!<=0s>g8xH8(+Avf-vOjM-RKhS@v zsj$p~{)Y@$!H<`|KIuyhpcMunT(?h~MRT})Is&6evLycWebUw;^bH;^Jt$>s>45?p zH8|G8;>)4Sa*({vh9r?;MqK&HK@R!64|6U$Ldbz7jhz5yUFDeSTu~F0YTTy9O6+z5xspNVpYb{ZTD9WS{sBxEL5M|8UV!Pyvq(rbmq49QBW9xEI8 zs|*8TU&~F3#p6rVuBU!6v?bt8IukYMta^TseE=!V*3$s9?r*Vs^Pu^mHY0BRwcvM; zt#;ysya)W~-%t21&^~#HGu`<`1IiMWe1rneS%n~NCP4{gG%CIGxizkJo9eIE4$YcQ ziS2d%((QldLBLYyYq8DMgJWtFKMF{E+XoYqQ&-%|(lQH9u2hk+Ft&&spQAKr?u+aO zgwpNfFKjCW=aiAtuV(r0Z& zTvC~nf|#3Y`~7s?jH`PQV)CAoCJ5I@vk$`cvAEW~D1v|i5&de$BvStj+!!^tUI7@$ z#>@~n9>g)X>Jy6a&IV~IZywaiQtOhYzvaOt-i!4I(|+bfjb%k&>4_D~nv*uMllbDt ztW^RqtAob^PPazBDO1OA#^*W0e;{)Iki()}L9ui0@zkf{2#vj~z46C?&|y+U+JA2Q zVtn?z0Lik?V!Cr&`sYl1bab$ntfJQkqS>8n53cJZEnmbm;rYgG7mP2IK)T$2>^z z7YNVh^2Gnc`~?r-UCPZ0wM?b|HPn6qXu*COw0{A!Y9%$00XM9YlG&VBOk2oV_F>Dj zFG-E?-k^g9#!@yC>wz6p+S|K47okqV(cq>m=e=ZdpzD04J<$XI3lL;h1GuIfN2V<* zP@H**5=t;W*T9GYKvo7JVx^SSMRannsMEv5bre;<_Vlq{LKS7f>X8usbDzs_?8vP` z&hYr=bNs}n2OY*ve)As@Hk0VDvW@7PKgvP_6=r;pH*ZFR4m5-4`&~)geMte(*(L_1 zRus^$MFaIF0MqZkY-40iT+%N8QgzM;O8%$BfXL%hB;a~L$ZUbAnsaLjX|SH#c)STs zlT=(bSl^lSKW|bNOE3&9qcboPq3xM+G(9_a+fIz#o#$w<0qJV-C zNyF@FHvVeH1!&2n*@UB}z|0Tbs!ArZ3Wte_9Khkwx711vekW|AlIa>+aqc(>KrF&G7RHbDKF+cNfR5KZd#MTkVQ;&80}#YdXn1TYgAcaDqqzs=#%_Hj5o zfvb%Fr^D6U>HRt^Loxwj-sF`M1THU$gs=?ikpVTYgKUzY&+>dddIdXmqvV5s7T|Yn zf=<^xEP(uF!SmC!Ksdt3`DInI`Fg67NQTS%}NQn|MGf< zNyJzmk4(&0A^vA~#e6f1?jN|}=x>fcuc^GabnoVy3IE&Uiq&)Ko<%MUPiN%7^EwJ7 zcDg`9*jBrLG7yaCMvXLK0ipQ>ky_Cz!Pc1(ex*UlT1ry{G;nGO85`L7$RZM;v(GIa z_uQkWnFCndA08KT?}<#?T*{ZbZpG+1^MhcYb?=yCEF^%$23l3;sZaQm?-aE*44y_QX7NpnO_#Lfso z1B&k5e@rb_rlL-48m#!`AtVrxeTNOo7NC6ZVK_R)l2X^6$R}T$RsK$m4%kz{#&a=Q zbI0iD)dT%~E!}=S;>6hiv@xI05(^kw`b^8b$M#?FqwVLIeIVD3^dMkBe9=QiYR4T= z)C#TGV&T)wwWq}-xY2bVzlvvIn;UPUcuqUR-a-?pzS>g<{|fURg_bC5$L*s52t{f`$KB`A zU`I-)gPQ-b`@RB}4a5SUzr+y>%G|q7a<=RiF#zKHD1v;#}&%-XJOyT$RI zZ17JLH-!Fv!P|3MggMt6nF}92_bGpAVE~%!W)#(SV%NRs*y08F!tdwLVsQbHa;(!u zkSUP82fg{rRUQNkC>?Af(Loe#B}7koE*X@g7V7qAexw{u05{@7(ypqMgwYqy+kaij zzhHzlrk#Cl-7fq8(H_oz)2;e@VE{48l=s)X3bVR0Vm2S2vYvpjfKO}(Z~FKxCe=ZY zvv@8l)9Qa5eNtk;?5O}(PHVvtQvlkZ<^vEzGl5N!i<8GV%vkquwgup$MOfa)H(?o{$q+y74L&S00Uz&`F$~{pB0Sr+l&>z* zFiH^#)+9EG=nx7h8u%7Yp>}|SJuCybmzFSn8`P{KGJjZVRZcZK4s?T1H+H@iX?Mn$QuAWVeq{K5TYbt5gq*-%JiKR5f_Ke%}dfhry&f8 zOi%Z(7x<}k{sHt%QtR}t&YT{qIqu{ET7JY{`&dI~k^g93k9ir~gbr-S&su9iQ{y&WU`ezpuI4?a5jv zBsSwTbu~jbZYA@WL1vE8cglV~h+>khV50y}WDg!1ee9Y4lM?mMt@#iB`MKQcZdi1M z6adk%9x=dnh$lU4JB}KQDKXuNm;l2Ic3T|>E{^h=ZwB_g=@1h~cndOP1>gZhs^{6y zfnNNF(vk7`D|$1)$h$jLJ=>F*S5_BAK9`fCe}+xTUcTk}dQSq#5;A+7Z6a2l$I{*V zQDN{Eh2A)DDS%6u$9xNrd=%L6K%xGIt;0GoIrmQ%C`K#%|(LSX3233Od7 zVXYE~WnQ^!oc7P!`Zg56@bm^>3XyiDV#-RNi->q${V2B4U&0?;I2o>ap`lk`NOJrT zX9Qats7q>gXF&R4$O-X2(P;2(K=t+WJC%hzig;6LfjN6%)SU%V*Up|T`&y+YPzqjN zUZ<5+COXd?{}YX|(J>2_y0s=T^l{s<7HQE6zfN~CBu>M24)M9>_p!CI8++H$(+zH- zJAcXpZFShqC;m{E>a?@jPL+qL7`ZR+T?;cZGUpl3*tAXmW#zBblmC6|2lv0bKMe4^ zOZXen`aEvwl15Th6&K?3t;lJHzp>?hYGE3Bi2vSVDBt}4wP*Rp9{~~l?qYe0_5V7U40S)(4$^>La1WWUi@0+wZ@u$x$4US@Xtw3y);}OYO7(uut;d zyYYCv0I$VYC#XP(&#Z>)zg_(m!(JDu82b1C$VWAL?up-!mkq;?6y;2Oe=0^Pf<2&v zM+@LI<{^@Kt0E6W0-)0&(Plr=D&G=Y9flJ zEW+{dyAG=^#YfTJZ)dUE%r?IfKjxU>tCEBr+RZ=d?o%dS{RoFmN_pauiy;l`I($Ec z!@Be=o{0h)E7#5`m-t%wpv0R?)BY&}DyopdiNEX6bNE3{4|tr{#V%%l5k|oj6!hz+ z2>1HJIOoBKtav2dEO&nwLul-8<7jh6x+T9^ktV9E_pJc-{T@4%xd{Di?(mY7KKmki zVtl`=Z&z25?JMXcOGlU5G=RMO*+thXiQTKaQw8fOY|1Nw*KH4pb4$PWa=n4zs0-Jx zD+wjaU32<38H3F9M@%&^>*a!fR1;@N%60j#uUo!&Q4e_?7sJkrgh)z(oEMV>o)b$I zM`GuX64}fx9}pEB@EBc3RDzlFGBNWLAHkvPAq#yTnumkrd=b0Nd6&`ZX>jL98C_k$ zSSr!L9UV4|yw}!U9{L^LPZw=3k>z~HMRPohOZS@U6u&Q+YK6>Wv_1SemyKe z-m4uabIV6XG%-Rd^s2sS1p6@X^UI){vN0|X%cPOwVMX*iN>s^w{K#d4Cn#GTmjlwu zb?_FhwcL39BT~jb+fX3hcQ^GY^x|{e^@)+WM{nCNR8id$@S|f)>ZL;J9U~O_4_sB1Z=7FbT-$y!EF~?yE z^~F$xkU{KX9>wmzMl^6`h>-&kj7±w?X?p7^INTE->C-bgKQsOQJ)Y3X$F4__uj z%-5Jz`Y%s^CPirYJPnKO-NBKFv>Hx+yVo-H8Y8dec2h?X8Zu`H)8o#c zYtFOXYsiecghc-oUdNCD({V-E4OIhuf(Y>hdlzq{VNXtXA9_OAU^ zWZ}c#TmlJ2%Q)eh|ZmaLJZ|vZB)(0^hKU+d)x2A*wCF$4$*wvh#5wd^a zk5#kdCc)>k={vttE5g2~+y3g)4rb=pq$z2e#Eb@~eYsP+z2|Xg?^K#yl{+9zpBBTK z9NH*<3Ycx&z7Y8UY2Djg_2awmYupiA2U~Q0$2aT_vSdY808{*oI3uSsTZGn3Ej##f z$;%`HOjxYRfA!t$G5@|*Oh$~beEh@_+;iFy9IzHMO1lDiEf6YPvT8Xy^uM(L=$@Bc zj(LuFE_okbvZECXEyB1oc1}y%j*6H(h-1@m|R$6vm=t0ci~|d(zj`I!c4&axrQvqE?W)cxbQ$JzQxz`60(gnxEIQPv~Y>_WsT`vCG=9b zbq~R85*6YhCyQfPTYXiSBM~%Lg7=0jU`Rw-*A`W#FIVQg550O8{|$+4^rP?7U@Pe1 zaTu^Svy4yxshJ#d(|o#pGVoMVMC_`u9>nYpmpONqF+vUPg23FHOQ+PF0a-SsfWrl7Z`vRZ6S~5F~a%M^-o}mzcHe7u-#}&pV zs&~BpxV7*6t}IUiVF_w!YSr1FTf1{^g`&1US?(g>AwkXp?Z#OeT0UQW5E*(X66d2f z_|u5oA0)ecuFHM_7b{JzUbzFYz)4%sB0$_rhmy$|8sI?TQ;XBpy4rweh+lNK5X3%_ z|NfOAJ^@VMp1jHac4=`zzvH;JZem(bdpWvXn~0q8#CvtKs&ZUFAqT18s6PX1?~&iJ zC%0zi5jXxMb@>p$7*RFR8|3oASoL$mTkDB*+OAhbq} zK$rN-2~cLkGT-=CW$)K2#N9uAxLMzBH-5hcm*??LT(v@4F{=%jc zI?}FZ?Xi($E6T%b;ZDm{<^0C2SGxgGg(56`_l>6Ja5fzB$cySZn%bs-D!V$vH9oxZgqw=%Yi6tH@mB6M#TtAC`{pUED{Kd!j4&`qn>;w2bv4=C6 z>Bf~EN>NUfWqf~?9%guC4v6TiFvqcYefU5XsXmkWz7D3E9M(yLg|=r_Yx zbiU9GqBkYBe{SNzLr5ilNljm)f)jpWMZzU+BUVb4gc>9A|CnK=RuMHxb5pxJXoe(k z8+XuT!X5|y$mxs(NHjlfzrh9X*LP6Prs-g@9JauAnW|u%#wA3ZIeksiDduxYV6L8y z;Qrot2ex@Zw|Sn$@*(=TbxLbSK9aX;zTJXVKCMnj>Hfiw;RvbZQ~5+aNJYygnC4W8MJWY8Y3?)fu@nvP*KMF$u( zr&Zuw=FWb?sqDh^CuiTTgU6q22@dBK2Mpp>Z)l+N6#!`F2$YhkKAnv&mWorDWFbp8j$Px%>t<~8`rmA>Ch;nG8t>vhUeRsQhOJY?({=NxR zNU@*yU&Mn?+T5nZl_4z=`|0HlaTMcI9IYj!YWot`iQCN19rg#r&EHOF{H>8P**DPj zF$0CNK;Ry^7duzaWF9+A7*d7@oxBQXGH8Z`&sRIX$+jOeO z6u+E3i57y@K4*cawhF`<*8sdHMlP0L#$kp#J<`ZusbR%G z+(jB1msusNCBgL*xa<-_D8a{fQ=D&`y>z=1_waw6i(c{Xf83oguGQ00J_X$JH1?w*NLO`u1@%z!r|$umyjDv@ zoiP!Ea@zK!`R}*+HXEy!^nFQj=z%A!hSsHePQ&U3j=d0%CXW8;q!Lfj7aK7gol)xf z2;;LUp0*mIn8%fNG;;sMCAweU=ScujPwJqHt}V9nxaoJA*jny)_awg~fkCF^nk<8^KzhJC zL6gS0^4azWs$@=w>>jy+V2VtiCBxYVW~m&@m78|#i;U#Nd$yig(Cr|WX*62W=8Sf$ zP!5eMa(>A=cB=CfUeFGO7Dm zEb==w(z(d2fS`h=*MTMxbRRk_u79#|Ld?v*+z-vo{_!-1hQK#5#7mKIOp zMiYzLwoLGg*Kx@Hogm4wcbgN(xJ9>173@fKe|hdksqVe|U8B}p+}6lKpT~52FjsHz z%G{0;@zIGuhN@=r4F`%wzu4X+?(FDpj+qVYMb$)Po{VOZQw4U*nrGocfRu!oXEUM8wCw4`A+y}gj<@jol?=SUYlLO8vSAYAL{#J)?L7)MF3cWs2 zH(PpoHVUDS3%x<)YZ@)@4|t>~=GJ!en%&m~CnjOCMAoNAky^@X*^yh7eV~J&U0{#e=YYp%bFk z+r=5_HEU*ioG@x;&#*4S&PghQi~8&6?BD zq+5-i)>>7LKaMk@8CbftPMy@#vExi6kz$v$A$eB)kiEwsvb%NK%}=MJV%lZeG%6I6 zPeU_n7E5geCWR*|;?v4!Hv|yzj z9Zo*tYZvqTypoif?Dg2YM+FK$QUDF$SG5kGc9rp)P1CCWlm$521jKV+HfytPjNaW66WX$hvPJ+xt!hy4eN; zf?kmDi^E{upNlCQ6k4ShJ=<97^)gObpjvA8->pX}cUPwbUm*O^36}K3YLKwCc34g= z^s&N(`o41~(%W$=Ecoeps5W=7oJ!xyTIU*cl$ytCo@XYPV6DXB@yFWMojK)5)*W@9 zT6TE04_>ZaiF>-Z6N;v$rbZQn9(}qA6>Dgch}*Na{N}_ii@ruH z@6M2$PD{#V7Pn#7w0zHuQ)j#4s&0BIFVu@!wmqisQa^sLj$ePMTm04F z5K{%^+u0P>vQ9~;fkUU@1`s|_ZWsbK-fhR#fZ*;@DGuG@EdEC5=e95B>=MCVyMc^< z&8=x17|#E0dI5jDe(_fhk-oFbe`g!uGj9Md(S5o0kHxNDdD_{PCe~U{Z)VY%6TEPX z`wH)1wg_su#%0nHTiyPw_Hgw6hRD}1>fOlt%rx||Rya07AYnE2Cq+d&BaV^($iVIN z%KcbtI7rBG@}?@i$(8eE(@hWD$SrYGkt9f?$w0oRr{kSD02-tbw&nG|zsGiWG#xd? z-=c@#;!<@FVDRbxsK;UdOTRZpBv(v189+&?H_~`A7sVaNkV_eOrwoY{mM|7U|Da*c z`(i%Wmd^7xp5c!{#n}D;>D}Q0ml&NXx2NU6dvSG{tIsP~MU}4mlf&&ldR?r6KoWJV zX&JssxguVImz=$4L|&%#;Zm>|7wpUZ)j(VolHRvTn$ETFTtK5H3Ven+b-T5VUP|FJ zK=LAc@aba+B7w3-0U{{TTMucPcRx3VGhmBX|pFjNhTH{eFt)h2Upmo9#DOuDl-Er-4BPY{O@lssD3{+;RJ z65hct1xWM_@tgKb(faKMe|dR%^=T2W1bLk8XgouKNd-vBh-sHpYZ-b8ibFF<`p&GC3r)bFglec!_xNI8{R%^r}+cH_5M)=XUalGdc zH4U2CGfI~Z0~5WgTj7_t;*_?o;WX~BirKdLy1FXG^j!Q9B z@`gxRv8*9&a*c|w2ch_Es@K1mo<>FLjZJh@iwbgVTnfm)2zU{nfmz7%H?F;Hws#_% zkKn#Fv2=WjX5%qDcja3oU(C;l=&qlK!~)dm>7PNH^y^Q2jn3ri;?`N&{(i$>xh19F z+49ctjyrM8+gom|b@{y@{>ylmx5bo_3672S|LyxAn+sAK-rYNI115TjXa%)Avr8(! zberkfz>6#A9PYf8F~oF`4nh1wg>K(6HZzjITBgj^(TK751~C>(3X8iYWew)d`{O#_ zbv0aLj|ZsHc0rHc`u-{s5~UHjqVzrO1@Aqobu)~W%?WYH+;rm^zFTZ?daDNi930&K zMFvacr?%g1Kc_P{`gR`MVv_Ys!{)vDW^Bhv&Gn~{_D>i&0R>l2lTNZ(4-HWCVKQs8s6vRZMx=3Ywm~uQDOs#!hxCh_ zgw1J}+hfmD&lxLcjF;iOPj$Z!8eJ1A&$%hbd4(BSFpa%pegU^U91DBp>GX!6U21j9 z;5iBNL9oRe*+6L*rRf`uh+Cr!Md^#Ej-@0WD!5P=V*j|Y;xeQEjpa54P5-EJ=TgKY zM5w|>WqfBBJrby6tV^(Esv17l2 z{09s7Rf7oT;UQYp*SdIn+ca7Fc=NK&W{vj8AFZ`yrD+0QkR`7Q=0)!sF}pxn$o6~x zj;s4KGy4v89%aLg%ui(oRlGiL;xkfuF{7MT(ATk0P6)hIy_~~C?UK^;@I`&llBwG$ zXh?Q<{94BIX;v;m1c#29>ERy;@ILuyiq5>g6U7cOqwIz2xhQ$t3rmrmy_r3g=hZ6e zNRRAt+t}s3G#ts3;A2A0*mkP*I1SaxJNe6FZkjE)?!|o4W~rC@7CY3^Dsb9X6vCGu z@fLEc7SnexPySxO&hM|*0F3UUA%=Er4(o7Aix_v_`vt+&VR0Q9a^Fsk#t-s^S=RFQ z!$$#(3XlFxg&Z~-C3)dl6ff1d&N%y4dtvX?umU5eQ*j|Z5x{0%Tz9Sk&V8 zij2)&I=S=fgBD?*rBW1L9(tT!(AL>($jO0F=??cAA{jLDnPig|%RM+t)$|A2%pR z1JKtQPN-lX8CSVz5=;s{S6eJkXeV^#)f9$>ua2%?46Oj|UwHJR-an%Ap`>)K%tk>w z%Nbwhgp)1=Z-tQr{K$(=bN!S`tc{}%1v>LKrakI+bLJ*rX`vy+OO$<2X z(_h)_oGRaEp9@1ohvXUIm$cyA$7Gw}zm&FW6P}OsvD5s+X$x^0uMDnyU6W0Br>q0s zKX#SsX%YOGvU4RK_7a@*##mw!l=?qP7c&sA>U3Ztc=8d{VxDkF(%#bJYQQb@S7JY} z`X7DLi??=@TA9skx{m;AqtJ=$*+!{QXR9|dX(9fRn&YOH0mJbK_ zXz5TJf#Kj{WXqqK{O|Xx3&l!l#l5@Oe6(Vr%s{Q`$HWnOb4$xBwU!1G(sQ5UfZlsQ zb4SM-UDS3S;G8Tu3!6${HJm@PqHFor2c466#LUd(&lsw|WuhssWsACSU2`&eP?L!y8bgz4FZyieYYlN2Ub?rRp+fk zYcSZVRb-_H3WhK5@8gguu$6ZByj4>}b9(Z|*hJvbuSOMYY)rLA8;V8tXR1(R%_fG9 zjt(6MN7m4gLNWPe;8y{=dgR_~g)MJTzylQ$5|VBsX9YdH?}f|pl3lu>N7*!<$odd% zU#W&@IL(t2DQSr>t>~k$S&cY*k6LU-tT{Y6}Va_^17rlVc!K{WB~Sz1vfe-W-=39Eu9BxqFBYk zB^;MJ3KffVix>R++NkMcp2y*$aKJ;Gy*~g-LLh1iTn*O>?{6;)z;MXhw{ImEzPTaL zY2ODGBv?vYE-g;i4W2}_jcjt8TGRb5CcQybacC(0MMhx5g{TBY;t!y$i>!Xfl%X-E zd&;;xaeU+juQi(u3R*{-`sA3J|AL-KRMa!sM~Qt|J9(r@hnDzA(-YF5a2HT={BFCc zo{mW(=h@*6?ao)*`ctPzD%t5-0$#sRTS3|7CM9L-?(ry~dPcP>10g%)A3p^Rp-r;C zY}3h$<5Pzf*3bG_x{@;dO6Im#RXd9i4^1)M#Nqw~iZcbzVkJ18h_e(~7EFBp1U3F* zRgl%ZIm0oqQ_~Re_;7VBzcD;2=rH?kP3~tlRfPJV8Z%mRbMyQJfb7P5Vilbq1ELl4 zCayASB5l%X_jWUG_nypkC{NrZ<2L<1tmL6c5X0cuq)pGju(Dh6_9suuuk%XHBFuxu z_Dm(FcHtM;C(&*97jw;?$NA0KIROvk`*TW~v!-iur#N2zG0&YR5N$_*Uf9_deK!5L zyu6I5m-9%Tw{osF=y^?bS?q!2hq%2kGXr8Fi!apTNuj;OFb5g8s+J`Zl0lc@MYUfA(sZte@uJi_JK6kMw?e1^CaSW9 z@uK!2Vv{>&{^GIIyz;AVG~{_UEGgl(R_AuD@5Z0V9`5+D5Z2ks8$-@M7{Ylm=eUZ* zdq>iDZK_4CMeJ|8@gxAtURgX#{rlc1+m(4J81I{Ff($Q`KFppxB4jS#h5=68XIyP8 z;$&2AnHbUV88uXBso9Bv45cp-Oy7ur`6aQarK_I!YF#ylhv$FJDO>*@__PJx5@5}& zY;J}FXzq7+o?cCOS~CKTG?=0#X_O(9814Awx+;sn$$pLLbeqAo#~^@Fnu&g4hp!5$ zT46g9_=K`3iK1D+O((DeqQdh0!H`>|LZ3UjYh3)uOI-N?8M{>oczE8_$G!xi%rD)G zZ#=3j6n*`-H#FF@!Ms7)ZCMCQqZF3k3tUr)Jvo}->tt9FV#~@$eeMp z6sEVRKQoPc?T1O9<0CfQ;j+4ZEg(U?Gr*UC?Y0Om&yWsT|EnT9_595VyI1i&0dA}N zz7$}?<*}dUnNbRLn1ki{cv$)2>Aq8!{lWw<{0n%xExDP|F9EzF1*c)UIHCK)-SzWV zQsj+|06a1C3w`d}i0|Je3GO=|A1EJhbLJzZuIC$o*JU0A9^Crh-?aZNQTqT%0#~#U z`_fSb3Sl7`vA}oQMj{>DppP9u5O*+7DD{XYnkuN^_3r>{}{TVpTcYjXIZrnK{;S3ybfj|Zum*H-YYUV{gPrYx` zWt!tHE>=V$_rT8mcYD;;4{XeL?12OIRKlKTVqd>Uk zu}I%DrCNax78*?F_}u2Mfm}FedjSwAE0{_B{WILvA3vzx+f0QK_Rw@p+{-ZnibGuk zKCrWMh*W%T51N?t>Y0QXplska;Gftb#hl+to3iZ=S1PwZNg;p}G;(c1=-d9UgTp)zm*(GwN;p7U6PwPc$S{gdd5E-A{uZx4BDzc-$Ur?GIi@S>Y{2{#;-D*UaE)hi(qd^=~&^2bu~g12$#>-Sp-e z6{Fl%*$sB4aiwb+|DyB1OM5Q>a1=wLC&%cS&L_xWTFAD#5Iw_zs?#nt|7}Vwj9bwx zGSO=CUy0;!?qs@7JFVf}3t4nwqB2KYA&6+7F=SGhhpw<*-c4v zT5;Qp%%e5S*dL!X>=eaS%e9m6c`?opuMW)8A1Jp7t%PVD-C}W}QF>i9MxTB3;b`9x zC8er!p+3nMQu6;~ zkL}cncBiv^vBmc+73UEABI;TVEVa=M-qu*Q&^|CsB{)ojV@(YCJ`h_3r;EW^k*x!n znl+5S9N&{fyue_=ROe0qVBL(ufQmEFlH8K`1+>hnBIceUiM&P2xfJ0gHXuD0S?0wb zXKV_GACPD3>@ojGy`o3_lb0fo3$@WstEU7yPi|wp)8By>f|FwrdDC~5zV71ig7xOo zsC0d7M(EbZv>huL*o*YG3ul7$&5Rq!F)ByaRo|PUZ)>(dCk1S0SozXHRzL)(>7(P{AJ0qX5~#{x>FudN zBFRJx56vuaLsfsMim#8J;7tb=!TgDO2>95wRH;wNBEcZXd%B6J5u6H^1Lvc1f+yPtr*gQ_bD36vrWUyQo<@dlM6MFDvLTD9`Yq{(c;5i2D4yOR^16ptW4cr9z_xsXi7#6@+f_tpp#lJT>BkB zoHmv|RMZJeml$An%|rwjnky{er%Nm`-|0@DD*EJ=suCV#x7SOVqNts-+tNS@l$8$( znK%q_5L1ap7`VPy$J7In@(``kSshO_HEFkuE+9EewWN*8)u7f~?whRi1k=$n0mN#e z_-N(TyfIMoVOAF%`*y423`tjOmJs2)94yyVO#4(hIFwu4-VcwN}(COec~ z8YY7#d9y%ZZm)T%cqCV)0+fpZ^~YXfW0+?eP;o+`AF7g{6jOgOO9YQO11QKRCQzxq zKi)xx*Szg($7`l(g>)Ng#ad_^pR3-8$5#Xt8Eb;Qab}2wbAM^ThMm9@8Y6S3URG z)Ue}i{1r2Yi;8OOKjQ*Pxn^_dreA(@BEI3x6LwdHm-P1cN8Y@Tw?f<~7+b2cp8&DE z4pVO>T4pAezD=uI4qfvSf>SPMw6!@E$-pTewQ%C3JeVmngPaduAR+1a zwo(la4t{lW8{GtcY5R9hI+Ez~_TSv~b|6{%dmf!eFd&>e7>hhH7@RMW(o4l!>wiVd z)n{nR4Q=Q*3n`s^GmQJ?NSv=aYH8U}t|V}7SF|$v>BLbK$Jf4VyrrnVgmVeoa@qSy5Pp z`#k2M)VSsL?19e0_uF?pBx9Bh5B?$yRT{PWnlxKo$A_P-Nk2abmgo%!+5VBqyeBj> zRI92Fe6>XF`0+RA@BEL!(F2P`%3)GXHq-L7U@iLoDTy#pT7c>zBSH*=hJJQoz{Spv zl{O5$(0`n- zwa}Fc(ijL-Gy;nwJ6G-ke;r!pQx7~7TkM-IPra>E8k0cS^>z5D$Hj&LZYomneOmE_ z+i;-8J&xbKiW7;l2))i4n~>MC-@eEKKM}{+yT}NBPmkQ8_Q{BcI--Qo^3e6oE=DO^ zBR9Rgv)NNNbKxUP00N1RR-6+c4hf7z#P+q@HpZcn(Lynsib$8Ytk0vKjSqY8L!~Mf zNNKl_Fki3jCL8=cW^-qKr0)A7baobXSHz_E{u4|PYIsU+uAhS1ezsGWn*YU zGl-C1*WzbQ-28Gpfv2=Vr0rlt z1)@;|VRHSf$5>s%ik=$kR=6W`o^F%CHJA&?PL1u|-;M_;|4~#h(U=|p{gBNnVEU1? zXo2hvi0p9q-nWF3w7qb!g|-JdcN`ZZ&Xlm5+<$(Lz$yDj541$#OID}jkt!^>MXY}PbT z4V=gb)|V1N0iH070$qF{8(Z(G1cZ;1Tl=yTKIBQ51l*lXsyq!f5PCmzYR8^ABM-Se zTz=OWNV62ipI|lhhARnFzNNjlSQatEFba&_Q=;DM+gC{jsk7e*9ktU2O6iaB5Skmr;7&TkNPHh5_(w)P_t%J_$j$zP5Zlrr z%YNR?!M97*0Q3Ybz39`@YnDqa z3bo}fBy_O_oK7y+;oL9I7&HciRE5e&Z<6W%Uk$IJFHS%>&h@dDf2KhSB`K#yySk<5 zO#vyMqXHP31)|CW1hYd47AU6-SSc zy(C3e1_b?eU*kHnzOx%mzz2D#9;VpI4=@TaHkixab^2;;HSW+P{&_@F$=Ay8rVw8G zW$y0fb1Fl+%RdvGcDw3vA2K_1I8}36Pu?+lI0H&Fn@yuy1_;`UWkUnq+1aUBPOcAD zzea58Zkl4aC2O%BPL~t&IV>?{aHoLay+u>Ea+uVnXY*D$Tt_YJh>EJF_Xo*kJRG{U z$Y<-n$YJR-^9{Dzx_j(5Re&mDcMlV%&nkVJ{N7V+nRi+mVjXja^5X5J0xE`Xil-^c zauF4@Z{HC<_c5zRESrKJw zn0y#r%S44YOz$c`4YSx7(kK6NB+3IwJi$~#_nkN0GXuAhdqUd9&cdkwqfqt4C(Rmu zp70g6?0leZRD43k^ZsqaEbuGKUO&W#1nV=|-D)P=%Z2fjw^nX8`$6-zrxqfYIq~74 z8%v^c>mC?jhjRyNjq3f3cLn;(Z$I`V$+F;%{;he>x{5GROJ4kb?$Ih>@_19LD71~L1-jLM?yKP7-W$P52=z_yh_Fw0Q)YBS}Q6+tVPSDe@`96hm9t`(>4zt z1XMln&r;Guh1L=)1Q5aPmSBY;=eX4Tb3s8CQ1fY;TY!EDSFwckL@I6>CKn-C>wL(j z%}Plc@@kn<8VeZ}HG;6N(3YIj?6z4V{jR*;Pr#O_BjI!6DJ&S;pD;qB+kLAP=*^Ip3^4QNwURcwE$atk^#jw+$G z`yU0+!=OgbEQzE>qIz>Ved&4W+E63*;qL}qkaMJw%c@U@jG^Uvkt0nOh^(vaXWSc<-M!`92JN;w$kpv{KEuGL@1S-55k!it{-nu-$$FVS z&MF&r*zR6aCHs9W4!4ACRAb}s*LFtg{~=6H(6$4|bcAkTO^EMh ziRK~)yr8FmGpnTa&rj7le-b|g^YNCT?((33jT&qSJFh>k^l{SB1)aN#xXJ5YO6ZXK zh`Jvd5U^;-HtLmz)&Tb`#>Bu_r%BRHDF+oRm(~lg{hBZ>R{N@CH*-tM21x(eSxx69+19&`rLlIx?)<` zw#J+8{#xb(v8D)KR5xm^FXr`8X;z#2R;kw@g{Q*tc6;-MoY95y>8s_{78m$jMnTK) z)VB!db)e+Si3F(&u?TV`8~fcSH#|=)B0`6kTJhjIp`lsy<0?a5-TD6seIlP{g1@sR zz{&oQQS+PxqnrO?G+UdLGJ*|FF@0IR(a#+0x!BO03MnjJF0w1(|5pB)3c~z|oSw1$0&8Z%0kdtE(6BGX-B;ow?CNpVK!DtDO zUVeauW6vxFatVljH1zZ+Km@qu^>PY9t%}s+c)rYju#}kCGl0b}RAmy}q)C)%HXlr2 zB{x`D8BA)_a3g6I^&FSDB&$s9u8PL>{493KwoFVgretK#Y|ZzvxKZGnK)u3KUk$hp zb)(Obg2x7B`x~A&STLcyT1AdUY|$sjhicQV!wb3FU~(xJu0;iXh>eTyWwwbhbBljB zzaFU>->GN8&%5}T?h9+(0*i*T6Vv_m%`#~>Eb93SOr}3F@q8`3K8njCH#pE&vMk>J z$9r7C%CT$u5d6maH^3=!AEtK26De_zZh@f169Dp+pyrjD0M9R8=d!X0Qu9>g-AR4* zo9c)w*v^laMbWY0y-YGcKKMguzpl;{%YSa?mV1TpIEc*ue2yM~6}K}LYY_xKl$a>8 zT{Oswq5W4hZnSx3KA$Sm=V<^uj2@Dg`?YMH9Zyk-g;uySCY|9O68a8xC@CH-3$zvh z^cJ7n*wYgZQ5Jzr4f7UU();v>Ufiw5wGPP35u|<@%(69X-UdMj>y*P3x&Hks)nKJV zjI;{8e3cUHptulAtjtc2`I`Z$!_gloT*m^f)zZaV7+ELCxxDJ~q_`o^)8+gIZy$2i>i)Wh~k#O`m zcBICSknmqCq_gs<9)&yo|6uu78?)pHzzg8fD09fhet(YSF>URCi+M|Ra)B~l(UJIW zD0cOQRhQU>p``??LsT5G%=iZxAs%Yf4>BKQlr39Jj2k%91uhf>9b>FxqUOG;`3ypf zf44n^ZgE@bbpSU3B9&JQuOafi0ny7?8n z1ouPR^Io7Zm8RI4rKRjF`*&Z~RhM!fwX2O)xuQNo8+-nDP%5h~s{2pedG*Z-AnQgh zt^LqPc@{3Dpg`F*+EkU3Tkm)C#>+ zm5^gUXZ>wjCal*_>tMju|wQ9sg{SLJE{ zpqkb;3S2HHLN78h9?5AtF<&G|Ur6XE`qKu<<7SW>$U2m5^#k-@Q-u~NO8fo1yLCLa zlh-;L_giUwZ~t}5!9}%F{kDacQO_S9#MZoa>PHzDbVs}gtDkZ17QF2}CAa>5$^U=a zwMk0#(X@zm6SDv{ZB=>5qK_|eN9)zU{Kge-!*Ds>W@lOws|V#@^O4~{%+wYBGzoLL zX}m1@c9g5by7;Davd8^CGG7zFcUX{SOp+ml8uqzt3|vH7<0=0cIKT+g46vVS*}A9i zxh^$^Ba1c;8)rZfWg_{ya;821KicqCaV@=;{tfni_K12?h+VvrxPgL(*!4>I z8T^c z<&#^A|LLfD8GkgZdWbwlJN~lqW`63sO8*~thl+D)KA#qItV8%JG1ETOIVbpd7hoKm z98Cy7m!IiA~1FO)!18nxYqSfc#kL3Qd;oo1yTiN7D*(Viza@c2YPOdWjglzoag@mn*ot(H9 z8}dh6VH=S>co0uYQAW4u>(6>QzcQcfllt|PT!MJ`H01nzn_&qQ`M1}Z!wt~<#gf}b zsi$%Tg|f>i-W4c5ZZhfI8@i-%myS)%mCHuAz3dP0KW3U9D`;iQ8v)3*yH_U|I%jSI zT}Vz`!S>otRx(nMSLw!eWkPq6MBjnSO~7#TugPTy;oZb$Ap-*B(Ov!}g4{%m($D+O zKkv)xm2Rw#LjzO7eN>U^L6Q8rqM(F?I^py?o1=q#(>)2%A+KZmeM}9shu7*uf731|qQV z9_Mj2CocoY4al1q!T;fHrj$2!OMX1~=IXtgR;dwLZA5KRg#l>_4xIY z_ZuEYO&PYn-)!)zuzh7NeEuFQ0r$X^LHl$)YDQ?$M~%A97hUvb4bZg>YZWrK9fgn!gp&1|UlO;cSP+gT{q(?0t1b zy1Dlb#~v8d%3OP`u4~Pfq)(Q=;THOs@0&QXa%!D5jZICVb#--{QHww5l_B=Wc_;KP z$cR@+jZ%>3OOUD80Qo6(rDXUr1Dyp|v-Ha6FZM$Ml1WC@eWepyJjJ~R=s>TQ=2YaJ z=USPgJ>k`;1VP!d0sNq#icQO8RhkK4ak5=rk^HF211GomZBOeB;|OiN0ge^{Rn6+e zfz$SLj^x~7B>$pDwW%uk;gdXT3sv=Fko#S1v@xiXb)Z~P;(7?M)^40#dt`N7vAkb; zcHg?MK5%gpyqQ*+-_`$lYrVf^X0f&O!$<5-XR%g2;H4KRPK|YDl?`{Vo0aGPmj#Fv z^#w*MHwLSjT3> z+i4ji<}3b0QT|B|JVp%3;oeKQ=}{f;p)jAbT^0Q=Uf;FU5`Hv#7y|oSzOFMnk*wys@6fTeE5vkjdEn9N62iaq zyOOGm9aMaDHY*qd$Yj4ChaCrXY90#d;JQqL*{2bzwjvM_KAcyp%mYM=7j58LPA9CbXtTasBVV#tO9oo+ld zV-ZAJbY&O)SnT0iN`xIV!RNMh#kRsBS;hdIx9RZY^)wL&j(a{VJD|Mz6B)Y&^!OBm z#B9#!3qEFtnmy<6K(2ouuXS4Xa=c&ztq zdr&cP!VI!DGe=Z=O)rx9o#yBpVOQj}3pT{=)`;)pYRwlnpW<*2{O2E%K`Y$2fISs& zx&>`o>bRt`=#!(CFrXCRQ@$0mypwG9&wY6#LPsWB;4zcX|AWpHC|>`zj2(FYgDXG`gK>Tf`#_u%&L^wW3g;hgq&IO4`jWv( zi{32t=IT+YRnhf-7rsOXh-Ao|%F*OcjBl1NR%?|$KDbq?EM7P8L^wn1m>o>20%=Vw zo~{9NC~L5J&i1P>PX&k+`Wy||_hc68Q81z1vapU>mL>aocE zT?OM}5zUs0g^J~bB;+#!2QwitJtoskkBUb`@2<*Zx(_Hgg2xKs<^>yL^|A3pxvYv? zx`oe&Uh7r5RCT^MRNjk9>K|&pIRK)+(aCQO)?vDACixuk_X{aoG@4%A{kF@DO{vRS%`Yh%AaiJw-)FCLyihbKAp*664*yQ998uU8+>-|TC_5D zBdaBk^g#AWg>S0O2rX%!S9tcU#B2}uVNzoLl91sME7de&Mqoi|c`0I*@_U^hiJ`h1 zL|c0l^e^$}u{9!ntYwCi>OXWjhsn{FmCJ#X-Pq}!E#6jTB>sI{z^djd)Y-!Dr@1H2 zk}>Xh++PA#!$&ObD#nQ3l3<#dqPzWxP9{`u-K^!R4NFi@`YA_x2OmM1u#Q9)v1s4g zs_Fd0m+0)p+wa{SC<30`L_9=5N2*q*nR&KU?r4FevqW{~Mqg8HvDvPTmERM!dtAvM zaJ2(9+tbZ~?3+8VJ>D33zkj+i(jWsqw#k|QsZMZF9>3kMUH)zYOKc8al!jeP9`Y86 zj7-JqQc`m(_GqyHeB$p8gF}|-^b@XTfh`}HxnAkNdj=ik@Bt1OlZrK zO?J6Py{ZMUkrb=vxQca0*P$EIIEHIF4FTjyGM_Be_U-;Q693Ma3J}boVYUR2Om_`V z74i)Lr9kj<^3vn4HvO@a7bOX4YBi%N6gtlD;vd$M7tz#tb4JqT-~`5TVzj;;^s6Xy z-?NnFvCg*v=1LX%s&(< zWrjpy^&T}Eb$G7zMiS4pgLxhvZXKNtLn(dHZx{(lo1Pe+n5Su{PXB&AzXN7hHakhi z8=Z^^9sK}U-4b9d-yOVfb9k=HPxO|ZlN0A@=sQH%t8Yg6o3;09=a9q?E-o$|K!>U_ z>KJ+edwBftJl`$RZ(^S`{_*_|g;3hpp!w_b{#Z&YTky>pb9Z<5KNu_s(7$Ka5KQLsuhRbbt>NhYd zSv6MzC9|VgvEi#SL@AhV_Nm$MCg^)*f|X|8o^ByE@OWGN1+rPx{~QH&Co>o5;V2oI zDSfQ+RoDC`uT9M}y=0$ZV6l?(_3Uh>1>4PKTFLnW6B)c&TA3_@2R1>WdCl^te-K}p z!YLCEFta67bW~5yLa4i{$fIL4hfW?+_ zR+36Vch=BI(p%Qp@dO5hm1xMtuZY*Wz?Hpkc8c|m!W!)txobI=MR7f74$e9RNdOKk zg;h5J^TSO*&2;@onxo#xy-P3Qu9ZFj@0xu#eA$az% z^a(3&RY2_bgFSpr6ZbWOOU#e5J?GvM)G!EgR__wumnp zm(8(IffnI@tqeDmtZW6SLq=L9xDLQ)=fU8Ut}*$~b0fRNyGQHRb#jW9f%ay-kxQi| z&QrV$L06V+4+sHL*JpX*;uCo-WcDWkVcVdj|ae*52J)upfalSCS;%li-e0|-TO*Pk-dY5F$rZ}6rs;*8O8A@B0An~ ziNgQYV)rYf&|D9>eiwvY{9-2A^E9jE_U2aeku5S?SKKr z&w!Dtv-|*mBtEjJY>MsxTV}*Q%Vf<0bq#9g9A(oUlj7EBA{40?30m0*hm?xQEhK|k z%+=qxYB{&_PnRoWCh`5apY{vfqj|@xmZegVK2XOFuC>P~323DH_By7d^R9M|SZ~pL zx+SB}Q^SJ{Fd}a2VI)u*^>?HrKI|2CL9nX@8`Xjhm#7$_g4GSos5oFq8-vz5Vp{ap z{qOAa?IrPX7Mq=n;<$k3Z^Rcag z4f`Z^3bq)K;IMvqlOUxjjoZa438MxNxVQXl`=`|!VYC=6(txkxJ|NsC)gJzRFX6uq zi1s(Bexc&WwxiCUaK%eYotbF`L9>sq-bx%(w<_V?n7E4A8wO^&U#BvbBFfcN!G?(#t z%fUm4nDZ9Ka4O?YBIub{v%tRr3Te!m;{jI>PyVo*Fmq@cQ)zZr;@$Jq7-R3NM3r?cd$EaBuFP^FAG-& z!V$c^$4k_=N`5cGZ6p7|PVmndT#Bmb4=b56}U)acI0;aR*lYWBk~e@+Or+FuDjh3g!A{ullEFL;I+is%o6<{-8QJWp$KnK3M7uAd1>IT_H78 zj*W5pZ1hlHUtiNPZrt+$+09jw-9v19m;fIik#qzBZm|;r>nkEF$9L$s<14b=tLMN9 zkvOR}3zxpFRZo=aiELja1ZtummxN)0trTmwFt+@#E4=43GV2c_Q8nj7acmjtwX^R% zW)rn>r;8K}gZJ=&0bjDT(#T`#`G7PlIvMPqwzA9*B1_* z0R12F+)5I54c~Z~)+CssnMqV;uy@;H_Zkc#gk2wpe;F~ru}q>+x`?(jSfcjJQYblNsMC8$5e2+1&)2XG_@%Goz;lCkXn`#UG*8r0Gwtv7S?wlA)y}oQH zB;U$0v>FMcjgubx?kZ(Dmsy~R4p8hAsO2GC;?-p#n z#w$6|>d*0d{*wbhoyG*vLaC_M<&m{;+K`k>IDM;)gk$R_KYew->6eYf!iTHd7XMfq z`fFjxxq976`zdD`KeQ#KEDEua1eR;v!h}nvo=JDVDr}lBm3_uC%3pNkI?r!5;4+X! z0m#$3QyT{L1T2aI&j3Gc{>*VJLt&qhw9S$dKM_`t46`&vx>9&_JiMjc^sLOeQqMw9 z9GuXp?-daI<~mmR{N-cz$L&vG#~ncU{S6mBIAEP(F0Qf1SWS`t zAJwO0hUTp~6By`q06@U&)cKSDpfP7Wa~FFMAiZm|>KPak4#J#n3|_MGiAjZ)11fef zp*rCK2`0t5gKR?H*RgT~8=tcs($z+3wWzmM6{I6!r|qglHkGlyDk?H(hg#%@f;XE; z9=`?_D=>f>t=wL851s&@pLZr+kW~N*vX@zeO8FuqqK_4JnzG;_z$f+jU4euSfFAXz zA{3`fV&AHFk{216m)TTC0w@u&`Zza&A#qz062AS(p@B-HXTNFH7e7|>98+LgDyXBQ zqxY{J&A)nIglwYhpSr@&i)GYX0jUO)^iLZ!6X?nQKO6K9EZxMTrd@Qs`ktCb;-G9O z_7NAQonYE~T3-3}q4E(>(Kq!@I`~hkI*h#Th#%doJm&}m`jo#`=uGX!v7Wt2-?0Q1)WZEf{!;V~DN zEyBbZ0p+E}D*FGd^9D?}^0MVzo9SZBB$}xga{n^6iOHqvi^;#HNVO76o{l)B*BudF zb!~%v2~C;pD}5LZ6?qrxpSb8A_0p`+!M;up&nWCQ9)5}m+D-2%+5#u&TpRQlEJ_)f z3WmJexor0~qM!1XhKL?I5pKw&5XJ^42gwxu{JJd)?J$vAz_~B;NwS?~3QJEMUOQ_c zPUHKaVQXyZXUzD%%=nGH-qjC-xb;{A@v!$QIb;#ezYl3htRQgPmtegdYM&fHLAf*9 ziJ3#kK~j$5(AC|3}P8AB4uGd+`%uamQ;7m#f+9 zOSeEbKiUV{mde`@<8v1aB^(;#LR*lNB!k0;R$^Pf9h>Ni_84n7)-b8gQEv7h`RB`g zHdN<@K!FB*b}1z_8^WKzuTEYv=`EdOe&O)u=6Pb4NcymvF)n)QVYoMt6M-7ciH7zp3pig9GhK&+$(%mRu0cvjsiNdX_1jMItN z^s5IiUJ8N*rAL}D9pEhjy3j7NS)S5v)q16pgz0Q$p58uMCQ$&sRKcBV;2;kVp9h}v zeTwIHZ{p#@+Qy{8fn0m5oL$J5pstIy$5EYUg#8H@oHO;dJ_B{FEmPXM88Q{&K#kM} z)Sz)z+BiOgJeu%_e}ULN@@p9v@6GzK(urGvJGCIZCI>A+OVd@6E)%qs5tL}Pkpt-J z(fu({7@(sfzW*N`m8o2HOMKHdy{yXAZOwflSHlsk%)`chxc)h)GEsYgecB2@t=JrG zbFFCs9bPBdvGl6pp6KD=77jiFlvir+Rho1N#_A&y@nbDeC#Qnc9c^~i*pf}(hW=`r zPW4=@ZS?>DiKtCW`k(FjCq0o7BcN`HzuXF%Gd}I!z83LxvyQ$-e4@=2WDAX~5q;;F zJf`IeVH%j-o`UKlbyNxKX1#Z%NKF#P*HrGhZyFiMV5K6icLK^eKDloYHh#tztfh2N zS_c-)kewDk$&-W_IN@8bee^5iIIy%^z z+1(THXxCccIvLfN_*Wd&0ypGX&S2>r5cpG;0z`jzO%bKNAddqKB+fZR$_h1%d`bo= z6O;R!^9q?djVGN41S^BMun2z4o$Xfmo+}wz>mwJ8sNL}@4b}T)d2_aNg;3}{GO$i- zf1i~-cA}-(a%2ODGUo*@!cQh+ada3lLNU{~9Skys9;6-^8;)20l{ThcOW}4O2I3Zy z_L;F$XHaPx+&rDue(?7IQvIo*dhmX`yruX1QxU7auH78WA77Wh9XtG$bDR!$XW!jF zy#uV99?kL;GlzP4NC7gAp+3)-gQSmobv&pV`sGx7kw7R9Ws7<7o64*}|?>qV_Ff+5?B0 zkp>bcW?yA=9U8oD`pol^)n7zdfs_74$g26qtNE_H$~sH$`s~%_ngSqZKs}Fx=G{9K zr?MpdcFn_&J) z18r?>zS-X1=2n_A)NrZEm6AuEog$nApkB0Ymp?O&L*yK-c0n=1)UFy--z(-QD9~kY zO)$>q`n`VLI6W?r*Ka&x>e(+*TMdJXtC+Slz@dXA*{vK1^f;vW~j38;zhy zl?o_av0|Z`e*r;e_f!{YVwvjS46K+RO0Z>N@=392f3M zr9Aaykm$T130JXS(heU((*j*2Pbl!R9`(0j&jy+xtg+lfGYAyTG{*D-Umj_Ku+UK2 zzF3Uz!;ZC)#7yE`q|X6M9XU}wJtOTU!@NyUIDIk%{`mu<-AIzC$>}pQ@Y;VK72Cl7 z)b%Due3$@46i1i^JaY@Z-4_`_1|CyZ5#LU5j0bu;B+Z>{onk*@LuhyBP=g-npfW?l znoJYTnDVZP+6QBiBA?kcmy326i*WQPD--E1s&h^}Ci&C#0IPYPIbgoc>|WZN1+oOC ztNg_v(I?GSIy#zk(DMw48O7@Fd!+GmTIm5;M;zV$64_Xp86%zf_5m(mPoV8cE6Tm` z1q*!w`~e2;By|*ko^~gcys@KQF*pSD$ht4~AAv?ll|w1R0ZE*7D-a`3V4lDToRMO>xV0OjQ&ooA6}f zmsjRk-Wf~_-~U3akIFuk&AJj)%~Eq%R@kyXsdp4o5G#&I0(&_dU?67wTPQ>iH=4|& z&M8}@E$BGxz3j^d*B9=R2{j(Qk_MfKPwH%(*%z*r{eMp<&ObOlemJ!wtM!vSkn49e z(1`diL=^TDJqb`P8%$|(+f8;0D`E}0eBZtzeUB6Rnv4$%up`Y_u~43(()=1cCG!}+ zP7y$w`Tjjmb6Ro^&Ohf`&Z5aWtvOZ1m6WL{Fyxq_Dsr`4O1ZhvSRLa##}}Rmc+>y#c0)+7JZAB+H6 z2yE8%yFzdr*1*C4vo0%YL4&qUAr~02)xDMw41zqx&Koc0+*2kO2Y$lq~<) z5X>`yEw9F1WTE-5&}pFxv?X@+1%^&BM*S3rF>_6OY(G6O@+`1xY>#+$U3#}BuieSO zJV&k@A<}<$68&%}(itGy2-o}lbQ{pQzforiDM*-no=~rzm7wh+gslCsy~1iEK@8Y0 z{_sGKr-U$04q(e?5*t@#KbhY`#6;+!^_w+rw7BjkvQ^7yuME**Biv5!ec~y|V)V^2 z;0ug|{O>N8`R3ZTjSJ^2e*py(O{zQM~F7G9i z+lsdY*FVo;t3IB|NSlI~&eyvNXJp=nN7o?>lkWlF|NoOz40Me)iNk<|y0~iGfqqze z)gs_Zr`edCfWu8Vw*9#0!^{p>?{JzbjY$dVkI=(XaGj<#N%W$fzV5YOdC(1h=I75q<5-aA@qu zfQXRI>6p&b$ZLUoEjEt!#TxV#dkv|^qMic9ibb4|Y*7};k@IQWGN;UxB=KJ78DslQ zpouOVxr7HuVN%}{;UAKOaC85c1vn`?6?Q?cK=J?Z9fUvC)YmBHIZ|g(;x%m@zMd_U zEB0B`wuRvN;OZk!@!|BTPfEd>FeO&b7 zm=o(Y!WAzgux1G;VUkxvMwb2^pi@G_q~!UEIw(o0R_*~lHoR!Zm)Wk=Xuf**0sb`s zxRATR-B(#}4?1{G7m#{pX8CL|dL>TC`K!l_U9raEtsK2lwhw*Wc_n>{(W_Us!m)%J ziNdXMr=63g{R2C7$=LHc?DwSV?GwZJD)FaOW@+-SC+Bae)SQgZ^>vLV`GtWM>A6jed>3A!K%!AT@f(c)b z_>t)feMsRJ?$l+hk27nqq06+_A*@YZZ;@zjFRP$|ZoK{iCnG*+Jm3d1LuP3#Zw)^g zOZ(tQ@@=sUtK!zyeiWporPObPFo|HdMm>~kMrtAH&In#^J9zhG2|9XS7~Ne>sufuA zXMZ^8y=vbqoM>F^0dKa6EsYGgP%+hETe)-?OURu&C${ zqiHO*CF#8`od--9E-}=2L{cA9V|=wz!n+PLn~vXvM7s^aj{k`FJG*MG)+LPBdA+K) zKJa5e!(OQIJaDSe%?z2go&5UmySnQl_D1>0?`fWu_yL~Yx-N)qqXH70$!p+0yLF6T zN#`F&Yoeh0YH>}oMv9U8=eRWWht675jTtVjPokaD#9?7ozMocqz~ehV2jh+EKH7h^ zwUvcz7{q9gutIpgaeNo{VXTmQ`?+$OcRQy8jH%9LS3y3h@soFKW$I`=pMi8HRyq*X zX?wgQWPx2D`I~fPn0dGkC4XAr3$)r~law690@-c7efRxv;Cf5milq-8mA@*T*a>-r z(Poy&Y}DPPnGnjh&FAmX48*T^NXr3r?X;?uV=;3RJzA+4*>v*Ki{MU0lR=cchcC*lQIAiAw%S&}$pTvk# z*{*lMY~IK}lo5?LZ!3>XW#+_Wj3Tc|uSNSv>gQ?6P$Nuv3{|0dj$ zOVzH@Z__MHxlDia0(IegKsy$}ub8m8jIi32C1!!YjT-f$lhTl`lz~%U`_Veuf26-> zeYd!Pd9DJYjD*2z<6%(>AI)7GB9zf)7@q^5+4-d^==3@DbG#Bf;F}@+md{i_CHH0d zMXj$+UJKV?^ouQyd2u11Wo~lgHmv?xws&=_X$#S+M~G0hz4~`AEcI2tng2xMdN8Kk z+xwZR2Ez97sumn4u{mM)Lk;*7iof{d|6}aEqni5GwNXVBP(gwMDpjiV-a}D32uPC- zibANOAP@*u=}2!%3BC6gIw-wIYUm&>v;d)Z?#gfPbIv~B{q7j|KSoH_n)99Wt@C;2 z>p8t(wqLXw*f0Atf|E%Gk7?mO@FuA{y{k$-_+UmEtZ{UV<|9KJMSb(wAa%R>dql6cOyF6^#s-V`=FkLe1Gc@Dp|=TrF*m}43Xu&$%q>7SWM>j62do(sc}mRVQ)bom_U zbb8jlKc{@oiS+5tuI)nWK0geJNlgly&#dz;lZBI0Q+yjoZ*{9lrg=?~Tn6@Yc{9L} z(gBw$x5YB+ftArLb{fl#g?;!$&#nn3_{uK_ZV_{Lpg-!~JEk?xvGHDAMtlboEE7Rk zftmk)<+CXEqe*sJiQW$odje)Axve3x-cd@+`zHa+UBy53Yf$%dxei^~55^g1PskI3 zJdEz#tq>T~01Z0!>sW*kt{Uc=6>Iev7!$q*o*MO|Vc~f|*rZWarx>39^AK>MP>TnK zhn7w~zPnO6JmvkAi_9v6#53PdxQ!idivFQYuTMB(FY{5MO#k5*mkEL4$mVxq!`FuC zUKCUN1?`>fh}<;ygi6gORkQYSTT^D?9~s&)A&`zYtLgoU4iD*>!7ZDqgOWZ*$d{8Ia>ZuiNt$fJqxBlVIWXVg0U zge9XUN+@l#!Bp3Tr4VPy%sHKvJDQIx3`2C+% zTmard-PoLN!9;ontRlzCQfs4e@(F~T|H{C>pJp@Cbu02rZ_-@3D0nUL5QNI2A)7u{ zs3vK8mk&3dTy5P0*#0jjoJL5Wm{IZxO(jP7<})DKpiZN-+vPM1O`Q;Rd&pgEa#AzR zZP4v99osvqU=e=7`6Lh*i|+z%2hCiiJ2R0^0q^$Qm~VVf5Eq1iWM|5Z3s3V`I}eKe z3<^<`$r75w3JfQv;XAz=aJQj!px7at&_cDvBZ%TR2BIbo9Cw};hBOQ?!CO>*OB+={ zm2`a`tk<9IefVNUd0{>M|7bkaZ$)*yOgpI{>vXXI-Ce45@Z>D(^!FV z9B^m&!a-?3JIRN(Q9doePC8HGoo4mj#SL=q3caSBW&?bv$K`#rEr3%s*`5HUUmU<+ zrhk_PfYrJKOyM*r@&=I(&CL*W!Fwd!Q^jX-GFNo+F_BIp@UrY7tO6PR%?H3PgWU+$ z1@zQIgZ}u0VmardoQ@9lVzdU; z^NwFlG7v?|@ZAi7ND%|C)dlVssd$QLD|{QQ{?a@%w4nWtiwa&d!&^&iayjhg*1E(y zwGBes;*#c|p>2(1)#X=FcmNRH6x z%44@ucHCS)0aw}<^af@dI??Kq8<(UDF_Dr1Q zIw63q)>9mJl` zzRYZm1f=m;JVlnp_XgQ+19a}hvxLG;;TgliBezxCmc81mL;O+u-&L3!gUl|vPkCd-t*Be-EP2rer{W^d4#-~q_CAY z3@jT*Sh&a?O5hg@dj!Qq{}X-Ty}%8ZK>AgmLVAp8_>Ge(Bp5JXe4Z15BKTFA1uoAj zc%v0{-EKu6-?@ELAQXbhD`+cgXTs(cq(Kv{{6v6fH>G#M0G0nvh%X1`fl1#};g!W3 zl+T~`!06G6G-;+pK{9hwQH8NSToyuhfqK8mQvBK#D0TC>wvzE1ng3s!G?%e($@DrK zx7Qv?OR)MzvM#s+jYTS`J$S6A6Lr39AqG%aE1yTGq7n8)rvyK43Gx8jcmFIrJ^?T$ z{kdQ9zkUN`^y$R+O{7d78DS9A^vEj*u{>G6T4&WGU?u_QFx#(l3jzS&a9QWYfYw?- z-F}Bs%M#&HaFE7Wi9i4Te^auXq)1_t5KKfqlW|`5IW=|VYCylHd2bc zcM5TKNEhaF8RMhiv-nd3k0{b76(<$%W7C`ucAGz^ysn>6QTlEt7!GC03dSS*Tcc8r ze2#dYY^0oZW-J+$pPYA5+ZjeZ+`V#etGvUA^hy-88^_7mvn{F^AJA$vz2hA8wi-~ywMK#0UobYcefP6*r4S+4tow)H3` zBC`&cMXD~+L|HzuR)6zM?zQS<1KWd2GmU-K>y=`I@s7$$u6jyAP)h!A-Q{ojt@@RL z#5`0qRlw(M0bMAkf{gGsAnx=9`EXzSuhB9x?fb*7 z8lo=KtB_Y7`0l1pcisq=8pQfbQ(F8TvNl}SYv0c;rP;T>uCT3*y43J|gBrSC z3|?PzGQkr+;Mq#j#RuoFeY!!usUl z=sgfJwb}5I+fkXcbvG4kY1Pq%=Y4i!vxB#vllgWC71j<1TGY*he~+CP&KYG>Sq055o+-pUI3f%>P)rd#btc=OGi~82)00 z+Laari;}y`*J-6nLO^!>@A|%&s+!Ee3!!5So#dPINoVkbR2|m4o+TQb@4vI`*}&eRXx;vt1j&%G3nf78nzl55Z=Ad z%9H!}$l-&Td?{?i+s=bYeLcY^hDX)sVmqi2Lh<%*yP(~r+F&quDw?Kk69^Is9kvEk@bWvXR z)$bUYsw&K`4((PoH3Xn6mg@>E$tG)w0UxPBA&fS{Y3@qT_*WlX{37bh5_zMFryPjsp93-diLcC!cBeZO8e*2v zvypwLW#`>7F6k959u(>1%39qLV0`xz6ax50Hhv`=|{l+p22d{Y@&}U1wmRb*9J8 z*EPf?=pZnx6%7X+vcWkv1jipd2i&aBq9w!^&@XDj-mP!=-+^eAO2C{La5^d=AXGE0 z6ucFUC>|HzY_MxM%?}+g@t&r)?ol`lD><*1%)Bx#J+Jpxp8h!Ab64YZMlwU{Des zT(SHEM4?2uz+K4YXCObFffD^AoDcd+DRzg95FmC?B30FKdcsgsvN)O7Jmk!X{4FrB|rxYSylG=U8+PIjASZsL9+)#3DdP~_=~O4@y_ zM_XEysHL*w=*LK>8{>GGZ%tgoA-BqjsZlmlBayML{n)dXS_%u(nDb>XwqbZxVM5hf zBJ-JD)TP-^l+^>$ZI6ICH$HcS{T5UKh*F1v{228`QTJ2@yfan#;9Dnh5xjVQpM77- zE~1RSO^Y~{*t@sznxi_i;O^V}@$W!DD<3TqbAzZB7dbbUJ>TPOutX-(``VGllXfa9lzGS2wyYsJDd;1bJU6e{DBhQN-d3|L zbUWYQU0qQ!Sj}AH8wFqO?%d*|k&3C2%<<-@NQ~@;#4tkguhULmz<03IAc3?mfBQa{ z262by@m$!N5{4#I!7gj*xbf>tY9!mI?_6_az9(x+U7N967yP9?o{lY#tc|9|RNt81 ztk?<{xEV=JskvL$YuYKb1aFme0}A&^szD5!HZ>s z_WgyL`3{o@;4Q0^{h%FzlAR%orU!kn<4pmIw>^=t#zg7=mBSwtaLv8KdGr!oqNK+o z=IbA$6%zXizskPK*~0kZY~|Fj$_k}GW!VV*Ro0wSbPENTl@gSvBwS+7Dov|Xa>Xf? z3|a26s7zl=6#ER$<8dX~=!hm?n|pJv73PosHTW064cKk{b!9b`mEOh~0s*x24_^$g z`@z~BHwBw7cFp7yPjYSe(O)15~ChQ(BnA{I(^pZIy~esLwpHBuk&n)6w$36 zeLvejhHg_2|9J)nM0~xb0F;)&l>_`PKvD}0aS;d7ZpVYHDx0N@gF6dGY5&cnlSO z=Cz*&0+XLW>gj`<%GY4U`!v`My<(k|6b6#ic?bRZysxFWmmSuZp114|1gL;vy=Y&) zuqSRMc_aGLY4}?P=kKJ;??w4X1?86vcsF$iyhBPs38tz?UH(Fz`MzcNgi1qUr@o1# zd-f@iRQ4w$QeYnU?pBbrk;UMv8e;=~kXtmn_tAo--?Oa}yH#b>R7erMMZzT?3s~M~ ziSTOUc={ie7F>E9+r8h;7|>wf5TcejoAsY|O%H4L0eP88mHE!L#BEhVW|yoiyC?v& z%dVdh6FIS#K^7pzyKozPx*TIQQwx>NS)d`}x+j9CCn-%*(qNxt0ETRt-hiE{>&J+< z8W!4S&njb$t-mw^B3;!6Dy?tt;sL2vSNQ_XQun^?JwuMSfHE%Bd78HEJHyC@x&b#J zR29Xzw?&jn&?%S>{kMd^x9Bkg#a z<_$B4>+N@H)KL(P6YzAqT%g0L7Ak(wsf^v4 z%l!@xoU5em1_5>CXyJ1p3d!U2^$9}ruu{MDdognq=8viB-ZwLV?o3Js9C{7`v$M*g z>DA8FNEn+7t(^XqNE%$#=JwbPMWWbL>!;*wrf%sweGV8B81tToR%4e3EiDHS{G&tE z@1Ht$eXJ>*&dAK`vJ1VOi|Sd_kp zv5y4a_Ls?O)bw)`i~bo};~lj{zYvY6{;aT{#m>xsa(?}`k}^#;1%GC$Neb_sSzahQ z1$OlJ1p9Dps?O8jqrt7qv{C$2+k^LFQ9xXyS_RvCHvFle#rhT1MrP53>CZuFBNrr z2qrhB=7KylD{rtEPf`@ycIowY9$!s70GVkim`>e6rRboB)V?B*U$<96yF6dEq)@nw=>HU?2pF&I8-m%P9I)S^`tjri4+ zD_ErB^vAlN{loI=QnX7o-)X@Sp`Yh=c!3t_tNK*~iGmGW{g6gcw@GqE_VCKpB~=?t zF_d04eKh!9*rOcF>oxZ?p!(cmlH!x$$kUBf4`po$xLL`W`{MaV9=io)M`h`3+YwOo z3&B+@kaXUENKYc=r$lBLNakUdHSat#@2*s%(z3~qo5%3S@iDiylKBYAR;QP;6B}Li zwX4=LJfG9KpU5(sqHrAzA88IU+) z2U!Vlq51RQds~&r&Ii&LX;*K6_8G~d>7J3Fxfup&p$j)>oKYq#QcrCrWyDshM%1;3 zh7-)Zo|HBnB@Vss+`NN7JUq9r{(|dPi(PBeaD{O-{cy%OG!eIfr#_VLw!|wTHSFWT%|(M4{&Suae;z2aI6iK%Cs3jJQ7ACoO}<=4g2=DMWvFSZ4lO?Sr3 zcQ@N|^O(t3$b*?wH?nP`T2wzbAI(H#PCld@Wt;UGeun0`z85S8g|_{4n~09~_v~`w z%`sa?%YOaq|7kvgd$0E)(y`@-m0*0Y=&b2$!q5kMgMDO31#1lX`g|T2dNYn3X(9Ol zUPerS<)mgh^8h!U^r<2r`WonLoJ!G% zZz&ss37%-$Db8WX7={p{c@!|NhG8alNVl5t4!0VnLTL{^_ZHO;^`ztYp=5tc@TTH_ zmQL*-Lbs{rWN$2~t0nfLg{tQwyuG|aGZecW=*CSftK6U(N(3p72*eDUp0?Rrkq zpGt_vSa=pc5Z+J$HV+`H(v0q~rhJJ$8%`@a>OZ4cq4sp4{YEyF3;%99JJt4-%E%mQ zArFtRm>#m9aVYrMa@2EjM#rV*ePwU*r|F%LBGuBH?cW;L+39*CPf3S_uXozmG4;0J zbw^-WBH#DpuL^Hd(%D&Q>w58G877u^$ zW+zatJo^EgrxDZNzjI+j4c5em$H&(*5pLeL=-JQ-2d%acit0t)3o^{TdS;`Df@;*} z11rswN~7_1RkX0)`r1y>ROrfdM1G4#bA6Kv?CP#btj=C*(Y_-tmh2g zZh;@hI{nO!7g4iaFYvi=uAqc5k@zE;N#eJiq%N@fb58%`2S_Cf)8^0Jds^_tk30teM@LHqSIYMzFWbKG`zHWS0}gkO=r>NtfGITnAv=R69mx93$R#H>01adRO^ z8M`l3M4>c#j=gQ9Gh3ceqnp1pZ?D=>owB)DJ5Vx*%6ipUK(oPQrJA@LDs_2j(VlHj z?bP=OnGzG#JjKiTex7V%fB0?jG}ZVA%(XEEP@f^&CHM6ShIFw^hnv(K&K6XsmY9#= z5^2=YMorb?RZSxKJ+#9}>~rqIl-%5!7X$7?>@??x*OyBOxLn!})m)LE4_w@e(vg4P zQ;HS{M+L90mJBmAshsQ{$0sD9^-&i?igbVDjXtvNpN@Cz12pwdm}->xhLD}UN0G$#58Z{R&OlloeeO$i=9@24$GK&Cov(c}~ zcD(2XaPMebZTx&n-}fg1p8y?y|F_kD4ONT{Ts1l6@hv*9K{LT4~svS*ERSzx&N_YGoiXD-yV+Jv$9%~=S`6Lcg zq(@U7*0hk%mK85*Rf9jWwMc#8fBJ^!v?HJr>O!C}9@cmEnGK?DfFa!;bavQ&Lnq5) zlRfFM!0~Q^v*&Iw;Su~KkgRDtBnmp`!Ss+)!w7veC-3Sao9j+QVkEaLaa`&4c86?p zl+Jxmtnp%E)@rOMDzoYJBP72lYOPX0Mi1uz420XL_A8J4`$NuQ@njh-TPke>saM4% zsz*ISDH{bmu#&`lE)mB$i5GCa)0b+^ug-VR)HlvD%`QVrg%jqIWSg@R9i4lG&i823 za>M&5jZ-#QMCXzYnzPk{WBVu_&S2rv{CYF$)O6QTi<4b4lhnZZmDxX$6BX;w>|Wm= zhpKD+t8$MR}U8tg(GS`pdy}XEz`DC-S!R`*OU%OQ;bw?Q;Yg>{28qstEh@I2D z%sE#tJtv+8Ff(w|S*^5HPq54T70Br@M^Dx&aH{`IBYFu+A&Z)I0uxZG85M3cd)pHn zSm_YYc3qa39`DRP{&ptZR-Aenmg-^ydLFzyShvFT{lZ$Lvvej?zsPe-huKhsX7FXw z)Mu+VBO%vX_O)N?S!kIPSu}+tZ_oXlKiw(S1(gdVvHs1ZsyennFLJ`O2fsBv%_p2t zOa1soF5&QSfsD8?hP0SrD436;S}X~EbhZgqJ0sX-xC=$O)CyH zt`0XKElTa@SK3tX^b8TQ-H(IO5>oS74C8y8{f*6;WNi%458&bPduTzPccC72L)kAf zDzF_+NeSIj(7*nae+nV4Oe_=*Iti&xk50w9NI}}fL&3}~2YekfT-~?ss(AB#78D|` zICpWAryNoiDtNc{LmAi3hb>@hQ0Y=E%62++TbrHBsDf_rN2B2^I{+l4tUAyKON83F zl{jo0nhgY^Lz}@d$7Q2M;I04<_nd&nn&jcy`rgRMV?4K(+9FSW7Sl=ffjZiy>SF>o zhsa~XN(!J@V#QTHinPK*~1%NVeY?`2tXRHhIwJb{WP zMpCLgPIh5?p4&F|T3d5v(J40+)3BZ28JU8}{tkmu9qn|pjnIm9ZZ!Yp`coE1v0`Gv z)bA-t3tHo9VEUyk6*g!RF>1$UNZv2+w=afHUeY(?ObQ4N0^-lFx9?FWed{q?QRS{{ ze+IYktZH6080SZ(NYu3Ra3HN4Q=Zm!}vmXaTg2AcI;|3&AJXFR#(!p<~k0#zf zmiB5i?3&HhpsSWW8O_($ZP;u0uE>C_Xf`rKa-n){c#?&A9)g;-=v9It$`G)9G=;U- zN+U(>`Eq~?skF(X;CQP-xce4ow~M4xeZAr^vr(9SzE{GRS$|g-XAZbCi2bm+u_<)Q zU|K9r+xyS*w?Yq}u|D62VoE*z+FhpWph2u&RU0`?v@Uzj$ANMi2cgQ^)mrl9IWyOkr~9hQuo?-SOM%G@JW) ze|J23aLW4)6+hp~`t|)yiCkv4VbeyrAjPWZ%xRSZdo*Z4)$8bx%id&? z-uU-{`@7@z*YUO7-l+4DVMM5Zr5&~K;rexCT-44!7R;OBFAJQ1nb+-Ia1~E3eEX@ivpWjpGUH?ath*P4)ej6BRXpEhl}w$qP5k^27?R z7aXZrWm}@(^+j=3m*~r7JOZpdESkHx)YXMHGYT4?S4SJ=(xosirK=B6uHska^KsPssu&!5&h#*QTA9jy7@ zt1fTIVc)cmWrq9zEQ`qq1yoHMTiw}L4b5q6ND=bA`3cl$18Awo7MDWq?pJC?I>^d>xXo-0OMpLu6TVS4O zEGM3xTycjvTlJ~|ghS$MAD;n#00i!K2aCl*SK{-IKWx*cBwN`^@^432$lzGp{43H)s==nLktP7O#{=&A}`` z%p`r1iujrS2py{iLMBwHcJ@5<(p%IX_TAYUx*-hnUD~o@#BN=r8;uL9Jgs$F*B80j zLo^hbhiGm#8rLW};ZZBrluC{&9Ij^eG`uEzLD}Taq^~8NZ4XMRFo>Th2!*VxMpT7f zVxpJESnLLE(@fl8?C=`8fzG-eYuhXTrEE-e`SvfOLwTRrkPryEdw*WzK*78Sfz4!H zH1L>rtc`c3kAeiRN>B!mE8EoNE{cr`-|w4fx^Z-nQpV!!SN#S>W|!kF{-EKg*33OS z)N-;?hF{_3yBd3R<$Nk;`V|1)H(pldynGTb)EiyB0FJO|E7=Sk40Scx=LEeErdEwQ zjDze1sa&g*l$wZ14**3v{jCMW?GOM$U zS=t#yD7By7r2NY%ylH>(9&BC-M_`CjyXLL!*|A$5uVQy&s#}3JNs-mvTE>h>GB%gF zD5K#_=HbGGkSzO6yvqTR`F1CyB-%<=_mGHwDLEA|_qj5W2 z8nO{oNc50pVa5sRObuhUt%V(KWHXdj@ckrIc3nILuIaHrg(#R2MzV(5mm}@bWtg z*`b>6m)G<2)3Wk&4nL}geyf`iuz5#1M>517#(oIq?+bK1{j|*qPswa_m#uV=B5F#E zeYAHbq|vdT92Q8Ux#h6E5kTVnF!sTL(ib5AEAkyjrAUv|{M-wk`kw#%WpSyS%hgv| zvp!CQ1cau)?vSY}FW1yTRh5v>L(raHylSe`NkVHDg?^4^HUFUG>OQ0Q{3R0jXa)H6(KX-0Pfg=FmU> z8UOD0oZ6ky02@qGRTGb-BBr%vUmuYUbr}pFn(P}UzHG`UnA>c^BrHxEeQityPU%Sh zIfCQ@ht$14Ccmvx?G$a{YR~0kbm4xYh52r#26hkuj_SPSr))>XOZJEHiNQa3;7Vg9xS7Iv34Pa`&$|3oAVUvK9_O&eT_r_x^amY6jBsme!aCO>j} zQ`)$vQhj6?Vt1ko+*0D~5l8r8Qs_K{qvRLRNO8Ogq4)@Cwl&|D^3Y-`_c>EOdGP81wgRatwu$PQ0&{S_BfE*E}S@%L@O zStNVM?36BwFPPrM(bcuuAVC6nhy~Z)Vd{nM>foT3Vgxu8`tSuiUCucoFF4yMLVSCq zqjD4_A~Aviz2IrER%Nfx%96M?5hjj)FndO_;E0)>KmHq*Q60q}5O&MGEnd&(C^Hl# zEpd$YcvDUNjG1otu+lcAqq5N6F?PH+Q2m90;!D7W$=^R=fe-ipKK$FS8ay4yY?EI(-ZeUF7LTw6CRy@{aY@jHX5Zn7li%~lx{qDu8(fN zH^Dxh+|4CSJb^jU*$9D|3Ki+p=xUF0I2&&Csi}VJ6!MW7Wo zaOPW!Ay24Ahe1ukk!@9r60QC!o7Wuh(y6W;xo1OlmU&>RAwY& z;Q>WOofpN0G)e<0HSQ_mJu{G@bS2Q@Rv5rrmD z?A`w3ud-$ff?S8A(>04jfj;jZw5b#0Ult7@TvRqR;$M`Czm*tN=A3D@n#l{FL<_w+ z! zo|7b9i4f4P_m-MoM!!LSucc|UaB=EN(T-(Gie8#aPyBvzO6b8pHY|m{Rl7+fhe9z+ z?tVl=WARx-)(_Q!x>(|fV=YLBN>p_enKkM>#wB`@(?*+556emAxo%r0FBkHIvrtsA zz{2&DGELm#$AQW$Kkr?%S72VGm&phs)wp&nN-V83&SiTk+sSBQPP-~|t=$D%{DDC! zibr#}0%OBfk?*mX?9Mav$x}es(_>HGZ_9&|s<^JQgC?-yPE$CFwvh;9 zL_w#UyCMa3WMyG9!4Py_Wt7#p1fhRs!9jU9QR@T8o_4?d2Q0|~oH7^5Cm$*~t*6#c%r-x}6_Xmpf^~_|9+5;y(qd z4B(abme{Q&NMrx1qoX4|ReW$+iX=?9q+z>W#+gR=a!nHg87g|v490r=-QTH`Ea=t# zR05Jy9*C>%J|t81s{3mVWAIy%{p{#bH9e}Nd`R&^k7F)l*t?ITs{*4G6wLYgAZirZ z$D?CgP`Q_t`gpXELfd>vPQ%{0nALij>`Ba0LGRhqUNK@FX}!9N%epz%nQPU7H~IU` zDjacP!^?zhm!WvBh!72?mwLrk_En~eS6;hvB;g-c*}Qv5mZIH_qJVlV&;6~495od< z51q=QLB?PpNp4=)uLGe0h3_ww!JF^nPHX?l+%dh}mOf+-dvuzS?R1HsJW`P(&ST26 zC;ubMq|Z3!%hp~9I4QcEA@$a>C%}g~%1+3Yzs~4-uH8Oz^fjFpU?4z!g@Hr)#~>h{ zxibGQ=hDZ+*s__!9weG9_$f)#xowl&zI1(kN^Ze&o%k%M4b zphAsH5biXdPniMP0f~HCO&5+@xp!A=#2_TgSW!Oi`W-9v6E^|NU~yHI23l(udydG( z$)wMIdrf4Y=UfD-MnW>$D&Q9>9Mk@Lk)HgB*Ob5oWw{Hf#S&nO0rAn-%F`~#k=+SK z5A`rypXVB!-uP+Ia(+{gOIAJd3xZ01lMPRf`5ylId9%v&8_vgWB>swD-vfj(CLBzD z6UBD&au`88Xiu9BV1=LjI9V2MJ8S;9Q-U&-!LN#aR`c=YhVNofRfAK$=PZCld=Oz1 z_QvF4`K+weEhhU0E*wZp{Ao6T{L;Jpw$Lc7Ulc_g$xfA0dNzbV_!Ssx9P^XAQ~^)I zOe$!-E_jHgw?uOokdAVuX(9WTe!~#do!}p?MhRLFO@dxpv*V>g;x+)ij(LIrc&h&x z+S7eLSnSnk0=UpA+Qc-%blhZ;d2u(z*NAxYyuRtgMpJa9b;@c&oTPGYihTDftaHTs z6&2Us*0WUKm?=%LQwf1I4yn!MNn6*DS-{T!Bh@wM9n1!y($$o0WF=?8&hMqMIe4|n zD@@z}+B&D=jZwIrIUmcyb{@NPf-(xsF>OKH>v53b_YHc47lEo#DLC%0CK%fbkD=1- zax1pYsPFr%XX>iuPYj6QnTLxSFm66v-QNCui{U0_;$y=}^}o}k{{|)=)6I5*+~RpC zzi*{OkDw%F=DK9NG0>9UXXQJ80Q%F`To-^AzTP@_@&kw^S$znAF5w}M^EyXsCh85E z5|64%lE;vI^T#^xqq{f!ZeBkfchy>Co*KH|-URSXPEFgJS9DKC25|_d{pDqn@8ENr z_%fPn91aN};%|O1U&~>a3IaRKl~b0gUp=C`?>(s_n_K?- z#lk#I1FzlQeGlOaw$l5(YV+Y=gYfhVguXG)S!hd_8m{8lR!lceOu(hapYT&7CX4wI zadzV+YZrSHR&d9F+7Q%-7ZXsSIb7&2B96R}ak}KU=t1*S8dzCySGZ zc?ECj?qKfm-~lK475@vHwt8#v7C>7C;6TWz)#?eo27AbVkZFo;Tk8MA)X~GoV}R=} zPcBTX)_98=gekZG^<%vf`WNU6CloAr&qX2-dgOT`<+; z{_>+>Ff0Csn7K65YcT-l6}QycPyq0rDq$A@F7`}6vDqmEGSU!vi{7`49)J;EOy;Eo zs0MU#OLu_WXs=JC0}ew)=$smspZxcOuZPMpH2)xZgmi&+!N_-fp#xy05QqSb$Id<% z>ayeh@i7HLyOs6U@mRn+08bJuF+m87_Q^lz>js}5S1MvS4cm$o;nmuOA&f)6CRTFA zgV6&4hbBA6t~l&%!?j|U%O_l53s0O1Ui>*Cl}EHpJO6cNG%P42MAo?CXyvErHq?<9 z?zQ!-%5GdRuS;gBHRe|slB6pVR@$muOeJyShnT&@|02lgTIXtk^`6o=-~%WAT{sTa zecZ}O)11;VP)Jo54JW|@aIF_RE;&%) zw)^+rQ`!F$wA_tfV`37n&%-BjK)R8?sW_l>4C!tQ^lF1wismpC=ya&AFrR7&!;mIz4)Yyh0bv|YIP*b{F__tS z^%tP1|GF2zUu#i!{2K9S&&fo&x;N!OVizy^-4h z=j#f`wgB5MlXN|`l)O<~3K}=lI4Q4@wQIhdU}-xmIZhaZb4Y0bPW z3=zP}p=YM#q$teLj(64$dv?OKOKEslr^^>XBU4!78uzxwHjnLv!ctVXQxXGi%^-7< z!HbhEPJzWRp6=!{*jCI36)o<>Fa4Ra}37Ip} zI9Kl7jk4hRC?Zy}Wea>jN|S%647;J{^0%LrO_;1WQHWja9u8x0tJ^ z7}Rc#&^_?Xl3~S^YY$fbIxl3YmrEp+qn*B9}wlm*<+eccY4>sjrW~>lr#gehVRe!;&>5d*s zfD9h5i~%H2iI;{HE;ugd%0%tgBH6O`Q9tGquZg;_TO=<4Q~GR8ha?!F>G{le>}#0O zwikh>tDEu}<)kSoQg)2@4%<^Tc*u}le5+Am|LJLNK9mEaevLcBv2I6~B>>u=uggl_ z4S!3RUgX<%C3-!aEhqe_qv2 zKWs=9HRQPU{9ka-aGAI5`$6`J=G1`qK>i)$! zz>P>^vFmXF@cx$p@x%o2|C`?Qzz*HK7PdG^`Djvsl(c)I2LGs0P=E6%K&TEvsxS8t zaF#EFac2aIZ8aMeb^WQ@UScE9;EIwJzss6wYq&Ra{~KQH?f8=NABTBwq+Vc;T17xe zrwh21qyV@j@G}4$P3aR`pvRHcv%=F2m`EA^aXiW1HvqPS79wTP*~L@RB0C1U-SYe2 z7Jh!oZI6Z(yLB@aExi_QIm62-mt#%%;M<~@Uka6}EFeZ6Z>Or?s=(fZddl|UNCh}T z-NGsQa%s+uXAoIgV2?g1b=wV%wK7g!HAJ}H;0r=G=8xp~8fV4qS z_sxoy=tnYcJ$AWBJPS9CQK=eDBjolCtZ}XRMC;%5>vl;i1TX=ZHH^ARelV8Hc7(U$ z+C5^2qpvySs;S}Itf=eXwe)m26QFHbA3J_xdcA^ko{;9l(h-?Z z*U9m#yryuCsx+hd4_~A?p3DxaxZJbEM6l`CFx=ksdiCN>KvQ1$`O)0vp_><2ll@+Qg7TxT%y5&wl+(JY>qP=dHh7_j`;gBbz~+C` z<^m<>98y-Y`vQ80V_*OHKVaB}`Ijmc~#8br*db;VFz@u~*6E+k9yl+@Goy>D*eP9^>UbCRX4ELblNv z8m(VthlNZOqFhlePx}md)|?D(2|C9_a~-SrxrLGSPwBHyU-yk@ST6tDqXBFH9F_Y7 z$FBc=ex3UjIbj|OWK@Io7Y~uP!@L)NtEJXko*xw2OIh;Lnt*raqJ7OMXn(D*5LzlL zQet_eD~I>NHUO&k{~vo;2E5buJ)^sl_V-~2Qd}OiF3<}au7`SUrVE*-Qke`n!E-NN zKGtzROfO>S=LolAn^XsVG~0Ev=wt)31nc24gL#~=i4_rKayVgkKM`au!U?cE@Eqq9EP}J0HP2oD%mw z2gj2&Ykze+{YwV2^q$<``>y>bxxxP2X}ipx2Y57$D6)ot4scxy`$SxKH2{PEcilBS z5g$(mm-2M}8IW(V*<>u}XE#RzHIe#7S_tYh;W}2s;a4Jg;H~i%;ntTk;4&KS+VWtP zu6V-AixCvB-beCk$P((@d!@}3;I;pd*~-|%Uxp_CS75ux7UvM;8ZA>s%9{@zl&T^- z{drFMa6Y!H^LAgQoW%e5Jf_zyH?Kp{buhm76VeK*U)-Ahu&SoeP@A3Z>IgcRr9?;( z;fwr>3;dDFnuZ9fg5v@cYy5w3fxnQuSrRe%>OoYNe=dqe{y*(~XIN8Pw=N(^lPZWv z6~RJRq)Al-L_nk$snWZE^xhGr2wRXAP!yyi5PI*55IREWEkHu32_5c?dcM2&KIhLp zzpoDuPjIcQHOnaP7;}zy{utNg!o|)6SDZ-=K*#SRuUxrg1;)MY#~d?1DPb(mmP8gpK!)mY_FkLRkx^o?FvpKZB`E+2|9-A$wwkWcT`b)T$dtBrGKr_FFA(cKC z!~1-3Jc_y`Elk$qJ6kslrl3;P7nL_K%BeG?0$_1DHEx0CboqMuCJCd2N!obYytqX@ zW9vCkwPJ>d80&Y)Lz*eW36(L+j~skz4$iA>{VC_YgXIgB5}+8ZZ7@?sD?R>|6xGC) zVfYH3sPb(WX2$W>Y3@J+y+NrR;77k5h>JTJ^edT6K^O7Q_n{wUT>zi_?gCvoR>Dp4 zM7*jz;xYpV0nJV6uJk1q`bP6bn}M(A!DN3e?;-<=S&YZ4L*YY!MTM3kSml0E zgT%FUyYtL}&|b+%`hN>mbwP;6Pvx#w+X^ke3&`K2dSw z&xxMXs)~YWa;WCbd8U6@FEHMJwsTp7rb#Wd8(as-&w;~wU^pH}z%qzlnthbT4OCZ` z%O9&sV1^_8d6U7GFPG~@sSR^Av;vUPK_qU#m{yPi4E#`abVP!z4Uhs#zChQz{eurv zDti@!3G*SKxO3zv=u*6F6fL-@-sP&tNsR*F=}8v51QE@FcT{u{J!*MS8g#-`V=LWR zBDyu*JPMp)F|hos+!1wolmth`V}@|0d{0Oq4_fi`(>N7~fNg(ODc--sNqq$eE9w3I zrxHb=ZmXBB$P<`70AKu7DLovU{}>Fa(J#Ig=0ljZSj%GzxUYdAF< zTcm+-BEk13hYee3MeWRmh^A;O)hk35fgTE=RvmPJbF%wB9#AT>N9a1|8Toy^@h zuGpsf#HuWZOzL%6fF@@LG~ClG54fgtT6tw)V8Cm(IE{Y6+_r0L3w5xz_pG>y%ooej zOeIs?j&2~1&&-S)da@qu)`yCzbx)Y%hNRuK3vzCJ7MyG1qd64_j~UDIDB?8qJ00I& zu3K7j7BzGeU*oh#j5nUmS$9{CzrZp!4AhuQ1RlP3Oq6~4uUfUNinj`HgK}{_`3FDS z$k5etR#HM7#Y)yo@)(Zb_^Z@|^WN=0Z@u4cxxtnGE}lBBhD}xd`TpS9R9-P(%HCB2 zs7;PWF|p*{J-e~|SMO%}T8j3hf@MY>Zn`v)tfXjm{Y49-p=stCvs)KW4mVNhTHm7z zDul6aZx3;2_|62&t@wV!67h?VWNO&4P0AxR~rnV5mY;WxJyhQ@+@R$sT8oO}4-l zr(LOR24f#{y3^@;qGZDtBAszw6lZlOR}0~#qymy7Y@Sm-QV<^(lI6e#x|5AMmUD+Q zp(cSQ*&^5M$LnuVvPg%#E~$}&?)40cgTv{S3%!#l+C-dA8AK-!qVk1YcA4xhe!bM2 zI-B7sqjlD|4ky;^qU=EIFwE8H&OE5%XW8nAObj{12YhC;IE^^v=YUe#hbwZ{BBd^fdX)u(>rF zys^h;uNS)vpwE!hlVaxB1FX zx{qUHI{R5>NlW5Ja24!=Gvl?LKnCg;P8Q}`_H4jMi=IBHMy@7*vENX;9P7)<7{;G5 zVUF(7e5$7x6?wifY9nA@-zeGRQzLHAM-3v$H?!F}u((4a`@F=%lQp&`g_yOG)?*sL zRrn6Pv)V^GtV?x^xwUVpUj>-LaV_-6ubigWajy^9f-MgGl8^K{SQT)vzlPiq&vQKh6IDA z{aQf@s`Lx7h5OOse7-C@XM6bz8uc~9#-nX>!+;N%Z793Bu;Cwj#BiY!CvXdfkWNT0T;&jKSJ!y>+`3qg0?O&oQSZyJg z4&BQlRtdE2LOE|bR~vlh)0~qRV%}cV3NwI@`<6|7d-e+ZvAe1`kw?zt(b0?Y2<2)L&7uslj9yA}}-;FB;8@ z)J+w~zE2>5*4dPjEL>C69H?-Sd#Iq0w5EYh#tgU`R~VC#k!g`tJuJ=W*(ssuLV1&q z)C{W0oCf7C19KL}56oFV#!)Qx&Ad2sL*H#;9C$F@B?C=~XQ#e2U&E{R?Fk$y>ZCJZ zp;U9~x6JvlhNgSk=dgh>^Ld9rllWlg(uGxEh8rA{_7Z~*0A5I&iDVAu_?Np>3yNwxy%%6!xxa8oy{NGHFTdwXqb{9>=DpSd^+1;2HlZ zc1$IIP6Pwr$S6NYOQHiLwq=cRLK~NHq9^QJL?oMcgdqN7TV2N@X7PoOB5iF0~|CB15itg6p)NvyjjX3A11}1{uTOnD!9Ml zm{PazD60evg=4#UO+wDv_~i?>S>gYvDRZPFM$DICx+B?y%*@f{Pm#qW;+h&VMOCJQ%IcYAul0401)yzu@ zh~J`gTz#$S)*aMTAfBkl8LVm%25r!LTv;0RP(=72f?iE9$@2#Ub7P)(ngw{%}hNSuc7IBSal2hQSX03{i*4q4y`4g$!U zlElh`mYsmeoAG843(Z$y8p|S2gFFGr{MO&DJb7Q|fpunV zdb*+e@bHj8L!MLJdZ+!Opefy31-f;-h+~PrekRZo#GA z7vG4i4_Bw)HnviE5Rp##!rQ5;W7h$vqQmc0zGZu2$ zRGMQvr9K9jKpmtL?8mg4khbu?dGEu&AzVEe=|Z zX}s~+C{@@|GQm!(jcaULe{CYcTZrbO^#2SwJFi!9*EimywiDzhVra+fK`#OXnu#P!S`h=|Z zr5(U-YAqdOlfjM>9`jHH@q7}pg!d{$UQimd;{UV3Sw=ctSeJC9ML_yh+No!_*`oJ! z2v=;>)+n?GkOh9w=y0qw98t8eAe?5Axp3o&#q)*bz=2wMA+D#9Z~TZedyRsgIaiax zC{QKEs~mpwE28~{O4sObC%@bjH{sJ!U$G{Z3`@!E>nOdQxVgJPHJh*l>#RwhS=`r{ z?Fm=D{c`sq<`4}p?rK&<%Oi{pQV+M~Gp~wV&rxAIzuUwh1zXEq>pQaGzUOK4dKzIw zAui){`01_KLWO24hH<%C6&H_uip?Ik1o8Fq(0zgyTsR?iEX(tVosd*3#Vg=NGxkf8SuYGyT=IqDJstuXHW39i#$?)x)~ zdFg%D$Q(y#`3brZ9vTITo{pCp$)|EbpMCtHVPU;lW$b%?Y#K{_&)w#=fOSK`sWF5i z)c8tt4S8eBMXH&Y9l!+&<$DmgROR*wm&*I?J2KBa#5B6(|3XRxF}<=jit16Y05vEQox^*(#@vUJTMa3f zrRJpQZ6P9VBE@T-SIM@?H%I0-Hv1c@o)7x6<@r!ex(l5e9_iMI95?!~I5i?%xGF7A zDnZ#Ng__kKZSi!- z8zz_Mqa<@PyJh2q1T?2$2R3(VJJg(FPm)NmmSa;(`$zq{nZfCz z>wbh|3Eph^G0hM!EXLI_{;02R{t{}u&Sd>cz-B*Ci2W2Hs!$xo~Au>%gfC=c4=>RrDd$1foUp+$<2&n!|z&pytt zPgH1eJPX??FR`(mv)+|v>`fEyg!mI{NhHMbFQo^F-fH2oTs@A9&vf>5kj;tHE^ZLt zW|3o>&bUqP9FtNwF*x>Gcj;VvqtbskW?ST%A^z0Z$-56b$K(O2U5okq+$6zm)U8{i z+~Poryb$+oAzy;`Kq=2(oN1a2;sA1B%9qe0sX*21|{O;BjYQ( zH$66_f{0lIpRn+8$v-SF{N`~9Hse>v?EEG@i=&aF6%lY3*U^@CPwRYPc%OV2G{A4T zdu!wQ_7Phi=37Bhubi3L)!Iz&l;{W<>}-Y?>OS9{26K>CVp`NIlxDCw-c=p?f$axr zoEOw!lR)J##xmqp-YD7I0dyRm#z(HBc(^a03kHPp8`#wJo;2T&`zOuN1hCos&bm5V z9|}Fx+k-5Ze0GiRRaD+|{txMIH>wZ1g=}ErWWSP%2H3JsSs5qt^C>$7vq$Gmm-n>2 zO$2WK2!%R1>m~Z0U;iuH48Xc&PU;t1h9mE{x3}YcP-6L9*V(0|i~kY_KwKU`xi7}O zC&cbb8A)_b2u$xF*sHYBd=;AJIdu;@GT!r!Z)v>L9wwdcdC;4`Dx=GL(^Ap$XwjeZ zDHq85F%*@n!0$DvT%=_(G0Y(Wj7XvDEBC7Q4D3D4QacOq@aPhi9^Tgqh3ae#QX?L3 z&k34uh+1M(hI4keUiw&qHF;0n@3=0?FZPJ_a4(t@NYkhNU<}=iH~rgoHwx4T z!2XZz%zF}C!TmR=JpdI9KmCBD$Nb&nZMYp&v)V!Mx_uj<&(b3KbRq`Nm=!@ z8$n}V`!-eP_VH!ZPCWK49x37P^pYxRkH|?mz3!w}$zdAvYhkl?WYp^dzn5^% zwwx4P7WeNz)O0{8Lt7~zjBgVYU#Cw_-qHLnWgiX&5cpp|+`xg4hZo7buG9QWGb0G_z^+>{el0#TmN^o{$FP6bY|KgPf>f_h50Oz z_k9@qV?{zn@==;kH?a{vOZOru2GqauV5PCsUFXeN+)-JQsOV^to6(PG$h)&iZp&Uc zN}``WrgRfZTb$++9ar_JnGxFQjEDCfO!lT7tc&jj(#YcB6H?3K1(yukwqut&md=(qK$+40_!t|REnu{ZBtR_c9IXzVI7sF|cy zwmxrM{>3QsKbPCPc*p#<_ex?Q*M85btSWx15Ll$4?q&+!|44etJImPgrOaVSBT zhV;T}v*TwYDvu96B^?ZEl=W8X@M)dlVo%u>h%>#LBC)YsC|@L@Q^9+Q?+Ne7{i<^7 ztZExOA8*>yWrpZYA4?6W|Cx7^8$dh|9n&Q2{b2-K;U@Zib6#hghLZ!2>riaWkU(#K zF-cEGo3HavPUmVIqC0wW_KC+uq>8?%s-11tKM&Ua!NkN25oKd$h9FM55_m2}H0B&K z4v$@y?z>(f{gtEq(r49uhStx2q?bJn2(QDMs}tx~q3j)}q%Yklad9Ss6k2vk>&FQ@ zzXduz5!{tt&-aoHpU{qMMSS+*xE2pDZ{@tl3El(tJwg&#ji=fQ&2RZ}psqaX2j`#5P!1^?&(CEF!n@fo!`F$_40&mVcqp{%vWw5(q&}Kb)vd7(p z^BX-mZ_3T8kOWHGg2s~9=GH2|mF1y)&?fUciC!_9Za1J@keO!p`lI5@`UiJk7tKsP zu475?%w`dFN^jVoe_cG&7D-iwo~jc)ynKmQ&s22kWnvv#U6IA|-1!S6s5T*(r1`}g zPb&0ytpMH8i|jq&DWaw$w1n@NXmYPlW78dEtILy;CsUQKv{`1e22uIH<>Y#ZrtFXDYHt!3?Md^>NY2ve)CyiPtkK z-i63sZ{5l8oVL|9_O>+56=*tk9g+q|8usirlfY80`LE^WI;`}6a9TbnC}}Lij6Q>L z^Y9c|_9US>O#HUO*DK*pDRu1D4}Nw3E*R}>b+@ZvB%;7bT=ij2a|~9AL@2WP57)XQ zt%h<`%K=Z$NRogFI%0FJpk(597qh0lSbxWwYmcyCAGiYmTs~zHtvKLmOxUu+~ z#UNkJ6UP7{*!{7>o*!=4kC^U0sbQd_8=gpi#90W=DA#T}n~P*Cw1x?9gx!!F+tX}w z0a744L{1G!J7w)ZM@ao8RJLrpDar7(j=qq;;u6wXC-T})qTtSp;M{bGq<7hRX&a>z zp1~nJTajvS2axwTxFPzAuKWZowXB-*NPA{iE(j{15bKkFRR-IUpDbUavtw zDqWWz?-}l72Ar7@`x>&H&z8f`}fR@N@Z>Eh(X7c;@?}nMV zYME$W%QDckae7_DIn>A^1{^3}muXqzyW4(I?PqRgz*;~R5YuPK(W3S0h1l|)K8cbw zzG>fdc3S6H_U-yeYxzt-ZiYu{%;npyj@#rgvgRwVAGq~mLHRA=d2Q!P zY0R-)#D%;oulH2kyJA@!2R_O-n)fGPxsq%3fqqz9P-Pv=po<8@ySv?ObTK+#X94L z@S7*8cfWF{&X6}fr=~STO>*m@Xkt-meu{a9G7ygdw|C7atvgbClbXWt zqSE4Vr*KpHONp3m3x!>a=t-1gEZ7a z&rEy$cn9VgY*6An2n)EX*;CbkaB-&$cWK%zjL&uZa*Mejx*|2CuC=6fyUem@a?p{; z9a_?KI-zyd5MOgWoWb~oa&ZF|2y~tP7N7*Ik=6TC!@+WzQy!K=baECumSFEJBKd{e^XF#a*R>u};S#a;0jz*OVjWP^ zL0jFFlwLI)Z};Q~5Dt4S*Gva;Fh_w--mL-F>zgw^3jkL4fJ7rzI$~AX<2yFfuY?FQ z6=W@k>o>iXKG_{Yk7(Y9owpy=Du<_@7*@ad;Oy0iD(lHN&cO5tH2t(nE6Njo@%>hA z_0z&iP#Vs|&+lQTe=>;5$4X#^HK(xA(PX-o1|_!lPWKn4gnkIaCtAy`JgDxiuzS9L zfa8imOYqY#YMAjiEfe`SIZ}|qt|`X8JW(G?zLKh5EWV@SC2Z+KQO3b{O1|#_bA`wcvDe@CfIET@JoP;71-4jy z<>Zk-jP3{j{mnW47bSd>Nbe<3xL&j42M*D$>|*uZk5$Hhb|1$Egunh_<-oZ_%%JyZ zJ>1&=R+gt@!DruParfnv&GfHLtWUylvK0GuZ zY1;MM=AByF@uMPq3!^`Z_hO$*5rZ?2#5~_vX)g$!I#>R`zt#o^^s(IznF*=sWt?WC^0_XEmZ&1xG?ku z+)OdqX)WhYJ=bPmi zs=f)4QtwTk{acbb1xZCOiUbP@47uAsFEr#>M?eXm;p>-A2CQetNtgL!$8+t5fRQ)C z+{+nW8=APU-J<*rHxfZq^! zc8d0PXj-P1BtLAo;*cy@tF&s;OcOTu3>3n@7_8rshaOzDz62{!GoaQOs4G%Wljdg&g&K&>@;I`qUqij@J^cAxXAG@0tcy_W^ zx1NgO=jL{m!O_m3jlIXzJKRbLJOliiSGj&6(>buC^gn{DSs^jrylH4s|Bz$ODpt5I zZ)t$Zu|i$DyZGQodA<=(zb#wSrMNC5JuRBj;T+i_`wAye^*l6s^v1q&m_5b7l-FIR z;fb*QVQiXY&1*rj%K-bOlrO5JFhnJ*e)akF=3N*Lw#G!BxHEszrVyb_#lSNl~r%1sd5bb@1kx)*td~x8e)t^h@4r zymOS|Dg0G`sMx z8az%-=0(yxS~|z#*I)25Ik*_iim>D^oEWIXjdg}|k~b>7#`i9nZ2QZupe;T#u~B>V zZtGt=SG8K5)eQOb!cqTJdRoZN{F&+s=kH;`fbe|`7LyJ1r;BixbtPInJEUz#M=rE& zC*6}zUwlSJvI=P~zkawMY26@gzr_h+x; +declare function createTodo( + title: string +): Promise<{ id: string; title: string }>; + +import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; +import { Logger } from '@aws-lambda-powertools/logger'; +import type { Context } from 'aws-lambda'; + +const logger = new Logger(); +const app = new Router({ logger }); + +app.get('/todos', async () => { + const todos = await getAllTodos(); + + return new Response(JSON.stringify({ todos }), { + status: 200, + headers: { + 'Content-Type': 'application/json', + 'Cache-Control': 'max-age=300', + 'X-Custom-Header': 'custom-value', + }, + }); +}); + +app.post('/todos', async (params, reqCtx) => { + const body = await reqCtx.request.json(); + const todo = await createTodo(body.title); + + return new Response(JSON.stringify(todo), { + status: 201, + headers: { + Location: `/todos/${todo.id}`, + 'Content-Type': 'application/json', + }, + }); +}); + +export const handler = async (event: unknown, context: Context) => { + return app.resolve(event, context); +}; diff --git a/examples/snippets/event-handler/rest/advanced_mw_compose_middleware.ts b/examples/snippets/event-handler/rest/advanced_mw_compose_middleware.ts new file mode 100644 index 0000000000..0263371543 --- /dev/null +++ b/examples/snippets/event-handler/rest/advanced_mw_compose_middleware.ts @@ -0,0 +1,57 @@ +declare const getAllTodos: () => Promise; +declare const putTodo: (body: any) => Promise; + +import { + composeMiddleware, + Router, +} from '@aws-lambda-powertools/event-handler/experimental-rest'; +import type { Middleware } from '@aws-lambda-powertools/event-handler/types'; +import { Logger } from '@aws-lambda-powertools/logger'; +import type { Context } from 'aws-lambda'; + +const logger = new Logger(); + +// Individual middleware functions +const logging: Middleware = async (params, reqCtx, next) => { + logger.info(`Request: ${reqCtx.request.method} ${reqCtx.request.url}`); + await next(); + logger.info(`Response: ${reqCtx.res.status}`); +}; + +const cors: Middleware = async (params, reqCtx, next) => { + await next(); + reqCtx.res.headers.set('Access-Control-Allow-Origin', '*'); + reqCtx.res.headers.set( + 'Access-Control-Allow-Methods', + 'GET, POST, PUT, DELETE' + ); +}; + +const rateLimit: Middleware = async (params, reqCtx, next) => { + // Rate limiting logic would go here + reqCtx.res.headers.set('X-RateLimit-Limit', '100'); + await next(); +}; + +// Compose middleware stack for all requests +const apiMiddleware = composeMiddleware([logging, cors, rateLimit]); + +const app = new Router(); + +// Use composed middleware globally +app.use(apiMiddleware); + +app.get('/todos', async () => { + const todos = await getAllTodos(); + return { todos }; +}); + +app.post('/todos', async (params, { request }) => { + const body = await request.json(); + const todo = await putTodo(body); + return todo; +}); + +export const handler = async (event: unknown, context: Context) => { + return await app.resolve(event, context); +}; diff --git a/examples/snippets/event-handler/rest/advanced_mw_custom_middleware.ts b/examples/snippets/event-handler/rest/advanced_mw_custom_middleware.ts new file mode 100644 index 0000000000..cf9238c48a --- /dev/null +++ b/examples/snippets/event-handler/rest/advanced_mw_custom_middleware.ts @@ -0,0 +1,48 @@ +declare const compresssBody: (body: string) => Promise; + +import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; +import type { Middleware } from '@aws-lambda-powertools/event-handler/types'; +import type { Context } from 'aws-lambda'; + +interface CompressOptions { + threshold?: number; + level?: number; +} + +// Factory function that returns middleware +const compress = (options: CompressOptions = {}): Middleware => { + return async (params, reqCtx, next) => { + await next(); + + // Check if response should be compressed + const body = await reqCtx.res.text(); + const threshold = options.threshold || 1024; + + if (body.length > threshold) { + const compressedBody = await compresssBody(body); + const compressedRes = new Response(compressedBody, reqCtx.res); + compressedRes.headers.set('Content-Encoding', 'gzip'); + reqCtx.res = compressedRes; + } + }; +}; + +const app = new Router(); + +// Use custom middleware globally +app.use(compress({ threshold: 500 })); + +app.get('/data', async () => { + return { + message: 'Large response data', + data: new Array(100).fill('content'), + }; +}); + +app.get('/small', async () => { + return { message: 'Small response' }; +}); + +export const handler = async (event: unknown, context: Context) => { + return await app.resolve(event, context); +}; diff --git a/examples/snippets/event-handler/rest/advanced_mw_destructuring_problem.ts b/examples/snippets/event-handler/rest/advanced_mw_destructuring_problem.ts new file mode 100644 index 0000000000..cc268fac6b --- /dev/null +++ b/examples/snippets/event-handler/rest/advanced_mw_destructuring_problem.ts @@ -0,0 +1,31 @@ +import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; +import type { Middleware } from '@aws-lambda-powertools/event-handler/types'; +import type { Context } from 'aws-lambda'; + +const app = new Router(); + +// ❌ WRONG: Using destructuring captures a reference to the original response +const badMiddleware: Middleware = async (params, { res }, next) => { + res.headers.set('X-Before', 'Before'); + await next(); + // This header will NOT be added because 'res' is a stale reference + res.headers.set('X-After', 'After'); +}; + +// ✅ CORRECT: Always access response through reqCtx +const goodMiddleware: Middleware = async (params, reqCtx, next) => { + reqCtx.res.headers.set('X-Before', 'Before'); + await next(); + // This header WILL be added because we get the current response + reqCtx.res.headers.set('X-After', 'After'); +}; + +app.use(goodMiddleware); + +app.get('/test', async () => { + return { message: 'Hello World!' }; +}); + +export const handler = async (event: unknown, context: Context) => { + return await app.resolve(event, context); +}; diff --git a/examples/snippets/event-handler/rest/advanced_mw_early_return.ts b/examples/snippets/event-handler/rest/advanced_mw_early_return.ts new file mode 100644 index 0000000000..a08e90e3cf --- /dev/null +++ b/examples/snippets/event-handler/rest/advanced_mw_early_return.ts @@ -0,0 +1,41 @@ +declare function getAllTodos(): Promise<{ id: string; title: string }[]>; + +import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; +import type { Middleware } from '@aws-lambda-powertools/event-handler/types'; +import { Logger } from '@aws-lambda-powertools/logger'; +import type { Context } from 'aws-lambda'; + +const logger = new Logger(); +const app = new Router({ logger }); + +// Authentication middleware - returns early if no auth header +const authMiddleware: Middleware = async (params, reqCtx, next) => { + const authHeader = reqCtx.request.headers.get('authorization'); + + if (!authHeader) { + return new Response(JSON.stringify({ error: 'Unauthorized' }), { + status: 401, + headers: { 'Content-Type': 'application/json' }, + }); + } + + await next(); +}; + +// Logging middleware - never executes when auth fails +const loggingMiddleware: Middleware = async (params, reqCtx, next) => { + logger.info('Request processed'); + await next(); +}; + +app.use(authMiddleware); +app.use(loggingMiddleware); + +app.get('/todos', async () => { + const todos = await getAllTodos(); + return { todos }; +}); + +export const handler = async (event: unknown, context: Context) => { + return app.resolve(event, context); +}; diff --git a/examples/snippets/event-handler/rest/advanced_mw_middleware_order.ts b/examples/snippets/event-handler/rest/advanced_mw_middleware_order.ts new file mode 100644 index 0000000000..dad875582b --- /dev/null +++ b/examples/snippets/event-handler/rest/advanced_mw_middleware_order.ts @@ -0,0 +1,42 @@ +declare function getAllTodos(): Promise<{ id: string; title: string }[]>; +declare function putTodo(todo: unknown): Promise<{ id: string } & T>; + +import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; +import type { Middleware } from '@aws-lambda-powertools/event-handler/types'; +import { Logger } from '@aws-lambda-powertools/logger'; +import type { Context } from 'aws-lambda'; + +const logger = new Logger(); +const app = new Router({ logger }); + +// Global middleware - executes first in pre-processing, last in post-processing +app.use(async (params, reqCtx, next) => { + reqCtx.res.headers.set('x-pre-processed-by', 'global-middleware'); + await next(); + reqCtx.res.headers.set('x-post-processed-by', 'global-middleware'); +}); + +// Route-specific middleware - executes second in pre-processing, first in post-processing +const routeMiddleware: Middleware = async (params, reqCtx, next) => { + reqCtx.res.headers.set('x-pre-processed-by', 'route-middleware'); + await next(); + reqCtx.res.headers.set('x-post-processed-by', 'route-middleware'); +}; + +app.get('/todos', async () => { + const todos = await getAllTodos(); + return { todos }; +}); + +// This route will have: +// x-pre-processed-by: route-middleware (route middleware overwrites global) +// x-post-processed-by: global-middleware (global middleware executes last) +app.post('/todos', [routeMiddleware], async (params, reqCtx) => { + const body = await reqCtx.request.json(); + const todo = await putTodo(body); + return todo; +}); + +export const handler = async (event: unknown, context: Context) => { + return app.resolve(event, context); +}; diff --git a/examples/snippets/event-handler/rest/gettingStarted_dynamic_routes.ts b/examples/snippets/event-handler/rest/gettingStarted_dynamic_routes.ts new file mode 100644 index 0000000000..426588ebe9 --- /dev/null +++ b/examples/snippets/event-handler/rest/gettingStarted_dynamic_routes.ts @@ -0,0 +1,26 @@ +declare function getTodoById(todoId: unknown): Promise<{ id: string } & T>; + +import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; +import { Logger } from '@aws-lambda-powertools/logger'; +import { + correlationPaths, + search, +} from '@aws-lambda-powertools/logger/correlationId'; +import type { Context } from 'aws-lambda/handler'; + +const logger = new Logger({ + correlationIdSearchFn: search, +}); +const app = new Router({ logger }); + +app.get('/todos/:todoId', async ({ todoId }) => { + const todo = await getTodoById(todoId); + return { todo }; +}); + +export const handler = async (event: unknown, context: Context) => { + // You can continue using other utilities just as before + logger.addContext(context); + logger.setCorrelationId(event, correlationPaths.API_GATEWAY_REST); + return app.resolve(event, context); +}; diff --git a/examples/snippets/event-handler/rest/gettingStarted_methods.ts b/examples/snippets/event-handler/rest/gettingStarted_methods.ts new file mode 100644 index 0000000000..f63ffe306a --- /dev/null +++ b/examples/snippets/event-handler/rest/gettingStarted_methods.ts @@ -0,0 +1,28 @@ +declare function putTodo(todo: unknown): Promise<{ id: string } & T>; + +import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; +import { Logger } from '@aws-lambda-powertools/logger'; +import { + correlationPaths, + search, +} from '@aws-lambda-powertools/logger/correlationId'; +import type { Context } from 'aws-lambda/handler'; + +const logger = new Logger({ + correlationIdSearchFn: search, +}); +const app = new Router({ logger }); + +app.post('/todos', async (_, { request }) => { + const body = await request.json(); + const todo = await putTodo(body); + + return todo; +}); + +export const handler = async (event: unknown, context: Context) => { + // You can continue using other utilities just as before + logger.addContext(context); + logger.setCorrelationId(event, correlationPaths.API_GATEWAY_REST); + return app.resolve(event, context); +}; diff --git a/examples/snippets/event-handler/rest/gettingStarted_multi_methods.ts b/examples/snippets/event-handler/rest/gettingStarted_multi_methods.ts new file mode 100644 index 0000000000..4888d31097 --- /dev/null +++ b/examples/snippets/event-handler/rest/gettingStarted_multi_methods.ts @@ -0,0 +1,34 @@ +declare function putTodo(todo: unknown): Promise<{ id: string } & T>; + +import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; +import { Logger } from '@aws-lambda-powertools/logger'; +import { + correlationPaths, + search, +} from '@aws-lambda-powertools/logger/correlationId'; +import type { Context } from 'aws-lambda/handler'; + +const logger = new Logger({ + correlationIdSearchFn: search, +}); +const app = new Router({ logger }); + +app.route( + async (_, { request }) => { + const body = await request.json(); + const todo = await putTodo(body); + + return todo; + }, + { + path: '/todos', + method: ['POST', 'PUT'], + } +); + +export const handler = async (event: unknown, context: Context) => { + // You can continue using other utilities just as before + logger.addContext(context); + logger.setCorrelationId(event, correlationPaths.API_GATEWAY_REST); + return app.resolve(event, context); +}; diff --git a/examples/snippets/event-handler/rest/gettingStarted_serialization.ts b/examples/snippets/event-handler/rest/gettingStarted_serialization.ts new file mode 100644 index 0000000000..5b93f14004 --- /dev/null +++ b/examples/snippets/event-handler/rest/gettingStarted_serialization.ts @@ -0,0 +1,12 @@ +import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; +import type { Context } from 'aws-lambda'; + +const app = new Router(); + +app.get('/ping', async () => { + return { message: 'pong' }; // (1)! +}); + +export const handler = async (event: unknown, context: Context) => { + return app.resolve(event, context); +}; diff --git a/examples/snippets/event-handler/rest/samples/advanced_fine_grained_responses.json b/examples/snippets/event-handler/rest/samples/advanced_fine_grained_responses.json new file mode 100644 index 0000000000..3b4f079a6a --- /dev/null +++ b/examples/snippets/event-handler/rest/samples/advanced_fine_grained_responses.json @@ -0,0 +1,9 @@ +{ + "statusCode": 201, + "body": "{\"id\":\"123\",\"title\":\"Learn TypeScript\"}", + "headers": { + "Content-Type": "application/json", + "Location": "/todos/123" + }, + "isBase64Encoded": false +} \ No newline at end of file diff --git a/examples/snippets/event-handler/rest/samples/advanced_mw_early_return.json b/examples/snippets/event-handler/rest/samples/advanced_mw_early_return.json new file mode 100644 index 0000000000..75f76e9c68 --- /dev/null +++ b/examples/snippets/event-handler/rest/samples/advanced_mw_early_return.json @@ -0,0 +1,8 @@ +{ + "statusCode": 401, + "body": "{\"error\":\"Unauthorized\"}", + "headers": { + "Content-Type": "application/json" + }, + "isBase64Encoded": false +} \ No newline at end of file diff --git a/examples/snippets/event-handler/rest/samples/advanced_mw_middleware_order.json b/examples/snippets/event-handler/rest/samples/advanced_mw_middleware_order.json new file mode 100644 index 0000000000..0135c632cd --- /dev/null +++ b/examples/snippets/event-handler/rest/samples/advanced_mw_middleware_order.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "body": "{\"id\":\"123\",\"title\":\"New todo\"}", + "headers": { + "content-type": "application/json", + "x-pre-processed-by": "route-middleware", + "x-post-processed-by": "global-middleware" + }, + "isBase64Encoded": false +} \ No newline at end of file diff --git a/examples/snippets/event-handler/rest/samples/gettingStarted_dynamic_routes.json b/examples/snippets/event-handler/rest/samples/gettingStarted_dynamic_routes.json new file mode 100644 index 0000000000..dd5727cc1e --- /dev/null +++ b/examples/snippets/event-handler/rest/samples/gettingStarted_dynamic_routes.json @@ -0,0 +1,5 @@ +{ + "resource": "/todos/{id}", + "path": "/todos/1", + "httpMethod": "GET" +} \ No newline at end of file diff --git a/examples/snippets/event-handler/rest/samples/gettingStarted_methods.json b/examples/snippets/event-handler/rest/samples/gettingStarted_methods.json new file mode 100644 index 0000000000..7be85e3400 --- /dev/null +++ b/examples/snippets/event-handler/rest/samples/gettingStarted_methods.json @@ -0,0 +1,6 @@ +{ + "resource": "/todos", + "path": "/todos", + "httpMethod": "POST", + "body": "{\"title\": \"foo\", \"userId\": 1, \"completed\": false}" +} \ No newline at end of file diff --git a/examples/snippets/event-handler/rest/samples/gettingStarted_serialization.json b/examples/snippets/event-handler/rest/samples/gettingStarted_serialization.json new file mode 100644 index 0000000000..12f3f9bdf1 --- /dev/null +++ b/examples/snippets/event-handler/rest/samples/gettingStarted_serialization.json @@ -0,0 +1,8 @@ +{ + "statusCode": 200, + "headers": { + "Content-Type": "application/json" + }, + "body": "{'message':'pong'}", + "isBase64Encoded": false +} \ No newline at end of file diff --git a/examples/snippets/event-handler/rest/templates/api_gateway.yml b/examples/snippets/event-handler/rest/templates/api_gateway.yml new file mode 100644 index 0000000000..056f84d413 --- /dev/null +++ b/examples/snippets/event-handler/rest/templates/api_gateway.yml @@ -0,0 +1,53 @@ +AWSTemplateFormatVersion: "2010-09-09" +Transform: AWS::Serverless-2016-10-31 +Description: Hello world event handler API Gateway + +Globals: + Api: + TracingEnabled: true + Cors: # see CORS section + AllowOrigin: "'https://example.com'" + AllowHeaders: "'Content-Type,Authorization,X-Amz-Date'" + MaxAge: "'300'" + BinaryMediaTypes: # see Binary responses section + - "*~1*" # converts to */* for any binary type + # NOTE: use this stricter version if you're also using CORS; */* doesn't work with CORS + # see: https://github.com/aws-powertools/powertools-lambda-python/issues/3373#issuecomment-1821144779 + # - "image~1*" # converts to image/* + # - "*~1csv" # converts to */csv, eg text/csv, application/csv + + Function: + Timeout: 5 + MemorySize: 256 + Runtime: nodejs22.x + Tracing: Active + Environment: + Variables: + POWERTOOLS_LOG_LEVEL: INFO + POWERTOOLS_SERVICE_NAME: hello + +Resources: + ApiFunction: + Type: AWS::Serverless::Function + Properties: + Handler: index.handler + CodeUri: hello_world + Description: API handler function + Events: + AnyApiEvent: + Type: Api + Properties: + # NOTE: this is a catch-all rule to simplify the documentation. + # explicit routes and methods are recommended for prod instead (see below) + Path: /{proxy+} # Send requests on any path to the lambda function + Method: ANY # Send requests using any http method to the lambda function + GetAllTodos: + Type: Api + Properties: + Path: /todos + Method: GET + GetTodoById: + Type: Api + Properties: + Path: /todos/{todo_id} + Method: GET \ No newline at end of file diff --git a/examples/snippets/event-handler/rest/templates/lambda_furl.yml b/examples/snippets/event-handler/rest/templates/lambda_furl.yml new file mode 100644 index 0000000000..1770b5a278 --- /dev/null +++ b/examples/snippets/event-handler/rest/templates/lambda_furl.yml @@ -0,0 +1,30 @@ +AWSTemplateFormatVersion: "2010-09-09" +Transform: AWS::Serverless-2016-10-31 +Description: Hello world event handler API Gateway + +Globals: + Function: + Timeout: 5 + MemorySize: 256 + Runtime: nodejs22.x + Tracing: Active + Environment: + Variables: + POWERTOOLS_LOG_LEVEL: INFO + POWERTOOLS_SERVICE_NAME: hello + FunctionUrlConfig: + Cors: # see CORS section + # Notice that values here are Lists of Strings, vs comma-separated values on API Gateway + AllowOrigins: ["https://example.com"] + AllowHeaders: ["Content-Type", "Authorization", "X-Amz-Date"] + MaxAge: 300 + +Resources: + ApiFunction: + Type: AWS::Serverless::Function + Properties: + Handler: index.handler + CodeUri: hello_world + Description: API handler function + FunctionUrlConfig: + AuthType: NONE # AWS_IAM for added security beyond sample documentation \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 30193d8af4..c1af2e07d9 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -47,6 +47,7 @@ nav: - features/metrics.md - Event Handler: - features/event-handler/index.md + - features/event-handler/rest.md - features/event-handler/appsync-events.md - features/event-handler/appsync-graphql.md - features/event-handler/bedrock-agents.md @@ -168,7 +169,6 @@ plugins: tsconfig: 'tsconfig.json' options: 'typedoc.json' name: 'API Reference' - - llmstxt: markdown_description: Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless best practices and increase developer velocity. It provides a suite of utilities for AWS Lambda Functions that makes tracing with AWS X-Ray, structured logging and creating custom metrics asynchronously easier. full_output: llms-full.txt @@ -183,6 +183,7 @@ plugins: - features/tracer.md - features/logger.md - features/metrics.md + - features/event-handler/rest.md - features/event-handler/appsync-events.md - features/event-handler/appsync-graphql.md - features/event-handler/bedrock-agents.md From 96977ff6b1330adcf82d9caa3b30454208d654e8 Mon Sep 17 00:00:00 2001 From: Swopnil Dangol Date: Thu, 11 Sep 2025 16:15:58 +0100 Subject: [PATCH 140/255] refactor(batch): simplified the parser integration api with batch processor (#4465) Co-authored-by: Andrea Amorosi --- packages/batch/package.json | 10 +- .../batch/src/BasePartialBatchProcessor.ts | 31 +- packages/batch/src/BatchProcessor.ts | 180 +------- packages/batch/src/errors.ts | 11 + packages/batch/src/index.ts | 1 + packages/batch/src/parser.ts | 156 +++++++ packages/batch/src/types.ts | 36 +- .../batch/tests/unit/BatchProcessor.test.ts | 359 +--------------- packages/batch/tests/unit/parsing.test.ts | 383 ++++++++++++++++++ packages/batch/vitest.config.ts | 1 + 10 files changed, 617 insertions(+), 551 deletions(-) create mode 100644 packages/batch/src/parser.ts create mode 100644 packages/batch/tests/unit/parsing.test.ts diff --git a/packages/batch/package.json b/packages/batch/package.json index 42396f9918..e280a4db4c 100644 --- a/packages/batch/package.json +++ b/packages/batch/package.json @@ -38,6 +38,10 @@ "default": "./lib/esm/index.js" } }, + "./parser": { + "import": "./lib/esm/parser.js", + "require": "./lib/cjs/parser.js" + }, "./types": { "import": "./lib/esm/types.js", "require": "./lib/cjs/types.js" @@ -45,6 +49,10 @@ }, "typesVersions": { "*": { + "parser": [ + "lib/cjs/parser.d.ts", + "lib/esm/parser.d.ts" + ], "types": [ "lib/cjs/types.d.ts", "lib/esm/types.d.ts" @@ -76,4 +84,4 @@ "@aws-lambda-powertools/testing-utils": "file:../testing", "@aws-lambda-powertools/parser": "2.25.2" } -} +} \ No newline at end of file diff --git a/packages/batch/src/BasePartialBatchProcessor.ts b/packages/batch/src/BasePartialBatchProcessor.ts index 529a3870d9..17537c47d6 100644 --- a/packages/batch/src/BasePartialBatchProcessor.ts +++ b/packages/batch/src/BasePartialBatchProcessor.ts @@ -1,9 +1,10 @@ -import type { StandardSchemaV1 } from '@standard-schema/spec'; +import { getStringFromEnv } from '@aws-lambda-powertools/commons/utils/env'; import type { DynamoDBRecord, KinesisStreamRecord, SQSRecord, } from 'aws-lambda'; +import type { GenericLogger } from '../../commons/lib/esm/types/GenericLogger.js'; import { BasePartialProcessor } from './BasePartialProcessor.js'; import { DATA_CLASS_MAPPING, @@ -12,7 +13,7 @@ import { } from './constants.js'; import { FullBatchFailureError } from './errors.js'; import type { - BasePartialBatchProcessorConfig, + BasePartialBatchProcessorParserConfig, EventSourceDataClassTypes, PartialItemFailureResponse, PartialItemFailures, @@ -45,9 +46,16 @@ abstract class BasePartialBatchProcessor extends BasePartialProcessor { public eventType: keyof typeof EventType; /** - * The schema of the body of the event record for parsing + * A logger instance to be used for logging debug, warning, and error messages. + * + * When no logger is provided, we'll only log warnings and errors using the global `console` object. + */ + protected readonly logger: Pick; + + /** + * The configuration options for the parser integration */ - protected schema?: StandardSchemaV1; + protected parserConfig?: BasePartialBatchProcessorParserConfig; /** * Initializes base batch processing class @@ -56,7 +64,7 @@ abstract class BasePartialBatchProcessor extends BasePartialProcessor { */ public constructor( eventType: keyof typeof EventType, - config?: BasePartialBatchProcessorConfig + parserConfig?: BasePartialBatchProcessorParserConfig ) { super(); this.eventType = eventType; @@ -66,9 +74,16 @@ abstract class BasePartialBatchProcessor extends BasePartialProcessor { [EventType.KinesisDataStreams]: () => this.collectKinesisFailures(), [EventType.DynamoDBStreams]: () => this.collectDynamoDBFailures(), }; - if (config) { - this.schema = config.schema; - } + this.parserConfig = parserConfig; + const alcLogLevel = getStringFromEnv({ + key: 'AWS_LAMBDA_LOG_LEVEL', + defaultValue: '', + }); + this.logger = parserConfig?.logger ?? { + debug: alcLogLevel === 'DEBUG' ? console.debug : () => undefined, + error: console.error, + warn: console.warn, + }; } /** diff --git a/packages/batch/src/BatchProcessor.ts b/packages/batch/src/BatchProcessor.ts index f6221e9e64..1a8ec918b3 100644 --- a/packages/batch/src/BatchProcessor.ts +++ b/packages/batch/src/BatchProcessor.ts @@ -1,14 +1,6 @@ -import type { StandardSchemaV1 } from '@standard-schema/spec'; -import type { StreamRecord } from 'aws-lambda'; import { BasePartialBatchProcessor } from './BasePartialBatchProcessor.js'; -import { EventType, SchemaVendor } from './constants.js'; import { BatchProcessingError } from './errors.js'; -import type { - BaseRecord, - EventSourceDataClassTypes, - FailureResponse, - SuccessResponse, -} from './types.js'; +import type { BaseRecord, FailureResponse, SuccessResponse } from './types.js'; /** * Process records in a batch asynchronously and handle partial failure cases. @@ -108,13 +100,16 @@ class BatchProcessor extends BasePartialBatchProcessor { record: BaseRecord ): Promise { try { - const recordToProcess = - this.schema == null - ? record - : await this.#parseRecord(record, this.eventType, this.schema); + const recordToProcess = this.parserConfig?.parser + ? await this.parserConfig.parser( + record, + this.eventType, + this.logger, + this.parserConfig + ) + : record; const data = this.toBatchType(recordToProcess, this.eventType); const result = await this.handler(data, this.options?.context); - return this.successHandler(record, result); } catch (error) { return this.failureHandler(record, error as Error); @@ -133,163 +128,6 @@ class BatchProcessor extends BasePartialBatchProcessor { 'Not implemented. Use asyncProcess() instead.' ); } - - /** - * Extend the schema according to the event type passed. - * - * If useTransformers is true, extend using opinionated transformers. - * Otherwise, extend without any transformers. - * - * @param eventType - The type of event to process (SQS, Kinesis, DynamoDB) - * @param schema - The StandardSchema to be used for parsing - * @param useTransformers - Whether to use transformers for parsing - */ - async #createExtendedSchema(options: { - eventType: keyof typeof EventType; - schema: StandardSchemaV1; - useTransformers: boolean; - }) { - const { eventType, schema, useTransformers } = options; - switch (eventType) { - case EventType.SQS: { - if (useTransformers) { - const [{ JSONStringified }, { SqsRecordSchema }] = await Promise.all([ - import('@aws-lambda-powertools/parser/helpers'), - import('@aws-lambda-powertools/parser/schemas/sqs'), - ]); - return SqsRecordSchema.extend({ - body: JSONStringified(schema as any), - }); - } - const { SqsRecordSchema } = await import( - '@aws-lambda-powertools/parser/schemas/sqs' - ); - return SqsRecordSchema.extend({ body: schema }); - } - - case EventType.KinesisDataStreams: { - if (useTransformers) { - const [ - { Base64Encoded }, - { KinesisDataStreamRecord, KinesisDataStreamRecordPayload }, - ] = await Promise.all([ - import('@aws-lambda-powertools/parser/helpers'), - import('@aws-lambda-powertools/parser/schemas/kinesis'), - ]); - return KinesisDataStreamRecord.extend({ - kinesis: KinesisDataStreamRecordPayload.extend({ - data: Base64Encoded(schema as any), - }), - }); - } - const { KinesisDataStreamRecord, KinesisDataStreamRecordPayload } = - await import('@aws-lambda-powertools/parser/schemas/kinesis'); - return KinesisDataStreamRecord.extend({ - kinesis: KinesisDataStreamRecordPayload.extend({ data: schema }), - }); - } - - case EventType.DynamoDBStreams: { - if (useTransformers) { - const [ - { DynamoDBMarshalled }, - { DynamoDBStreamRecord, DynamoDBStreamChangeRecordBase }, - ] = await Promise.all([ - import('@aws-lambda-powertools/parser/helpers/dynamodb'), - import('@aws-lambda-powertools/parser/schemas/dynamodb'), - ]); - return DynamoDBStreamRecord.extend({ - dynamodb: DynamoDBStreamChangeRecordBase.extend({ - OldImage: DynamoDBMarshalled( - schema as any - ).optional(), - NewImage: DynamoDBMarshalled( - schema as any - ).optional(), - }), - }); - } - const { DynamoDBStreamRecord, DynamoDBStreamChangeRecordBase } = - await import('@aws-lambda-powertools/parser/schemas/dynamodb'); - return DynamoDBStreamRecord.extend({ - dynamodb: DynamoDBStreamChangeRecordBase.extend({ - OldImage: (schema as any).optional(), - NewImage: (schema as any).optional(), - }), - }); - } - - default: { - console.warn( - `The event type provided is not supported. Supported events: ${Object.values(EventType).join(',')}` - ); - throw new Error('Unsupported event type'); - } - } - } - - /** - * Parse the record according to the schema and event type passed. - * - * If the passed schema is already an extended schema, - * use the schema directly to parse the record. - * - * Only Zod Schemas are supported for schema extension. - * - * @param record - The record to be parsed - * @param eventType - The type of event to process - * @param schema - The StandardSchema to be used for parsing - */ - async #parseRecord( - record: EventSourceDataClassTypes, - eventType: keyof typeof EventType, - schema: StandardSchemaV1 - ): Promise { - const { parse } = await import('@aws-lambda-powertools/parser'); - // Try parsing with the original schema first - const extendedSchemaParsing = parse(record, undefined, schema, true); - if (extendedSchemaParsing.success) { - return extendedSchemaParsing.data as EventSourceDataClassTypes; - } - // Only proceed with schema extension if it's a Zod schema - if (schema['~standard'].vendor !== SchemaVendor.Zod) { - console.warn( - 'The schema provided is not supported. Only Zod schemas are supported for extension.' - ); - throw new Error('Unsupported schema type'); - } - // Handle schema extension based on event type - // Try without transformers first, then with transformers - const schemaWithoutTransformers = await this.#createExtendedSchema({ - eventType, - schema, - useTransformers: false, - }); - const schemaWithoutTransformersParsing = parse( - record, - undefined, - schemaWithoutTransformers, - true - ); - if (schemaWithoutTransformersParsing.success) { - return schemaWithoutTransformersParsing.data as EventSourceDataClassTypes; - } - const schemaWithTransformers = await this.#createExtendedSchema({ - eventType, - schema, - useTransformers: true, - }); - const schemaWithTransformersParsing = parse( - record, - undefined, - schemaWithTransformers, - true - ); - if (schemaWithTransformersParsing.success) { - return schemaWithTransformersParsing.data as EventSourceDataClassTypes; - } - throw new Error('Failed to parse record'); - } } export { BatchProcessor }; diff --git a/packages/batch/src/errors.ts b/packages/batch/src/errors.ts index 9467e5e0d2..a95a88cda6 100644 --- a/packages/batch/src/errors.ts +++ b/packages/batch/src/errors.ts @@ -63,10 +63,21 @@ class UnexpectedBatchTypeError extends BatchProcessingError { } } +/** + * Error thrown by the Batch Processing utility when a record fails to be parsed. + */ +class ParsingError extends BatchProcessingError { + public constructor(message: string) { + super(message); + this.name = 'ParsingError'; + } +} + export { BatchProcessingError, FullBatchFailureError, SqsFifoShortCircuitError, SqsFifoMessageGroupShortCircuitError, UnexpectedBatchTypeError, + ParsingError, }; diff --git a/packages/batch/src/index.ts b/packages/batch/src/index.ts index 510c57123d..6cf3370b00 100644 --- a/packages/batch/src/index.ts +++ b/packages/batch/src/index.ts @@ -5,6 +5,7 @@ export { EventType } from './constants.js'; export { BatchProcessingError, FullBatchFailureError, + ParsingError, SqsFifoMessageGroupShortCircuitError, SqsFifoShortCircuitError, UnexpectedBatchTypeError, diff --git a/packages/batch/src/parser.ts b/packages/batch/src/parser.ts new file mode 100644 index 0000000000..fe1cb795a6 --- /dev/null +++ b/packages/batch/src/parser.ts @@ -0,0 +1,156 @@ +import type { GenericLogger } from '@aws-lambda-powertools/commons/types'; +import type { StandardSchemaV1 } from '@standard-schema/spec'; +import type { ZodType } from 'zod'; +import { EventType, SchemaVendor } from './constants.js'; +import { ParsingError } from './errors.js'; +import type { + BasePartialBatchProcessorParserConfig, + EventSourceDataClassTypes, +} from './types.js'; + +/** + * Extend the schema according to the event type passed. + * + * If useTransformers is true, extend using opinionated transformers. + * Otherwise, extend without any transformers. + * + * @param options - The options for creating the extended schema + * @param options.eventType - The type of event to process (SQS, Kinesis, DynamoDB) + * @param options.schema - The StandardSchema to be used for parsing + * @param options.useTransformers - Whether to use transformers for parsing + * @param options.logger - A logger instance for logging + */ +const createExtendedSchema = async (options: { + eventType: keyof typeof EventType; + innerSchema: ZodType; + transformer?: BasePartialBatchProcessorParserConfig['transformer']; +}) => { + const { eventType, innerSchema, transformer } = options; + let schema = innerSchema; + switch (transformer) { + case 'json': { + const { JSONStringified } = await import( + '@aws-lambda-powertools/parser/helpers' + ); + schema = JSONStringified(innerSchema); + break; + } + case 'base64': { + const { Base64Encoded } = await import( + '@aws-lambda-powertools/parser/helpers' + ); + schema = Base64Encoded(innerSchema); + break; + } + case 'unmarshall': { + const { DynamoDBMarshalled } = await import( + '@aws-lambda-powertools/parser/helpers/dynamodb' + ); + schema = DynamoDBMarshalled(innerSchema); + break; + } + } + if (eventType === EventType.SQS) { + const { SqsRecordSchema } = await import( + '@aws-lambda-powertools/parser/schemas/sqs' + ); + return SqsRecordSchema.extend({ + body: schema, + }); + } + if (eventType === EventType.KinesisDataStreams) { + const { KinesisDataStreamRecord, KinesisDataStreamRecordPayload } = + await import('@aws-lambda-powertools/parser/schemas/kinesis'); + return KinesisDataStreamRecord.extend({ + kinesis: KinesisDataStreamRecordPayload.extend({ + data: schema, + }), + }); + } + + const { DynamoDBStreamRecord, DynamoDBStreamChangeRecordBase } = await import( + '@aws-lambda-powertools/parser/schemas/dynamodb' + ); + return DynamoDBStreamRecord.extend({ + dynamodb: DynamoDBStreamChangeRecordBase.extend({ + OldImage: schema.optional(), + NewImage: schema.optional(), + }), + }); +}; + +/** + * Parse the record with the passed schema and + * return the result or throw the error depending on parsing success + * + * @param record - The record to be parsed + * @param schema - The modified schema to parse with + * @param logger - A logger instance for logging + */ +const parseWithErrorHandling = async ( + record: EventSourceDataClassTypes, + schema: StandardSchemaV1, + logger: Pick +) => { + const { parse } = await import('@aws-lambda-powertools/parser'); + const result = parse(record, undefined, schema, true); + if (result.success) { + return result.data as EventSourceDataClassTypes; + } + const issues = result.error.cause as ReadonlyArray; + const errorMessage = issues + .map((issue) => `${issue.path?.join('.')}: ${issue.message}`) + .join('; '); + logger.debug(errorMessage); + throw new ParsingError(errorMessage); +}; + +/** + * Parse the record according to the schema and event type passed. + * + * If the passed schema is already an extended schema, + * use the schema directly to parse the record. + * + * Only Zod Schemas are supported for schema extension. + * + * @param record - The record to be parsed + * @param eventType - The type of event to process + * @param logger - A logger instance for logging + * @param parserConfig - The parser configuration options + */ +const parser = async ( + record: EventSourceDataClassTypes, + eventType: keyof typeof EventType, + logger: Pick, + parserConfig: BasePartialBatchProcessorParserConfig +): Promise => { + const { schema, innerSchema, transformer } = parserConfig; + // If the external schema is specified, use it to parse the record + if (schema) { + return parseWithErrorHandling(record, schema, logger); + } + if (innerSchema) { + // Only proceed with schema extension if it's a Zod schema + if (innerSchema['~standard'].vendor !== SchemaVendor.Zod) { + logger.error( + 'The schema provided is not supported. Only Zod schemas are supported for extension.' + ); + throw new ParsingError('Unsupported schema type'); + } + return parseWithErrorHandling( + record, + await createExtendedSchema({ + eventType, + innerSchema, + ...(transformer ? { transformer } : {}), + }), + logger + ); + } + logger.error('There was no schema or innerSchema provided'); + throw new ParsingError( + 'Either schema or innerSchema is required for parsing' + ); +}; + +export { parser }; diff --git a/packages/batch/src/types.ts b/packages/batch/src/types.ts index b5781c44c8..4ea03d920d 100644 --- a/packages/batch/src/types.ts +++ b/packages/batch/src/types.ts @@ -5,7 +5,8 @@ import type { KinesisStreamRecord, SQSRecord, } from 'aws-lambda'; - +import type { ZodType } from 'zod'; +import type { GenericLogger } from '../../commons/lib/esm/types/GenericLogger.js'; import type { BasePartialBatchProcessor } from './BasePartialBatchProcessor.js'; import type { SqsFifoPartialProcessor } from './SqsFifoPartialProcessor.js'; import type { SqsFifoPartialProcessorAsync } from './SqsFifoPartialProcessorAsync.js'; @@ -92,19 +93,28 @@ type PartialItemFailures = { itemIdentifier: string }; type PartialItemFailureResponse = { batchItemFailures: PartialItemFailures[] }; /** - * Type representing the configuration options passed to the BasePartialBatchProcessor class. + * Type representing the parser configuration options passed to the BasePartialBatchProcessor class. * - * @property schema - The schema to be used for parsing + * @property schema - The full event schema to be used for parsing + * @property innerSchema - The inner payload schema + * @property transformer - The transformer to be used for parsing the payload + * @property logger - The logger to be used for logging debug and warning messages. */ -type BasePartialBatchProcessorConfig = { - /** - * The schema be either of the following: - * 1. An internal schema of the payload of the supported event types. - * 2. An internal schema along with helper transformer functions. - * 3. An extended schema of the supported event type. - */ - schema: StandardSchemaV1; -}; +type BasePartialBatchProcessorParserConfig = + | { + parser?: CallableFunction; + schema?: StandardSchemaV1; + innerSchema?: never; + transformer?: never; + logger?: Pick; + } + | { + parser?: CallableFunction; + schema?: never; + innerSchema?: ZodType; + transformer?: 'json' | 'base64' | 'unmarshall'; + logger?: Pick; + }; export type { BatchProcessingOptions, @@ -114,5 +124,5 @@ export type { FailureResponse, PartialItemFailures, PartialItemFailureResponse, - BasePartialBatchProcessorConfig, + BasePartialBatchProcessorParserConfig, }; diff --git a/packages/batch/tests/unit/BatchProcessor.test.ts b/packages/batch/tests/unit/BatchProcessor.test.ts index 020038b3fc..650354d968 100644 --- a/packages/batch/tests/unit/BatchProcessor.test.ts +++ b/packages/batch/tests/unit/BatchProcessor.test.ts @@ -1,27 +1,6 @@ -import { - Base64Encoded, - JSONStringified, -} from '@aws-lambda-powertools/parser/helpers'; -import { DynamoDBMarshalled } from '@aws-lambda-powertools/parser/helpers/dynamodb'; -import { - KinesisDataStreamRecord, - SqsRecordSchema, -} from '@aws-lambda-powertools/parser/schemas'; -import { - DynamoDBStreamChangeRecordBase, - DynamoDBStreamRecord, -} from '@aws-lambda-powertools/parser/schemas/dynamodb'; -import { KinesisDataStreamRecordPayload } from '@aws-lambda-powertools/parser/schemas/kinesis'; import context from '@aws-lambda-powertools/testing-utils/context'; -import type { - Context, - DynamoDBRecord, - KinesisStreamRecord, - SQSRecord, -} from 'aws-lambda'; -import * as v from 'valibot'; +import type { Context } from 'aws-lambda'; import { afterAll, beforeEach, describe, expect, it, vi } from 'vitest'; -import { z } from 'zod'; import { BatchProcessingError, BatchProcessor, @@ -307,340 +286,4 @@ describe('Class: AsyncBatchProcessor', () => { // Act & Assess expect(() => processor.processSync()).toThrowError(BatchProcessingError); }); - - describe('Batch processing with Parser Integration', () => { - const customSchema = z.object({ - Message: z.string(), - }); - const successPayload1 = { - Message: 'test-1', - }; - const successPayload2 = { - Message: 'test-2', - }; - const failurePayload1 = { - Message: 1, - }; - const failurePayload2 = { - Message: 2, - }; - const sqsRecordHandler = async (parsedRecord: SQSRecord) => { - return parsedRecord.body; - }; - const kinesisRecordHandler = async (parsedRecord: KinesisStreamRecord) => { - return parsedRecord.kinesis.data; - }; - const dynamodbRecordHandler = async (parsedRecord: DynamoDBRecord) => { - return parsedRecord.dynamodb?.NewImage; - }; - const cases = [ - { - description: 'passing Extended Schema', - SQS: { - schema: SqsRecordSchema.extend({ - body: JSONStringified(customSchema), - }), - }, - Kinesis: { - schema: KinesisDataStreamRecord.extend({ - kinesis: KinesisDataStreamRecordPayload.extend({ - data: Base64Encoded(customSchema).optional(), - }), - }), - }, - DynamoDB: { - schema: DynamoDBStreamRecord.extend({ - dynamodb: DynamoDBStreamChangeRecordBase.extend({ - NewImage: DynamoDBMarshalled(customSchema).optional(), - }), - }), - }, - }, - { - description: 'passing Internal Schema without transformers', - SQS: { - schema: customSchema, - }, - Kinesis: { - schema: customSchema, - }, - DynamoDB: { - schema: customSchema, - }, - }, - { - description: 'passing Internal Schema with transformers', - SQS: { - schema: JSONStringified(customSchema), - }, - Kinesis: { - schema: Base64Encoded(customSchema), - }, - DynamoDB: { - schema: DynamoDBMarshalled(customSchema), - }, - }, - ]; - describe.each(cases)('SQS Record Schema $description', ({ SQS }) => { - it('completes the processing with no failures and parses the payload before passing to the record handler', async () => { - // Prepare - const firstRecord = sqsRecordFactory(JSON.stringify(successPayload1)); - const secondRecord = sqsRecordFactory(JSON.stringify(successPayload2)); - const records = [firstRecord, secondRecord]; - const processor = new BatchProcessor(EventType.SQS, { - schema: SQS.schema, - }); - - // Act - processor.register(records, sqsRecordHandler, options); - const processedMessages = await processor.process(); - - // Assess - expect(processedMessages).toStrictEqual([ - ['success', successPayload1, firstRecord], - ['success', successPayload2, secondRecord], - ]); - }); - - it('completes the processing with failures if some of the payload does not match the passed schema', async () => { - // Prepare - const firstRecord = sqsRecordFactory(JSON.stringify(successPayload1)); - const secondRecord = sqsRecordFactory(JSON.stringify(failurePayload1)); - const records = [firstRecord, secondRecord]; - const processor = new BatchProcessor(EventType.SQS, { - schema: SQS.schema, - }); - - // Act - processor.register(records, sqsRecordHandler, options); - const processedMessages = await processor.process(); - - // Assess - expect(processedMessages[0]).toStrictEqual([ - 'success', - successPayload1, - firstRecord, - ]); - expect(processor.failureMessages.length).toBe(1); - expect(processor.response()).toStrictEqual({ - batchItemFailures: [{ itemIdentifier: secondRecord.messageId }], - }); - }); - - it('completes processing with all failures if all the payload does not match the passed schema', async () => { - // Prepare - const firstRecord = sqsRecordFactory(JSON.stringify(failurePayload1)); - const secondRecord = sqsRecordFactory(JSON.stringify(failurePayload2)); - - const records = [firstRecord, secondRecord]; - const processor = new BatchProcessor(EventType.SQS, { - schema: SQS.schema, - }); - - // Act - processor.register(records, sqsRecordHandler, options); - - // Assess - await expect(processor.process()).rejects.toThrowError( - FullBatchFailureError - ); - }); - }); - - describe.each(cases)( - 'Kinesis Record Schema $description', - ({ Kinesis }) => { - it('completes the processing with no failures and parses the payload before passing to the record handler', async () => { - // Prepare - const firstRecord = kinesisRecordFactory( - Buffer.from(JSON.stringify(successPayload1)).toString('base64') - ); - const secondRecord = kinesisRecordFactory( - Buffer.from(JSON.stringify(successPayload2)).toString('base64') - ); - const records = [firstRecord, secondRecord]; - const processor = new BatchProcessor(EventType.KinesisDataStreams, { - schema: Kinesis.schema, - }); - - // Act - processor.register(records, kinesisRecordHandler, options); - const processedMessages = await processor.process(); - - // Assess - expect(processedMessages).toStrictEqual([ - ['success', successPayload1, firstRecord], - ['success', successPayload2, secondRecord], - ]); - }); - - it('completes the processing with failures if some of the payload does not match the passed schema', async () => { - // Prepare - const firstRecord = kinesisRecordFactory( - Buffer.from(JSON.stringify(successPayload1)).toString('base64') - ); - const secondRecord = kinesisRecordFactory( - Buffer.from(JSON.stringify(failurePayload1)).toString('base64') - ); - const records = [firstRecord, secondRecord]; - const processor = new BatchProcessor(EventType.KinesisDataStreams, { - schema: Kinesis.schema, - }); - - // Act - processor.register(records, kinesisRecordHandler, options); - const processedMessages = await processor.process(); - - // Assess - expect(processedMessages[0]).toStrictEqual([ - 'success', - successPayload1, - firstRecord, - ]); - expect(processor.failureMessages.length).toBe(1); - expect(processor.response()).toStrictEqual({ - batchItemFailures: [ - { itemIdentifier: secondRecord.kinesis.sequenceNumber }, - ], - }); - }); - - it('completes processing with all failures if all the payload does not match the passed schema', async () => { - // Prepare - const firstRecord = kinesisRecordFactory( - Buffer.from(JSON.stringify(failurePayload1)).toString('base64') - ); - const secondRecord = kinesisRecordFactory( - Buffer.from(JSON.stringify(failurePayload2)).toString('base64') - ); - - const records = [firstRecord, secondRecord]; - const processor = new BatchProcessor(EventType.KinesisDataStreams, { - schema: Kinesis.schema, - }); - - // Act - processor.register(records, sqsRecordHandler, options); - - // Assess - await expect(processor.process()).rejects.toThrowError( - FullBatchFailureError - ); - }); - } - ); - - describe.each(cases)( - 'DynamoDB Record Schema $description', - ({ DynamoDB }) => { - it('completes the processing with no failures and parses the payload before passing to the record handler', async () => { - // Prepare - const firstRecord = dynamodbRecordFactory(successPayload1.Message); - const secondRecord = dynamodbRecordFactory(successPayload2.Message); - const records = [firstRecord, secondRecord]; - const processor = new BatchProcessor(EventType.DynamoDBStreams, { - schema: DynamoDB.schema, - }); - - // Act - processor.register(records, dynamodbRecordHandler, options); - const processedMessages = await processor.process(); - - // Assess - expect(processedMessages).toStrictEqual([ - ['success', successPayload1, firstRecord], - ['success', successPayload2, secondRecord], - ]); - }); - - it('completes the processing with failures if some of the payload does not match the passed schema', async () => { - // Prepare - const firstRecord = dynamodbRecordFactory(successPayload1.Message); - //@ts-expect-error Passing an invalid payload for testing - const secondRecord = dynamodbRecordFactory(failurePayload1.Message); - const records = [firstRecord, secondRecord]; - const processor = new BatchProcessor(EventType.DynamoDBStreams, { - schema: DynamoDB.schema, - }); - - // Act - processor.register(records, dynamodbRecordHandler, options); - const processedMessages = await processor.process(); - - // Assess - expect(processedMessages[0]).toStrictEqual([ - 'success', - successPayload1, - firstRecord, - ]); - expect(processor.failureMessages.length).toBe(1); - expect(processor.response()).toStrictEqual({ - batchItemFailures: [ - { itemIdentifier: secondRecord.dynamodb?.SequenceNumber }, - ], - }); - }); - - it('completes processing with all failures if all the payload does not match the passed schema', async () => { - // Prepare - //@ts-expect-error Passing an invalid payload for testing - const firstRecord = dynamodbRecordFactory(failurePayload1.Message); - //@ts-expect-error Passing an invalid payload for testing - const secondRecord = dynamodbRecordFactory(failurePayload2.Message); - const records = [firstRecord, secondRecord]; - const processor = new BatchProcessor(EventType.DynamoDBStreams, { - schema: DynamoDB.schema, - }); - - // Act - processor.register(records, dynamodbRecordHandler, options); - - // Assess - await expect(processor.process()).rejects.toThrowError( - FullBatchFailureError - ); - }); - } - ); - - it('completes processing with all failures if an unsupported event type is used for parsing', async () => { - // Prepare - const firstRecord = sqsRecordFactory(JSON.stringify(successPayload1)); - const secondRecord = sqsRecordFactory(JSON.stringify(successPayload2)); - const records = [firstRecord, secondRecord]; - //@ts-expect-error - const processor = new BatchProcessor('invalid-event-type', { - schema: customSchema, - }); - - // Act - processor.register(records, sqsRecordHandler, options); - - // Assess - await expect(processor.process()).rejects.toThrowError( - FullBatchFailureError - ); - }); - - it('completes processing with failures if an unsupported schema type is used for parsing', async () => { - // Prepare - const unsupportedSchema = v.object({ - Message: v.string(), - }); - const firstRecord = sqsRecordFactory(JSON.stringify(successPayload1)); - const secondRecord = sqsRecordFactory(JSON.stringify(successPayload2)); - const records = [firstRecord, secondRecord]; - const processor = new BatchProcessor(EventType.SQS, { - schema: unsupportedSchema, - }); - - // Act - processor.register(records, sqsRecordHandler, options); - - // Assess - await expect(processor.process()).rejects.toThrowError( - FullBatchFailureError - ); - }); - }); }); diff --git a/packages/batch/tests/unit/parsing.test.ts b/packages/batch/tests/unit/parsing.test.ts new file mode 100644 index 0000000000..231ec162a2 --- /dev/null +++ b/packages/batch/tests/unit/parsing.test.ts @@ -0,0 +1,383 @@ +import { + Base64Encoded, + JSONStringified, +} from '@aws-lambda-powertools/parser/helpers'; +import { DynamoDBMarshalled } from '@aws-lambda-powertools/parser/helpers/dynamodb'; +import { + KinesisDataStreamRecord, + SqsRecordSchema, +} from '@aws-lambda-powertools/parser/schemas'; +import { + DynamoDBStreamChangeRecordBase, + DynamoDBStreamRecord, +} from '@aws-lambda-powertools/parser/schemas/dynamodb'; +import { KinesisDataStreamRecordPayload } from '@aws-lambda-powertools/parser/schemas/kinesis'; +import type { + DynamoDBRecord, + KinesisStreamRecord, + SQSRecord, +} from 'aws-lambda'; +import { object, string } from 'valibot'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { z } from 'zod'; +import { + BatchProcessor, + EventType, + FullBatchFailureError, +} from '../../src/index.js'; +import { parser } from '../../src/parser.js'; +import { + dynamodbRecordFactory, + kinesisRecordFactory, + sqsRecordFactory, +} from '../helpers/factories.js'; + +describe('Batch processing with Parser Integration', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + const customSchema = z.object({ + Message: z.string(), + }); + const successPayload1 = { + Message: 'test-1', + }; + const successPayload2 = { + Message: 'test-2', + }; + const failurePayload1 = { + Message: 1, + }; + const sqsRecordHandler = async (parsedRecord: SQSRecord) => { + return parsedRecord.body; + }; + const kinesisRecordHandler = async (parsedRecord: KinesisStreamRecord) => { + return parsedRecord.kinesis.data; + }; + const dynamodbRecordHandler = async (parsedRecord: DynamoDBRecord) => { + return parsedRecord.dynamodb?.NewImage; + }; + const cases = [ + { + description: 'passing Extended Schema', + SQSParserConfig: { + parser, + schema: SqsRecordSchema.extend({ + body: JSONStringified(customSchema), + }), + }, + KinesisParserConfig: { + parser, + schema: KinesisDataStreamRecord.extend({ + kinesis: KinesisDataStreamRecordPayload.extend({ + data: Base64Encoded(customSchema).optional(), + }), + }), + }, + DynamoDBParserConfig: { + parser, + schema: DynamoDBStreamRecord.extend({ + dynamodb: DynamoDBStreamChangeRecordBase.extend({ + NewImage: DynamoDBMarshalled(customSchema).optional(), + }), + }), + }, + }, + { + description: 'passing Internal Schema without transformer property set', + SQSParserConfig: { + parser, + innerSchema: JSONStringified(customSchema), + }, + KinesisParserConfig: { + parser, + innerSchema: Base64Encoded(customSchema), + }, + DynamoDBParserConfig: { + parser, + innerSchema: DynamoDBMarshalled(customSchema), + }, + }, + { + description: 'passing Internal Schema with transformer property set', + SQSParserConfig: { + parser, + innerSchema: customSchema, + transformer: 'json' as const, + }, + KinesisParserConfig: { + parser, + innerSchema: customSchema, + transformer: 'base64' as const, + }, + DynamoDBParserConfig: { + parser, + innerSchema: customSchema, + transformer: 'unmarshall' as const, + }, + }, + ]; + describe.each(cases)( + 'SQS Record Schema $description', + ({ SQSParserConfig }) => { + it('completes the processing with no failures and parses the payload before passing to the record handler', async () => { + // Prepare + const firstRecord = sqsRecordFactory(JSON.stringify(successPayload1)); + const secondRecord = sqsRecordFactory(JSON.stringify(successPayload2)); + const records = [firstRecord, secondRecord]; + const processor = new BatchProcessor(EventType.SQS, SQSParserConfig); + + // Act + processor.register(records, sqsRecordHandler); + const processedMessages = await processor.process(); + + // Assess + expect(processedMessages).toStrictEqual([ + ['success', successPayload1, firstRecord], + ['success', successPayload2, secondRecord], + ]); + }); + + it('completes the processing with failures if some of the payload does not match the passed schema', async () => { + // Prepare + const firstRecord = sqsRecordFactory(JSON.stringify(successPayload1)); + const secondRecord = sqsRecordFactory(JSON.stringify(failurePayload1)); + const records = [firstRecord, secondRecord]; + const processor = new BatchProcessor(EventType.SQS, SQSParserConfig); + + // Act + processor.register(records, sqsRecordHandler); + const processedMessages = await processor.process(); + + // Assess + expect(processedMessages[0]).toStrictEqual([ + 'success', + successPayload1, + firstRecord, + ]); + expect(processor.failureMessages.length).toBe(1); + expect(processor.response()).toStrictEqual({ + batchItemFailures: [{ itemIdentifier: secondRecord.messageId }], + }); + }); + } + ); + + describe.each(cases)( + 'Kinesis Record Schema $description', + ({ KinesisParserConfig }) => { + it('completes the processing with no failures and parses the payload before passing to the record handler', async () => { + // Prepare + const firstRecord = kinesisRecordFactory( + Buffer.from(JSON.stringify(successPayload1)).toString('base64') + ); + const secondRecord = kinesisRecordFactory( + Buffer.from(JSON.stringify(successPayload2)).toString('base64') + ); + const records = [firstRecord, secondRecord]; + const processor = new BatchProcessor( + EventType.KinesisDataStreams, + KinesisParserConfig + ); + + // Act + processor.register(records, kinesisRecordHandler); + const processedMessages = await processor.process(); + + // Assess + expect(processedMessages).toStrictEqual([ + ['success', successPayload1, firstRecord], + ['success', successPayload2, secondRecord], + ]); + }); + + it('completes the processing with failures if some of the payload does not match the passed schema', async () => { + // Prepare + const firstRecord = kinesisRecordFactory( + Buffer.from(JSON.stringify(successPayload1)).toString('base64') + ); + const secondRecord = kinesisRecordFactory( + Buffer.from(JSON.stringify(failurePayload1)).toString('base64') + ); + const records = [firstRecord, secondRecord]; + const processor = new BatchProcessor( + EventType.KinesisDataStreams, + KinesisParserConfig + ); + + // Act + processor.register(records, kinesisRecordHandler); + const processedMessages = await processor.process(); + + // Assess + expect(processedMessages[0]).toStrictEqual([ + 'success', + successPayload1, + firstRecord, + ]); + expect(processor.failureMessages.length).toBe(1); + expect(processor.response()).toStrictEqual({ + batchItemFailures: [ + { itemIdentifier: secondRecord.kinesis.sequenceNumber }, + ], + }); + }); + } + ); + + describe.each(cases)( + 'DynamoDB Record Schema $description', + ({ DynamoDBParserConfig }) => { + it('completes the processing with no failures and parses the payload before passing to the record handler', async () => { + // Prepare + const firstRecord = dynamodbRecordFactory(successPayload1.Message); + const secondRecord = dynamodbRecordFactory(successPayload2.Message); + const records = [firstRecord, secondRecord]; + const processor = new BatchProcessor( + EventType.DynamoDBStreams, + DynamoDBParserConfig + ); + + // Act + processor.register(records, dynamodbRecordHandler); + const processedMessages = await processor.process(); + + // Assess + expect(processedMessages).toStrictEqual([ + ['success', successPayload1, firstRecord], + ['success', successPayload2, secondRecord], + ]); + }); + + it('completes the processing with failures if some of the payload does not match the passed schema', async () => { + // Prepare + vi.stubEnv('AWS_LAMBDA_LOG_LEVEL', 'DEBUG'); + const firstRecord = dynamodbRecordFactory(successPayload1.Message); + //@ts-expect-error Passing an invalid payload for testing + const secondRecord = dynamodbRecordFactory(failurePayload1.Message); + const records = [firstRecord, secondRecord]; + const processor = new BatchProcessor(EventType.DynamoDBStreams, { + ...DynamoDBParserConfig, + logger: console, + }); + + // Act + processor.register(records, dynamodbRecordHandler); + const processedMessages = await processor.process(); + + // Assess + expect(processedMessages[0]).toStrictEqual([ + 'success', + successPayload1, + firstRecord, + ]); + expect(processor.failureMessages.length).toBe(1); + expect(processor.response()).toStrictEqual({ + batchItemFailures: [ + { itemIdentifier: secondRecord.dynamodb?.SequenceNumber }, + ], + }); + expect(console.debug).toHaveBeenCalledWith( + 'dynamodb.NewImage.Message: Invalid input: expected string, received number' + ); + }); + } + ); + + it('completes processing with all failures if an unsupported event type is used for parsing', async () => { + // Prepare + const firstRecord = sqsRecordFactory(JSON.stringify(successPayload1)); + const secondRecord = sqsRecordFactory(JSON.stringify(successPayload2)); + const records = [firstRecord, secondRecord]; + //@ts-expect-error + const processor = new BatchProcessor('invalid-event-type', { + innerSchema: customSchema, + transformer: 'json', + }); + + // Act + processor.register(records, sqsRecordHandler); + + // Assess + await expect(processor.process()).rejects.toThrowError( + FullBatchFailureError + ); + }); + + it('completes processing with failures if an unsupported schema type is used for parsing', async () => { + // Prepare + const unsupportedSchema = object({ + Message: string(), + }); + const firstRecord = sqsRecordFactory(JSON.stringify(successPayload1)); + const secondRecord = sqsRecordFactory(JSON.stringify(successPayload2)); + const records = [firstRecord, secondRecord]; + const processor = new BatchProcessor(EventType.SQS, { + parser, + // @ts-expect-error - we are explicitly testing a wrong schema vendor + innerSchema: unsupportedSchema, + transformer: 'json', + }); + + // Act + processor.register(records, sqsRecordHandler); + + // Assess + await expect(processor.process()).rejects.toThrowError( + FullBatchFailureError + ); + }); + + it('completes processing with failures if the schema is not passed for the parsing', async () => { + // Prepare + const firstRecord = sqsRecordFactory(JSON.stringify(successPayload1)); + const secondRecord = sqsRecordFactory(JSON.stringify(successPayload2)); + const records = [firstRecord, secondRecord]; + + const processor = new BatchProcessor(EventType.SQS, { + parser, + transformer: 'json', + }); + + // Act + processor.register(records, sqsRecordHandler); + + // Assess + await expect(processor.process()).rejects.toThrowError( + FullBatchFailureError + ); + }); + + it('uses a custom logger when provided', async () => { + // Prepare + const logger = { + debug: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; + const unsupportedSchema = object({ + Message: string(), + }); + const firstRecord = sqsRecordFactory(JSON.stringify(successPayload1)); + const secondRecord = sqsRecordFactory(JSON.stringify(successPayload2)); + const records = [firstRecord, secondRecord]; + const processor = new BatchProcessor(EventType.SQS, { + parser, + // @ts-expect-error - we are explicitly testing a wrong schema vendor + innerSchema: unsupportedSchema, + transformer: 'json', + logger, + }); + + // Act + processor.register(records, sqsRecordHandler); + + // Assess + await expect(processor.process()).rejects.toThrowError( + FullBatchFailureError + ); + expect(logger.error).toHaveBeenCalledWith( + 'The schema provided is not supported. Only Zod schemas are supported for extension.' + ); + }); +}); diff --git a/packages/batch/vitest.config.ts b/packages/batch/vitest.config.ts index d5aa737c68..9f1196ef1f 100644 --- a/packages/batch/vitest.config.ts +++ b/packages/batch/vitest.config.ts @@ -3,5 +3,6 @@ import { defineProject } from 'vitest/config'; export default defineProject({ test: { environment: 'node', + setupFiles: ['../testing/src/setupEnv.ts'], }, }); From 41292d56e4069c3f5ffd88828b61922838014bbb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Sep 2025 16:18:06 +0100 Subject: [PATCH 141/255] chore(deps-dev): bump zod from 4.1.5 to 4.1.7 (#4468) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Swopnil Dangol --- examples/snippets/package.json | 2 +- package-lock.json | 12 ++++++------ packages/kafka/package.json | 2 +- packages/parser/package.json | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/snippets/package.json b/examples/snippets/package.json index dca654f9b6..3417a5b23a 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -43,7 +43,7 @@ "@valkey/valkey-glide": "^2.0.1", "aws-sdk": "^2.1692.0", "aws-sdk-client-mock": "^4.1.0", - "zod": "^4.1.5" + "zod": "^4.1.7" }, "dependencies": { "arktype": "^2.1.22", diff --git a/package-lock.json b/package-lock.json index f4c3422e9c..d3006c9fda 100644 --- a/package-lock.json +++ b/package-lock.json @@ -105,7 +105,7 @@ "@valkey/valkey-glide": "^2.0.1", "aws-sdk": "^2.1692.0", "aws-sdk-client-mock": "^4.1.0", - "zod": "^4.1.5" + "zod": "^4.1.7" } }, "examples/snippets/node_modules/@valkey/valkey-glide": { @@ -10729,9 +10729,9 @@ } }, "node_modules/zod": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.5.tgz", - "integrity": "sha512-rcUUZqlLJgBC33IT3PNMgsCq6TzLQEG/Ei/KTCU0PedSWRMAXoOUN+4t/0H+Q8bdnLPdqUYnvboJT0bn/229qg==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.7.tgz", + "integrity": "sha512-6qi6UYyzAl7W9uV29KvcSFXqK4QCYNYUz2YASPNBWpJE1RY6R1nArmmFPgGY/CBYWzpeMw3EOER+DR9a05O4IA==", "dev": true, "license": "MIT", "funding": { @@ -10821,7 +10821,7 @@ "devDependencies": { "avro-js": "^1.12.0", "protobufjs": "^7.5.4", - "zod": "^4.1.5" + "zod": "^4.1.7" }, "peerDependencies": { "arktype": ">=2.0.0", @@ -10942,7 +10942,7 @@ "@standard-schema/spec": "^1.0.0" }, "devDependencies": { - "zod": "^4.1.5" + "zod": "^4.1.7" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x", diff --git a/packages/kafka/package.json b/packages/kafka/package.json index 8e882e2fa8..fa370a5c87 100644 --- a/packages/kafka/package.json +++ b/packages/kafka/package.json @@ -116,6 +116,6 @@ "devDependencies": { "avro-js": "^1.12.0", "protobufjs": "^7.5.4", - "zod": "^4.1.5" + "zod": "^4.1.7" } } diff --git a/packages/parser/package.json b/packages/parser/package.json index d7208021fb..fe4ff31dc2 100644 --- a/packages/parser/package.json +++ b/packages/parser/package.json @@ -215,6 +215,6 @@ } }, "devDependencies": { - "zod": "^4.1.5" + "zod": "^4.1.7" } } From d0bbfe0c5a8302940ffcaa055fd06886ccaddd15 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Sep 2025 16:20:53 +0100 Subject: [PATCH 142/255] chore(deps): bump github/codeql-action from 3.30.2 to 3.30.3 (#4467) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Swopnil Dangol --- .github/workflows/ossf_scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ossf_scorecard.yml b/.github/workflows/ossf_scorecard.yml index 7add6bb316..6b7f51f61a 100644 --- a/.github/workflows/ossf_scorecard.yml +++ b/.github/workflows/ossf_scorecard.yml @@ -43,6 +43,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@d3678e237b9c32a6c9bffb3315c335f976f3549f # v3.29.5 + uses: github/codeql-action/upload-sarif@192325c86100d080feab897ff886c34abd4c83a3 # v3.29.5 with: sarif_file: results.sarif From ddb52e36476fb724b2eabbf0ec89995a8e10964b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Sep 2025 16:37:15 +0100 Subject: [PATCH 143/255] chore(ci): bump version to 2.26.0 (#4469) Co-authored-by: aws-powertools-bot <151832416+aws-powertools-bot@users.noreply.github.com> --- CHANGELOG.md | 32 +++++++++++++++++++++++++++++ examples/app/CHANGELOG.md | 4 ++++ examples/app/package.json | 14 ++++++------- examples/snippets/CHANGELOG.md | 4 ++++ examples/snippets/package.json | 20 +++++++++--------- layers/CHANGELOG.md | 4 ++++ layers/package.json | 2 +- package-lock.json | 30 +++++++++++++-------------- packages/batch/CHANGELOG.md | 5 +++++ packages/batch/package.json | 4 ++-- packages/commons/CHANGELOG.md | 4 ++++ packages/commons/package.json | 2 +- packages/commons/src/version.ts | 2 +- packages/event-handler/CHANGELOG.md | 21 +++++++++++++++++++ packages/event-handler/package.json | 4 ++-- packages/idempotency/CHANGELOG.md | 4 ++++ packages/idempotency/package.json | 6 +++--- packages/jmespath/CHANGELOG.md | 4 ++++ packages/jmespath/package.json | 4 ++-- packages/kafka/CHANGELOG.md | 4 ++++ packages/kafka/package.json | 4 ++-- packages/logger/CHANGELOG.md | 5 +++++ packages/logger/package.json | 6 +++--- packages/metrics/CHANGELOG.md | 4 ++++ packages/metrics/package.json | 4 ++-- packages/parameters/CHANGELOG.md | 4 ++++ packages/parameters/package.json | 4 ++-- packages/parser/CHANGELOG.md | 11 ++++++++++ packages/parser/package.json | 4 ++-- packages/testing/CHANGELOG.md | 4 ++++ packages/testing/package.json | 2 +- packages/tracer/CHANGELOG.md | 4 ++++ packages/tracer/package.json | 4 ++-- packages/validation/CHANGELOG.md | 4 ++++ packages/validation/package.json | 6 +++--- 35 files changed, 183 insertions(+), 61 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d410f1061a..e5f2ebe98c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,37 @@ # Change Log +## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) + +### Improvements + +- **logger** update `getCodeLocation` regex to improve performance ([#4389](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4389)) ([801333d](https://github.com/aws-powertools/powertools-lambda-typescript/commit/801333deff04b09d4adb88860c60f497295685d9)) +- **batch** simplified the parser integration api with batch processor ([#4465](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4465)) ([96977ff](https://github.com/aws-powertools/powertools-lambda-typescript/commit/96977ff6b1330adcf82d9caa3b30454208d654e8)) + +### Bug Fixes + +- **parser** updated the binaryValue and stringValue in the SqsMsgAttributeSchema to nullable ([#4450](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4450)) ([cefcbdb](https://github.com/aws-powertools/powertools-lambda-typescript/commit/cefcbdbaec087ce1bfcee4294754dc173c0c473b)) +- **event-handler** handle nullable fields in APIGatewayProxyEvent ([#4455](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4455)) ([200f47b](https://github.com/aws-powertools/powertools-lambda-typescript/commit/200f47b0c9e3864b2732d93ca50dd65323b109fb)) + +### Features + +- **parser** integrate parser with Batch Processing ([#4408](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4408)) ([0b6bbbb](https://github.com/aws-powertools/powertools-lambda-typescript/commit/0b6bbbb751caaa7a81e1c2aaf823892c54b9e9cb)) +- **parser** implemented a helper function `Base64Encoded` to decode base64 encoded payloads ([#4413](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4413)) ([1554360](https://github.com/aws-powertools/powertools-lambda-typescript/commit/15543602ea8182b0a5972fc2acfb364da4ad97f3)) +- **parser** add IPv6 support for sourceIp in API Gateway schemas ([#4398](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4398)) ([2a94c37](https://github.com/aws-powertools/powertools-lambda-typescript/commit/2a94c3759a04057423db8f346c921166ada173d0)) +- **event-handler** remove undefined from Router's resolve type signature ([#4463](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4463)) ([d36ef55](https://github.com/aws-powertools/powertools-lambda-typescript/commit/d36ef5569de910e467f7c6d6b1d518112a998d40)) +- **event-handler** implement mechanism to manipulate response in middleware ([#4439](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4439)) ([35a510d](https://github.com/aws-powertools/powertools-lambda-typescript/commit/35a510d3f3191b479105238f5f956bfeeb519389)) +- **event-handler** add route specific middleware registration and execution ([#4437](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4437)) ([e6ea674](https://github.com/aws-powertools/powertools-lambda-typescript/commit/e6ea674b97953d0391573ea6536f9eb5f02f659b)) +- **event-handler** add middleware registration and composition to rest handler ([#4428](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4428)) ([fc87eb3](https://github.com/aws-powertools/powertools-lambda-typescript/commit/fc87eb3f5c05a31002becf30e22928c8d7913a3f)) +- **event-handler** add support for error handling in AppSync GraphQL ([#4317](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4317)) ([77a992f](https://github.com/aws-powertools/powertools-lambda-typescript/commit/77a992ff39ed41da2c965bc86d65a326f4db21d6)) +- **event-handler** add resolution logic to base router ([#4349](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4349)) ([f1ecc6d](https://github.com/aws-powertools/powertools-lambda-typescript/commit/f1ecc6da353ed1d4a1a943a4b75dc3e2b50d8e5e)) + +### Maintenance + +- **event-handler** rename variables to reflect that options object is now a RequestContext ([#4460](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4460)) ([5b4ee1a](https://github.com/aws-powertools/powertools-lambda-typescript/commit/5b4ee1ac77c4ebf0af6181f56a47340173306673)) +- **event-handler** expose rest handler functionality ([#4458](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4458)) ([23eddfd](https://github.com/aws-powertools/powertools-lambda-typescript/commit/23eddfdd2f3ec0824dccd080824628c63ed8308c)) +- **event-handler** split Router tests into multiple files ([#4449](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4449)) ([91a1ec4](https://github.com/aws-powertools/powertools-lambda-typescript/commit/91a1ec4c4765e814b67f669ed2ff77c674cc3155)) +- **event-handler** rename BaseRouter class to Router ([#4448](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4448)) ([b043c28](https://github.com/aws-powertools/powertools-lambda-typescript/commit/b043c28820b18e2d518153992f4f3243d476e208)) + + ## [2.25.2](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.1...v2.25.2) (2025-08-26) ### Maintenance diff --git a/examples/app/CHANGELOG.md b/examples/app/CHANGELOG.md index 3ed446b554..79293f3b83 100644 --- a/examples/app/CHANGELOG.md +++ b/examples/app/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) + +**Note:** Version bump only for this package + ## [2.25.2](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.1...v2.25.2) (2025-08-26) **Note:** Version bump only for this package diff --git a/examples/app/package.json b/examples/app/package.json index b683b1780a..6dcbcf291b 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -1,6 +1,6 @@ { "name": "powertools-sample-app", - "version": "2.25.2", + "version": "2.26.0", "author": { "name": "Amazon Web Services", "url": "https://aws.amazon.com" @@ -38,12 +38,12 @@ "vitest": "^3.0.5" }, "dependencies": { - "@aws-lambda-powertools/batch": "^2.25.2", - "@aws-lambda-powertools/idempotency": "^2.25.2", - "@aws-lambda-powertools/logger": "^2.25.2", - "@aws-lambda-powertools/metrics": "^2.25.2", - "@aws-lambda-powertools/parameters": "^2.25.2", - "@aws-lambda-powertools/tracer": "^2.25.2", + "@aws-lambda-powertools/batch": "^2.26.0", + "@aws-lambda-powertools/idempotency": "^2.26.0", + "@aws-lambda-powertools/logger": "^2.26.0", + "@aws-lambda-powertools/metrics": "^2.26.0", + "@aws-lambda-powertools/parameters": "^2.26.0", + "@aws-lambda-powertools/tracer": "^2.26.0", "@aws-sdk/client-ssm": "^3.883.0", "@aws-sdk/lib-dynamodb": "^3.883.0", "@middy/core": "^4.7.0", diff --git a/examples/snippets/CHANGELOG.md b/examples/snippets/CHANGELOG.md index a66cd15876..4e4dfdce10 100644 --- a/examples/snippets/CHANGELOG.md +++ b/examples/snippets/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) + +**Note:** Version bump only for this package + ## [2.25.2](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.1...v2.25.2) (2025-08-26) **Note:** Version bump only for this package diff --git a/examples/snippets/package.json b/examples/snippets/package.json index 3417a5b23a..30c18763d8 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -1,6 +1,6 @@ { "name": "code-snippets", - "version": "2.25.2", + "version": "2.26.0", "description": "A collection code snippets for the Powertools for AWS Lambda (TypeScript) docs", "author": { "name": "Amazon Web Services", @@ -24,15 +24,15 @@ }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript#readme", "devDependencies": { - "@aws-lambda-powertools/batch": "^2.25.2", - "@aws-lambda-powertools/event-handler": "^2.25.2", - "@aws-lambda-powertools/idempotency": "^2.25.2", - "@aws-lambda-powertools/jmespath": "^2.25.2", - "@aws-lambda-powertools/logger": "^2.25.2", - "@aws-lambda-powertools/metrics": "^2.25.2", - "@aws-lambda-powertools/parameters": "^2.25.2", - "@aws-lambda-powertools/parser": "^2.25.2", - "@aws-lambda-powertools/tracer": "^2.25.2", + "@aws-lambda-powertools/batch": "^2.26.0", + "@aws-lambda-powertools/event-handler": "^2.26.0", + "@aws-lambda-powertools/idempotency": "^2.26.0", + "@aws-lambda-powertools/jmespath": "^2.26.0", + "@aws-lambda-powertools/logger": "^2.26.0", + "@aws-lambda-powertools/metrics": "^2.26.0", + "@aws-lambda-powertools/parameters": "^2.26.0", + "@aws-lambda-powertools/parser": "^2.26.0", + "@aws-lambda-powertools/tracer": "^2.26.0", "@aws-sdk/client-appconfigdata": "^3.883.0", "@aws-sdk/client-dynamodb": "^3.883.0", "@aws-sdk/client-secrets-manager": "^3.883.0", diff --git a/layers/CHANGELOG.md b/layers/CHANGELOG.md index 1b47c0df66..62018b3a9f 100644 --- a/layers/CHANGELOG.md +++ b/layers/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) + +**Note:** Version bump only for this package + ## [2.25.2](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.1...v2.25.2) (2025-08-26) **Note:** Version bump only for this package diff --git a/layers/package.json b/layers/package.json index 5abefd83e8..639da04ec6 100644 --- a/layers/package.json +++ b/layers/package.json @@ -1,6 +1,6 @@ { "name": "layers", - "version": "2.25.2", + "version": "2.26.0", "bin": { "layer": "bin/layers.js" }, diff --git a/package-lock.json b/package-lock.json index d3006c9fda..82ea21ec14 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ }, "examples/app": { "name": "powertools-sample-app", - "version": "2.25.2", + "version": "2.26.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/batch": "^2.25.2", @@ -79,7 +79,7 @@ }, "examples/snippets": { "name": "code-snippets", - "version": "2.25.2", + "version": "2.26.0", "license": "MIT-0", "dependencies": { "arktype": "^2.1.22", @@ -10740,7 +10740,7 @@ }, "packages/batch": { "name": "@aws-lambda-powertools/batch", - "version": "2.25.2", + "version": "2.26.0", "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/parser": "2.25.2", @@ -10749,7 +10749,7 @@ }, "packages/commons": { "name": "@aws-lambda-powertools/commons", - "version": "2.25.2", + "version": "2.26.0", "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing" @@ -10757,7 +10757,7 @@ }, "packages/event-handler": { "name": "@aws-lambda-powertools/event-handler", - "version": "2.25.2", + "version": "2.26.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.25.2" @@ -10765,7 +10765,7 @@ }, "packages/idempotency": { "name": "@aws-lambda-powertools/idempotency", - "version": "2.25.2", + "version": "2.26.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.25.2", @@ -10804,7 +10804,7 @@ }, "packages/jmespath": { "name": "@aws-lambda-powertools/jmespath", - "version": "2.25.2", + "version": "2.26.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.25.2" @@ -10812,7 +10812,7 @@ }, "packages/kafka": { "name": "@aws-lambda-powertools/kafka", - "version": "2.25.2", + "version": "2.26.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.25.2", @@ -10842,7 +10842,7 @@ }, "packages/logger": { "name": "@aws-lambda-powertools/logger", - "version": "2.25.2", + "version": "2.26.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.25.2", @@ -10867,7 +10867,7 @@ }, "packages/metrics": { "name": "@aws-lambda-powertools/metrics", - "version": "2.25.2", + "version": "2.26.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.25.2" @@ -10889,7 +10889,7 @@ }, "packages/parameters": { "name": "@aws-lambda-powertools/parameters", - "version": "2.25.2", + "version": "2.26.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.25.2" @@ -10935,7 +10935,7 @@ }, "packages/parser": { "name": "@aws-lambda-powertools/parser", - "version": "2.25.2", + "version": "2.26.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.25.2", @@ -10959,7 +10959,7 @@ }, "packages/testing": { "name": "@aws-lambda-powertools/testing-utils", - "version": "2.25.2", + "version": "2.26.0", "license": "MIT-0", "dependencies": { "@aws-cdk/toolkit-lib": "^1.6.1", @@ -10976,7 +10976,7 @@ }, "packages/tracer": { "name": "@aws-lambda-powertools/tracer", - "version": "2.25.2", + "version": "2.26.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.25.2", @@ -10998,7 +10998,7 @@ }, "packages/validation": { "name": "@aws-lambda-powertools/validation", - "version": "2.25.2", + "version": "2.26.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.25.2", diff --git a/packages/batch/CHANGELOG.md b/packages/batch/CHANGELOG.md index 3773c02e45..1aa3ee3895 100644 --- a/packages/batch/CHANGELOG.md +++ b/packages/batch/CHANGELOG.md @@ -1,5 +1,10 @@ # Change Log +## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) + +### Improvements + +- simplified the parser integration api with batch processor ([#4465](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4465)) ([96977ff](https://github.com/aws-powertools/powertools-lambda-typescript/commit/96977ff6b1330adcf82d9caa3b30454208d654e8)) ## [2.25.2](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.1...v2.25.2) (2025-08-26) **Note:** Version bump only for this package diff --git a/packages/batch/package.json b/packages/batch/package.json index e280a4db4c..232613b8b8 100644 --- a/packages/batch/package.json +++ b/packages/batch/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/batch", - "version": "2.25.2", + "version": "2.26.0", "description": "The batch processing package for the Powertools for AWS Lambda (TypeScript) library.", "author": { "name": "Amazon Web Services", @@ -82,6 +82,6 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-lambda-powertools/parser": "2.25.2" + "@aws-lambda-powertools/parser": "2.26.0" } } \ No newline at end of file diff --git a/packages/commons/CHANGELOG.md b/packages/commons/CHANGELOG.md index b627f3c609..903009a529 100644 --- a/packages/commons/CHANGELOG.md +++ b/packages/commons/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) + +**Note:** Version bump only for this package + ## [2.25.2](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.1...v2.25.2) (2025-08-26) ### Maintenance diff --git a/packages/commons/package.json b/packages/commons/package.json index 353d4c62bf..dabbaa9f7d 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/commons", - "version": "2.25.2", + "version": "2.26.0", "description": "A shared utility package for Powertools for AWS Lambda (TypeScript) libraries", "author": { "name": "Amazon Web Services", diff --git a/packages/commons/src/version.ts b/packages/commons/src/version.ts index 9cf78e1848..266de30175 100644 --- a/packages/commons/src/version.ts +++ b/packages/commons/src/version.ts @@ -1,2 +1,2 @@ // this file is auto generated, do not modify -export const PT_VERSION = '2.25.2'; +export const PT_VERSION = '2.26.0'; diff --git a/packages/event-handler/CHANGELOG.md b/packages/event-handler/CHANGELOG.md index e5990ed1a8..08d9a5a7a5 100644 --- a/packages/event-handler/CHANGELOG.md +++ b/packages/event-handler/CHANGELOG.md @@ -1,5 +1,26 @@ # Change Log +## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) + +### Features + +- remove undefined from Router's resolve type signature ([#4463](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4463)) ([d36ef55](https://github.com/aws-powertools/powertools-lambda-typescript/commit/d36ef5569de910e467f7c6d6b1d518112a998d40)) +- implement mechanism to manipulate response in middleware ([#4439](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4439)) ([35a510d](https://github.com/aws-powertools/powertools-lambda-typescript/commit/35a510d3f3191b479105238f5f956bfeeb519389)) +- add route specific middleware registration and execution ([#4437](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4437)) ([e6ea674](https://github.com/aws-powertools/powertools-lambda-typescript/commit/e6ea674b97953d0391573ea6536f9eb5f02f659b)) +- add middleware registration and composition to rest handler ([#4428](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4428)) ([fc87eb3](https://github.com/aws-powertools/powertools-lambda-typescript/commit/fc87eb3f5c05a31002becf30e22928c8d7913a3f)) +- add support for error handling in AppSync GraphQL ([#4317](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4317)) ([77a992f](https://github.com/aws-powertools/powertools-lambda-typescript/commit/77a992ff39ed41da2c965bc86d65a326f4db21d6)) +- add resolution logic to base router ([#4349](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4349)) ([f1ecc6d](https://github.com/aws-powertools/powertools-lambda-typescript/commit/f1ecc6da353ed1d4a1a943a4b75dc3e2b50d8e5e)) + +### Maintenance + +- rename variables to reflect that options object is now a RequestContext ([#4460](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4460)) ([5b4ee1a](https://github.com/aws-powertools/powertools-lambda-typescript/commit/5b4ee1ac77c4ebf0af6181f56a47340173306673)) +- expose rest handler functionality ([#4458](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4458)) ([23eddfd](https://github.com/aws-powertools/powertools-lambda-typescript/commit/23eddfdd2f3ec0824dccd080824628c63ed8308c)) +- split Router tests into multiple files ([#4449](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4449)) ([91a1ec4](https://github.com/aws-powertools/powertools-lambda-typescript/commit/91a1ec4c4765e814b67f669ed2ff77c674cc3155)) +- rename BaseRouter class to Router ([#4448](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4448)) ([b043c28](https://github.com/aws-powertools/powertools-lambda-typescript/commit/b043c28820b18e2d518153992f4f3243d476e208)) + +### Bug Fixes + +- handle nullable fields in APIGatewayProxyEvent ([#4455](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4455)) ([200f47b](https://github.com/aws-powertools/powertools-lambda-typescript/commit/200f47b0c9e3864b2732d93ca50dd65323b109fb)) ## [2.25.2](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.1...v2.25.2) (2025-08-26) ### Features diff --git a/packages/event-handler/package.json b/packages/event-handler/package.json index c049df3f3f..90a85b5d68 100644 --- a/packages/event-handler/package.json +++ b/packages/event-handler/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/event-handler", - "version": "2.25.2", + "version": "2.26.0", "description": "Lightweight routing to reduce boilerplate for API Gateway REST/HTTP API, ALB, Lambda Function URLs, and AppSync.", "author": { "name": "Amazon Web Services", @@ -114,7 +114,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.25.2" + "@aws-lambda-powertools/commons": "2.26.0" }, "keywords": [ "aws", diff --git a/packages/idempotency/CHANGELOG.md b/packages/idempotency/CHANGELOG.md index da8690e1e7..62fa1fe52a 100644 --- a/packages/idempotency/CHANGELOG.md +++ b/packages/idempotency/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) + +**Note:** Version bump only for this package + ## [2.25.2](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.1...v2.25.2) (2025-08-26) **Note:** Version bump only for this package diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index 56eb8713ea..1919e22d54 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/idempotency", - "version": "2.25.2", + "version": "2.26.0", "description": "The idempotency package for the Powertools for AWS Lambda (TypeScript) library. It provides options to make your Lambda functions idempotent and safe to retry.", "author": { "name": "Amazon Web Services", @@ -113,8 +113,8 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.25.2", - "@aws-lambda-powertools/jmespath": "2.25.2" + "@aws-lambda-powertools/commons": "2.26.0", + "@aws-lambda-powertools/jmespath": "2.26.0" }, "peerDependencies": { "@aws-sdk/client-dynamodb": ">=3.x", diff --git a/packages/jmespath/CHANGELOG.md b/packages/jmespath/CHANGELOG.md index 11979dcb99..96a4672b7e 100644 --- a/packages/jmespath/CHANGELOG.md +++ b/packages/jmespath/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) + +**Note:** Version bump only for this package + ## [2.25.2](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.1...v2.25.2) (2025-08-26) **Note:** Version bump only for this package diff --git a/packages/jmespath/package.json b/packages/jmespath/package.json index d2ed1b3218..cd2f3d1c9a 100644 --- a/packages/jmespath/package.json +++ b/packages/jmespath/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/jmespath", - "version": "2.25.2", + "version": "2.26.0", "description": "A type safe and modern jmespath module to parse and extract data from JSON documents using JMESPath", "author": { "name": "Amazon Web Services", @@ -71,7 +71,7 @@ "lib" ], "dependencies": { - "@aws-lambda-powertools/commons": "2.25.2" + "@aws-lambda-powertools/commons": "2.26.0" }, "repository": { "type": "git", diff --git a/packages/kafka/CHANGELOG.md b/packages/kafka/CHANGELOG.md index 63b05ae6f0..791ade261f 100644 --- a/packages/kafka/CHANGELOG.md +++ b/packages/kafka/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) + +**Note:** Version bump only for this package + ## [2.25.2](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.1...v2.25.2) (2025-08-26) **Note:** Version bump only for this package diff --git a/packages/kafka/package.json b/packages/kafka/package.json index fa370a5c87..b5c22afd7e 100644 --- a/packages/kafka/package.json +++ b/packages/kafka/package.json @@ -1,7 +1,7 @@ { "name": "@aws-lambda-powertools/kafka", "description": "Utility to easily handle message deserialization and parsing of Kafka events in AWS Lambda functions", - "version": "2.25.2", + "version": "2.26.0", "author": { "name": "Amazon Web Services", "url": "https://aws.amazon.com" @@ -46,7 +46,7 @@ "nodejs" ], "dependencies": { - "@aws-lambda-powertools/commons": "2.25.2", + "@aws-lambda-powertools/commons": "2.26.0", "@standard-schema/spec": "^1.0.0" }, "peerDependencies": { diff --git a/packages/logger/CHANGELOG.md b/packages/logger/CHANGELOG.md index 03139dff4a..230bcd59dd 100644 --- a/packages/logger/CHANGELOG.md +++ b/packages/logger/CHANGELOG.md @@ -1,5 +1,10 @@ # Change Log +## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) + +### Improvements + +- update `getCodeLocation` regex to improve performance ([#4389](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4389)) ([801333d](https://github.com/aws-powertools/powertools-lambda-typescript/commit/801333deff04b09d4adb88860c60f497295685d9)) ## [2.25.2](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.1...v2.25.2) (2025-08-26) ### Improvements diff --git a/packages/logger/package.json b/packages/logger/package.json index e877236d24..efaf2f6ece 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/logger", - "version": "2.25.2", + "version": "2.26.0", "description": "The logging package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -75,7 +75,7 @@ "@types/lodash.merge": "^4.6.9" }, "peerDependencies": { - "@aws-lambda-powertools/jmespath": "2.25.2", + "@aws-lambda-powertools/jmespath": "2.26.0", "@middy/core": "4.x || 5.x || 6.x" }, "peerDependenciesMeta": { @@ -97,7 +97,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.25.2", + "@aws-lambda-powertools/commons": "2.26.0", "lodash.merge": "^4.6.2" }, "keywords": [ diff --git a/packages/metrics/CHANGELOG.md b/packages/metrics/CHANGELOG.md index acd2fd5272..c9a1398b09 100644 --- a/packages/metrics/CHANGELOG.md +++ b/packages/metrics/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) + +**Note:** Version bump only for this package + ## [2.25.2](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.1...v2.25.2) (2025-08-26) ### Improvements diff --git a/packages/metrics/package.json b/packages/metrics/package.json index 298b9cc262..74642d9578 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/metrics", - "version": "2.25.2", + "version": "2.26.0", "description": "The metrics package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -87,7 +87,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.25.2" + "@aws-lambda-powertools/commons": "2.26.0" }, "keywords": [ "aws", diff --git a/packages/parameters/CHANGELOG.md b/packages/parameters/CHANGELOG.md index 3423097f14..3605a2822f 100644 --- a/packages/parameters/CHANGELOG.md +++ b/packages/parameters/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) + +**Note:** Version bump only for this package + ## [2.25.2](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.1...v2.25.2) (2025-08-26) ### Maintenance diff --git a/packages/parameters/package.json b/packages/parameters/package.json index d932b7863e..b50e2b671a 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/parameters", - "version": "2.25.2", + "version": "2.26.0", "description": "The parameters package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -164,7 +164,7 @@ "aws-sdk-client-mock": "^4.1.0" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.25.2" + "@aws-lambda-powertools/commons": "2.26.0" }, "peerDependencies": { "@aws-sdk/client-appconfigdata": ">=3.x", diff --git a/packages/parser/CHANGELOG.md b/packages/parser/CHANGELOG.md index f45b858579..2c8f629c4d 100644 --- a/packages/parser/CHANGELOG.md +++ b/packages/parser/CHANGELOG.md @@ -1,5 +1,16 @@ # Change Log +## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) + +### Bug Fixes + +- updated the binaryValue and stringValue in the SqsMsgAttributeSchema to nullable ([#4450](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4450)) ([cefcbdb](https://github.com/aws-powertools/powertools-lambda-typescript/commit/cefcbdbaec087ce1bfcee4294754dc173c0c473b)) + +### Features + +- integrate parser with Batch Processing ([#4408](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4408)) ([0b6bbbb](https://github.com/aws-powertools/powertools-lambda-typescript/commit/0b6bbbb751caaa7a81e1c2aaf823892c54b9e9cb)) +- implemented a helper function `Base64Encoded` to decode base64 encoded payloads ([#4413](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4413)) ([1554360](https://github.com/aws-powertools/powertools-lambda-typescript/commit/15543602ea8182b0a5972fc2acfb364da4ad97f3)) +- add IPv6 support for sourceIp in API Gateway schemas ([#4398](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4398)) ([2a94c37](https://github.com/aws-powertools/powertools-lambda-typescript/commit/2a94c3759a04057423db8f346c921166ada173d0)) ## [2.25.2](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.1...v2.25.2) (2025-08-26) **Note:** Version bump only for this package diff --git a/packages/parser/package.json b/packages/parser/package.json index fe4ff31dc2..d67d7afdfb 100644 --- a/packages/parser/package.json +++ b/packages/parser/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/parser", - "version": "2.25.2", + "version": "2.26.0", "description": "The parser package for the Powertools for AWS Lambda (TypeScript) library.", "author": { "name": "Amazon Web Services", @@ -199,7 +199,7 @@ "nodejs" ], "dependencies": { - "@aws-lambda-powertools/commons": "2.25.2", + "@aws-lambda-powertools/commons": "2.26.0", "@standard-schema/spec": "^1.0.0" }, "peerDependencies": { diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index 5dde40b665..43fba80bc8 100644 --- a/packages/testing/CHANGELOG.md +++ b/packages/testing/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) + +**Note:** Version bump only for this package + ## [2.25.2](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.1...v2.25.2) (2025-08-26) **Note:** Version bump only for this package diff --git a/packages/testing/package.json b/packages/testing/package.json index d8c3148476..b14c88fd80 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/testing-utils", - "version": "2.25.2", + "version": "2.26.0", "description": "A package containing utilities to test your serverless workloads", "author": { "name": "Amazon Web Services", diff --git a/packages/tracer/CHANGELOG.md b/packages/tracer/CHANGELOG.md index 056b67dacc..dcf00c47a0 100644 --- a/packages/tracer/CHANGELOG.md +++ b/packages/tracer/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) + +**Note:** Version bump only for this package + ## [2.25.2](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.1...v2.25.2) (2025-08-26) **Note:** Version bump only for this package diff --git a/packages/tracer/package.json b/packages/tracer/package.json index bb2060ab2f..f73510fef2 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/tracer", - "version": "2.25.2", + "version": "2.26.0", "description": "The tracer package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -86,7 +86,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.25.2", + "@aws-lambda-powertools/commons": "2.26.0", "aws-xray-sdk-core": "^3.10.3" }, "keywords": [ diff --git a/packages/validation/CHANGELOG.md b/packages/validation/CHANGELOG.md index 220ca13c71..b75bdf9d03 100644 --- a/packages/validation/CHANGELOG.md +++ b/packages/validation/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) + +**Note:** Version bump only for this package + ## [2.25.2](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.1...v2.25.2) (2025-08-26) **Note:** Version bump only for this package diff --git a/packages/validation/package.json b/packages/validation/package.json index 6a69b50ed3..92ab96ee99 100644 --- a/packages/validation/package.json +++ b/packages/validation/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/validation", - "version": "2.25.2", + "version": "2.26.0", "description": "An utility to validate events and responses using JSON Schemas", "author": { "name": "Amazon Web Services", @@ -95,8 +95,8 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.25.2", - "@aws-lambda-powertools/jmespath": "2.25.2", + "@aws-lambda-powertools/commons": "2.26.0", + "@aws-lambda-powertools/jmespath": "2.26.0", "ajv": "^8.17.1" }, "keywords": [ From bfdeeb62b0b941b53d96bdb2117c084fbb0e1ac4 Mon Sep 17 00:00:00 2001 From: Swopnil Dangol Date: Thu, 11 Sep 2025 17:14:17 +0100 Subject: [PATCH 144/255] chore(ci): update layer ARN on documentation (#4471) --- docs/getting-started/lambda-layers.md | 88 +++++++++++++-------------- examples/app/cdk/example-stack.ts | 2 +- examples/app/template.yaml | 2 +- 3 files changed, 46 insertions(+), 46 deletions(-) diff --git a/docs/getting-started/lambda-layers.md b/docs/getting-started/lambda-layers.md index eedf52270b..9e1046e76c 100644 --- a/docs/getting-started/lambda-layers.md +++ b/docs/getting-started/lambda-layers.md @@ -19,41 +19,41 @@ We publish the Lambda Layer for Powertools for AWS Lambda in all commercial regi | Region | Layer ARN | | ---------------- | ---------------------------------------------------------------------------------------------------------- | -| `us-east-1` | [arn:aws:lambda:us-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `us-east-2` | [arn:aws:lambda:us-east-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `us-west-1` | [arn:aws:lambda:us-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `us-west-2` | [arn:aws:lambda:us-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `ap-south-1` | [arn:aws:lambda:ap-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `ap-south-2` | [arn:aws:lambda:ap-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `ap-east-1` | [arn:aws:lambda:ap-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `ap-northeast-1` | [arn:aws:lambda:ap-northeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `ap-northeast-2` | [arn:aws:lambda:ap-northeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `ap-northeast-3` | [arn:aws:lambda:ap-northeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `ap-southeast-1` | [arn:aws:lambda:ap-southeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `ap-southeast-2` | [arn:aws:lambda:ap-southeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `ap-southeast-3` | [arn:aws:lambda:ap-southeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `ap-southeast-4` | [arn:aws:lambda:ap-southeast-4:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `ap-southeast-5` | [arn:aws:lambda:ap-southeast-5:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `ap-southeast-7` | [arn:aws:lambda:ap-southeast-7:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `eu-central-1` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `eu-central-2` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `eu-west-1` | [arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `eu-west-2` | [arn:aws:lambda:eu-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `eu-west-3` | [arn:aws:lambda:eu-west-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `eu-north-1` | [arn:aws:lambda:eu-north-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `eu-south-1` | [arn:aws:lambda:eu-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `eu-south-2` | [arn:aws:lambda:eu-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `ca-central-1` | [arn:aws:lambda:ca-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `ca-west-1` | [arn:aws:lambda:ca-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `sa-east-1` | [arn:aws:lambda:sa-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `af-south-1` | [arn:aws:lambda:af-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `me-south-1` | [arn:aws:lambda:me-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `me-central-1` | [arn:aws:lambda:me-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `il-central-1` | [arn:aws:lambda:il-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `mx-central-1` | [arn:aws:lambda:mx-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `us-gov-west-1` | [arn:aws-us-gov:lambda:us-gov-west-1:165093116878:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `us-gov-east-1` | [arn:aws-us-gov:lambda:us-gov-east-1:165087284144:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | -| `cn-north-1` | [arn:aws-aws-cn:lambda:cn-north-1:498634801083:layer:AWSLambdaPowertoolsTypeScriptV2:35](#){: .copyMe} | +| `us-east-1` | [arn:aws:lambda:us-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `us-east-2` | [arn:aws:lambda:us-east-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `us-west-1` | [arn:aws:lambda:us-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `us-west-2` | [arn:aws:lambda:us-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `ap-south-1` | [arn:aws:lambda:ap-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `ap-south-2` | [arn:aws:lambda:ap-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `ap-east-1` | [arn:aws:lambda:ap-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `ap-northeast-1` | [arn:aws:lambda:ap-northeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `ap-northeast-2` | [arn:aws:lambda:ap-northeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `ap-northeast-3` | [arn:aws:lambda:ap-northeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `ap-southeast-1` | [arn:aws:lambda:ap-southeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `ap-southeast-2` | [arn:aws:lambda:ap-southeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `ap-southeast-3` | [arn:aws:lambda:ap-southeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `ap-southeast-4` | [arn:aws:lambda:ap-southeast-4:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `ap-southeast-5` | [arn:aws:lambda:ap-southeast-5:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `ap-southeast-7` | [arn:aws:lambda:ap-southeast-7:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `eu-central-1` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `eu-central-2` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `eu-west-1` | [arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `eu-west-2` | [arn:aws:lambda:eu-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `eu-west-3` | [arn:aws:lambda:eu-west-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `eu-north-1` | [arn:aws:lambda:eu-north-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `eu-south-1` | [arn:aws:lambda:eu-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `eu-south-2` | [arn:aws:lambda:eu-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `ca-central-1` | [arn:aws:lambda:ca-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `ca-west-1` | [arn:aws:lambda:ca-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `sa-east-1` | [arn:aws:lambda:sa-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `af-south-1` | [arn:aws:lambda:af-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `me-south-1` | [arn:aws:lambda:me-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `me-central-1` | [arn:aws:lambda:me-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `il-central-1` | [arn:aws:lambda:il-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `mx-central-1` | [arn:aws:lambda:mx-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `us-gov-west-1` | [arn:aws-us-gov:lambda:us-gov-west-1:165093116878:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `us-gov-east-1` | [arn:aws-us-gov:lambda:us-gov-east-1:165087284144:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `cn-north-1` | [arn:aws-aws-cn:lambda:cn-north-1:498634801083:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | ### Lookup Layer ARN via AWS SSM Parameter Store @@ -71,7 +71,7 @@ Parameter: LastModifiedDate: '2025-02-11T11:08:45.070000+01:00' Name: /aws/service/powertools/typescript/generic/all/2.14.0 Type: String - Value: arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35 + Value: arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36 Version: 1 ``` @@ -91,7 +91,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi === "AWS CLI command to download Lambda Layer content" ```bash - aws lambda get-layer-version-by-arn --arn arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35 --region {aws::region} + aws lambda get-layer-version-by-arn --arn arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36 --region {aws::region} ``` === "AWS CLI output" @@ -104,7 +104,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi "CodeSize": 3548324 }, "LayerArn": "arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2", - "LayerVersionArn": "arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35", + "LayerVersionArn": "arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36", "Description": "Powertools for AWS Lambda (TypeScript) version 2.18.0", "CreatedDate": "2025-04-08T07:38:30.424+0000", "Version": 24, @@ -138,7 +138,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi const powertoolsLayer = LayerVersion.fromLayerVersionArn( this, 'PowertoolsLayer', - `arn:aws:lambda:${Stack.of(this).region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35` + `arn:aws:lambda:${Stack.of(this).region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36` ); new NodejsFunction(this, 'Function', { @@ -208,7 +208,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi Type: AWS::Serverless::Function Properties: Layers: - - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35 + - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36 ``` You can also use AWS SSM Parameter Store to dynamically add Powertools for AWS Lambda and resolve the Layer ARN from SSM Parameter Store in your code, allowing you to pin to `latest` or a specific Powertools for AWS Lambda version. @@ -247,7 +247,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi hello: handler: lambda_function.lambda_handler layers: - - arn:aws:lambda:${aws:region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35 + - arn:aws:lambda:${aws:region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36 ``` If you use `esbuild` to bundle your code, make sure to exclude `@aws-lambda-powertools/*` and `@aws-sdk/*` from being bundled since the packages are already present the layer: @@ -282,7 +282,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi role = ... handler = "index.handler" runtime = "nodejs22.x" - layers = ["arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35"] + layers = ["arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36"] source_code_hash = filebase64sha256("lambda_function_payload.zip") } ``` @@ -317,7 +317,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi const lambdaFunction = new aws.lambda.Function('function', { layers: [ - pulumi.interpolate`arn:aws:lambda:${aws.getRegionOutput().name}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35` + pulumi.interpolate`arn:aws:lambda:${aws.getRegionOutput().name}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36` ], code: new pulumi.asset.FileArchive('lambda_function_payload.zip'), tracingConfig: { @@ -341,7 +341,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi name: "my-function", layers: { "@aws-lambda-powertools/*": - "arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35", + "arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36", }, }); ``` diff --git a/examples/app/cdk/example-stack.ts b/examples/app/cdk/example-stack.ts index 043fc1fa39..841982cf11 100644 --- a/examples/app/cdk/example-stack.ts +++ b/examples/app/cdk/example-stack.ts @@ -39,7 +39,7 @@ export class PowertoolsExampleStack extends Stack { 'powertools-layer', `arn:aws:lambda:${ Stack.of(this).region - }:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35` + }:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36` ); // Items table diff --git a/examples/app/template.yaml b/examples/app/template.yaml index e4e4f9dd82..e65e5b910d 100644 --- a/examples/app/template.yaml +++ b/examples/app/template.yaml @@ -130,7 +130,7 @@ Resources: - DynamoDBReadPolicy: TableName: !Ref itemsTable Layers: - - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:35 + - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36 Environment: Variables: TABLE_NAME: !Ref itemsTable From cc233677d52f92eca40ee98ffa26abb308a85e08 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Sep 2025 11:34:16 +0200 Subject: [PATCH 145/255] chore(deps): bump actions/github-script from 7.0.1 to 8.0.0 (#4432) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi --- .github/workflows/on_merged_pr.yml | 2 +- .github/workflows/post-release.yml | 2 +- .github/workflows/record_pr.yml | 2 +- .github/workflows/reusable_export_pr_details.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/on_merged_pr.yml b/.github/workflows/on_merged_pr.yml index 9ae7ddb019..dfc3b24cbc 100644 --- a/.github/workflows/on_merged_pr.yml +++ b/.github/workflows/on_merged_pr.yml @@ -51,7 +51,7 @@ jobs: steps: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: "Label PR related issue for release" - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 env: PR_NUMBER: ${{ needs.get_pr_details.outputs.prNumber }} PR_BODY: ${{ needs.get_pr_details.outputs.prBody }} diff --git a/.github/workflows/post-release.yml b/.github/workflows/post-release.yml index 9758fca5a5..562985645b 100644 --- a/.github/workflows/post-release.yml +++ b/.github/workflows/post-release.yml @@ -37,7 +37,7 @@ jobs: fi echo "RELEASE_VERSION=$RELEASE_VERSION" >> $GITHUB_ENV - name: Update issues related to release - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | diff --git a/.github/workflows/record_pr.yml b/.github/workflows/record_pr.yml index d7c8a5a808..9e5863d35f 100644 --- a/.github/workflows/record_pr.yml +++ b/.github/workflows/record_pr.yml @@ -48,7 +48,7 @@ jobs: steps: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: "Extract PR details" - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: script: | const script = require('.github/scripts/save_pr_details.js') diff --git a/.github/workflows/reusable_export_pr_details.yml b/.github/workflows/reusable_export_pr_details.yml index 13500f4403..67e978f5c5 100644 --- a/.github/workflows/reusable_export_pr_details.yml +++ b/.github/workflows/reusable_export_pr_details.yml @@ -77,7 +77,7 @@ jobs: - name: Checkout repository # in case caller workflow doesn't checkout thus failing with file not found uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: "Download previously saved PR" - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 env: WORKFLOW_ID: ${{ inputs.record_pr_workflow_id }} # For security, we only download artifacts tied to the successful PR recording workflow From dc7c65420d2425c804c0f85de0712b0785bd7eb2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Sep 2025 14:33:30 +0100 Subject: [PATCH 146/255] chore(deps-dev): bump zod from 4.1.7 to 4.1.8 (#4473) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/snippets/package.json | 2 +- package-lock.json | 72 +++++++++++++++++----------------- packages/kafka/package.json | 2 +- packages/parser/package.json | 2 +- 4 files changed, 39 insertions(+), 39 deletions(-) diff --git a/examples/snippets/package.json b/examples/snippets/package.json index 30c18763d8..5e64b613eb 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -43,7 +43,7 @@ "@valkey/valkey-glide": "^2.0.1", "aws-sdk": "^2.1692.0", "aws-sdk-client-mock": "^4.1.0", - "zod": "^4.1.7" + "zod": "^4.1.8" }, "dependencies": { "arktype": "^2.1.22", diff --git a/package-lock.json b/package-lock.json index 82ea21ec14..3ec8c627f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,12 +50,12 @@ "version": "2.26.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/batch": "^2.25.2", - "@aws-lambda-powertools/idempotency": "^2.25.2", - "@aws-lambda-powertools/logger": "^2.25.2", - "@aws-lambda-powertools/metrics": "^2.25.2", - "@aws-lambda-powertools/parameters": "^2.25.2", - "@aws-lambda-powertools/tracer": "^2.25.2", + "@aws-lambda-powertools/batch": "^2.26.0", + "@aws-lambda-powertools/idempotency": "^2.26.0", + "@aws-lambda-powertools/logger": "^2.26.0", + "@aws-lambda-powertools/metrics": "^2.26.0", + "@aws-lambda-powertools/parameters": "^2.26.0", + "@aws-lambda-powertools/tracer": "^2.26.0", "@aws-sdk/client-ssm": "^3.883.0", "@aws-sdk/lib-dynamodb": "^3.883.0", "@middy/core": "^4.7.0", @@ -86,15 +86,15 @@ "valibot": "^1.1.0" }, "devDependencies": { - "@aws-lambda-powertools/batch": "^2.25.2", - "@aws-lambda-powertools/event-handler": "^2.25.2", - "@aws-lambda-powertools/idempotency": "^2.25.2", - "@aws-lambda-powertools/jmespath": "^2.25.2", - "@aws-lambda-powertools/logger": "^2.25.2", - "@aws-lambda-powertools/metrics": "^2.25.2", - "@aws-lambda-powertools/parameters": "^2.25.2", - "@aws-lambda-powertools/parser": "^2.25.2", - "@aws-lambda-powertools/tracer": "^2.25.2", + "@aws-lambda-powertools/batch": "^2.26.0", + "@aws-lambda-powertools/event-handler": "^2.26.0", + "@aws-lambda-powertools/idempotency": "^2.26.0", + "@aws-lambda-powertools/jmespath": "^2.26.0", + "@aws-lambda-powertools/logger": "^2.26.0", + "@aws-lambda-powertools/metrics": "^2.26.0", + "@aws-lambda-powertools/parameters": "^2.26.0", + "@aws-lambda-powertools/parser": "^2.26.0", + "@aws-lambda-powertools/tracer": "^2.26.0", "@aws-sdk/client-appconfigdata": "^3.883.0", "@aws-sdk/client-dynamodb": "^3.883.0", "@aws-sdk/client-secrets-manager": "^3.883.0", @@ -105,7 +105,7 @@ "@valkey/valkey-glide": "^2.0.1", "aws-sdk": "^2.1692.0", "aws-sdk-client-mock": "^4.1.0", - "zod": "^4.1.7" + "zod": "^4.1.8" } }, "examples/snippets/node_modules/@valkey/valkey-glide": { @@ -131,7 +131,7 @@ } }, "layers": { - "version": "2.25.2", + "version": "2.26.0", "license": "MIT-0", "dependencies": { "aws-cdk": "^2.1027.0", @@ -10729,9 +10729,9 @@ } }, "node_modules/zod": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.7.tgz", - "integrity": "sha512-6qi6UYyzAl7W9uV29KvcSFXqK4QCYNYUz2YASPNBWpJE1RY6R1nArmmFPgGY/CBYWzpeMw3EOER+DR9a05O4IA==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.8.tgz", + "integrity": "sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ==", "dev": true, "license": "MIT", "funding": { @@ -10743,7 +10743,7 @@ "version": "2.26.0", "license": "MIT-0", "devDependencies": { - "@aws-lambda-powertools/parser": "2.25.2", + "@aws-lambda-powertools/parser": "2.26.0", "@aws-lambda-powertools/testing-utils": "file:../testing" } }, @@ -10760,7 +10760,7 @@ "version": "2.26.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.25.2" + "@aws-lambda-powertools/commons": "2.26.0" } }, "packages/idempotency": { @@ -10768,8 +10768,8 @@ "version": "2.26.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.25.2", - "@aws-lambda-powertools/jmespath": "2.25.2" + "@aws-lambda-powertools/commons": "2.26.0", + "@aws-lambda-powertools/jmespath": "2.26.0" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", @@ -10807,7 +10807,7 @@ "version": "2.26.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.25.2" + "@aws-lambda-powertools/commons": "2.26.0" } }, "packages/kafka": { @@ -10815,13 +10815,13 @@ "version": "2.26.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.25.2", + "@aws-lambda-powertools/commons": "2.26.0", "@standard-schema/spec": "^1.0.0" }, "devDependencies": { "avro-js": "^1.12.0", "protobufjs": "^7.5.4", - "zod": "^4.1.7" + "zod": "^4.1.8" }, "peerDependencies": { "arktype": ">=2.0.0", @@ -10845,7 +10845,7 @@ "version": "2.26.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.25.2", + "@aws-lambda-powertools/commons": "2.26.0", "lodash.merge": "^4.6.2" }, "devDependencies": { @@ -10853,7 +10853,7 @@ "@types/lodash.merge": "^4.6.9" }, "peerDependencies": { - "@aws-lambda-powertools/jmespath": "2.25.2", + "@aws-lambda-powertools/jmespath": "2.26.0", "@middy/core": "4.x || 5.x || 6.x" }, "peerDependenciesMeta": { @@ -10870,7 +10870,7 @@ "version": "2.26.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.25.2" + "@aws-lambda-powertools/commons": "2.26.0" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", @@ -10892,7 +10892,7 @@ "version": "2.26.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.25.2" + "@aws-lambda-powertools/commons": "2.26.0" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", @@ -10938,11 +10938,11 @@ "version": "2.26.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.25.2", + "@aws-lambda-powertools/commons": "2.26.0", "@standard-schema/spec": "^1.0.0" }, "devDependencies": { - "zod": "^4.1.7" + "zod": "^4.1.8" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x", @@ -10979,7 +10979,7 @@ "version": "2.26.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.25.2", + "@aws-lambda-powertools/commons": "2.26.0", "aws-xray-sdk-core": "^3.10.3" }, "devDependencies": { @@ -11001,8 +11001,8 @@ "version": "2.26.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.25.2", - "@aws-lambda-powertools/jmespath": "2.25.2", + "@aws-lambda-powertools/commons": "2.26.0", + "@aws-lambda-powertools/jmespath": "2.26.0", "ajv": "^8.17.1" } } diff --git a/packages/kafka/package.json b/packages/kafka/package.json index b5c22afd7e..95091dc5e1 100644 --- a/packages/kafka/package.json +++ b/packages/kafka/package.json @@ -116,6 +116,6 @@ "devDependencies": { "avro-js": "^1.12.0", "protobufjs": "^7.5.4", - "zod": "^4.1.7" + "zod": "^4.1.8" } } diff --git a/packages/parser/package.json b/packages/parser/package.json index d67d7afdfb..c3c8572fd5 100644 --- a/packages/parser/package.json +++ b/packages/parser/package.json @@ -215,6 +215,6 @@ } }, "devDependencies": { - "zod": "^4.1.7" + "zod": "^4.1.8" } } From 4fed581462b22c1a4210efc3f3d7a713ad390c84 Mon Sep 17 00:00:00 2001 From: Swopnil Dangol Date: Fri, 12 Sep 2025 15:26:36 +0100 Subject: [PATCH 147/255] docs(batch): added documentation for the parser integration feature in batch processor (#4435) Co-authored-by: Stefano Vozza Co-authored-by: Andrea Amorosi --- docs/features/batch.md | 219 +++++++++--------- .../batch/advanced_parser_DynamoDB.ts | 44 ++++ .../snippets/batch/advanced_parser_Kinesis.ts | 54 +++++ .../batch/advanced_parser_item_sqs.ts | 35 +++ .../snippets/batch/advanced_parser_sqs.ts | 38 +++ .../batch/diagrams/batch_processing.mermaid | 21 ++ .../snippets/batch/diagrams/journey.mermaid | 5 + examples/snippets/batch/diagrams/sqs.mermaid | 13 ++ .../snippets/batch/diagrams/sqs_fifo.mermaid | 16 ++ .../diagrams/sqs_fifo_skip_group.mermaid | 17 ++ .../snippets/batch/diagrams/streams.mermaid | 17 ++ .../streams_multiple_failures.mermaid | 17 ++ .../snippets/batch/samples/parser_SQS.json | 36 +++ packages/batch/src/BatchProcessor.ts | 34 +++ packages/batch/src/index.ts | 1 + packages/batch/src/types.ts | 142 +++++++++++- packages/batch/typedoc.json | 2 +- 17 files changed, 593 insertions(+), 118 deletions(-) create mode 100644 examples/snippets/batch/advanced_parser_DynamoDB.ts create mode 100644 examples/snippets/batch/advanced_parser_Kinesis.ts create mode 100644 examples/snippets/batch/advanced_parser_item_sqs.ts create mode 100644 examples/snippets/batch/advanced_parser_sqs.ts create mode 100644 examples/snippets/batch/diagrams/batch_processing.mermaid create mode 100644 examples/snippets/batch/diagrams/journey.mermaid create mode 100644 examples/snippets/batch/diagrams/sqs.mermaid create mode 100644 examples/snippets/batch/diagrams/sqs_fifo.mermaid create mode 100644 examples/snippets/batch/diagrams/sqs_fifo_skip_group.mermaid create mode 100644 examples/snippets/batch/diagrams/streams.mermaid create mode 100644 examples/snippets/batch/diagrams/streams_multiple_failures.mermaid create mode 100644 examples/snippets/batch/samples/parser_SQS.json diff --git a/docs/features/batch.md b/docs/features/batch.md index ab0d81b568..7c5de6d3da 100644 --- a/docs/features/batch.md +++ b/docs/features/batch.md @@ -6,27 +6,7 @@ description: Utility The batch processing utility handles partial failures when processing batches from Amazon SQS, Amazon Kinesis Data Streams, and Amazon DynamoDB Streams. ```mermaid -stateDiagram-v2 - direction LR - BatchSource: Amazon SQS

Amazon Kinesis Data Streams

Amazon DynamoDB Streams

- LambdaInit: Lambda invocation - BatchProcessor: Batch Processor - RecordHandler: Record Handler function - YourLogic: Your logic to process each batch item - LambdaResponse: Lambda response - - BatchSource --> LambdaInit - - LambdaInit --> BatchProcessor - BatchProcessor --> RecordHandler - - state BatchProcessor { - [*] --> RecordHandler: Your function - RecordHandler --> YourLogic - } - - RecordHandler --> BatchProcessor: Collect results - BatchProcessor --> LambdaResponse: Report items that failed processing +--8<-- "examples/snippets/batch/diagrams/batch_processing.mermaid" ``` ## Key features @@ -42,17 +22,13 @@ When using SQS, Kinesis Data Streams, or DynamoDB Streams as a Lambda event sour If your function fails to process any message from the batch, the entire batch returns to your queue or stream. This same batch is then retried until either condition happens first: **a)** your Lambda function returns a successful response, **b)** record reaches maximum retry attempts, or **c)** when records expire. ```mermaid -journey - section Conditions - Successful response: 5: Success - Maximum retries: 3: Failure - Records expired: 1: Failure +--8<-- "examples/snippets/batch/diagrams/journey.mermaid" ``` This behavior changes when you enable the [ReportBatchItemFailures feature](https://docs.aws.amazon.com/lambda/latest/dg/services-sqs-errorhandling.html#services-sqs-batchfailurereporting) in your Lambda function event source configuration: * [**SQS queues**](#sqs-standard). Only messages reported as failure will return to the queue for a retry, while successful ones will be deleted. -* [**Kinesis data streams**](#kinesis-and-dynamodb-streams) and [**DynamoDB streams**](#kinesis-and-dynamodb-streams). Single reported failure will use its sequence number as the stream checkpoint. Multiple reported failures will use the lowest sequence number as checkpoint. +* [**Kinesis data streams**](#kinesis-and-dynamodb-streams) and [**DynamoDB streams**](#kinesis-and-dynamodb-streams). Single reported failure will use its sequence number as the stream checkpoint. Multiple reported failures will use the lowest sequence number as the checkpoint. @@ -237,7 +213,7 @@ By default, we catch any exception raised by your record handler function. This 1. Any exception works here. See [extending `BatchProcessor` section, if you want to override this behavior.](#extending-batchprocessor) - 2. Exceptions raised in `recordHandler` will propagate to `process_partial_response`.

We catch them and include each failed batch item identifier in the response dictionary (see `Sample response` tab). + 2. Errors raised in `recordHandler` will propagate to `processPartialResponse`.

We catch them and include each failed batch item identifier in the response object (see `Sample response` tab). === "Sample response" @@ -263,19 +239,7 @@ Sequence diagram to explain how [`BatchProcessor` works](#processing-messages-fr
```mermaid -sequenceDiagram - autonumber - participant SQS queue - participant Lambda service - participant Lambda function - Lambda service->>SQS queue: Poll - Lambda service->>Lambda function: Invoke (batch event) - Lambda function->>Lambda service: Report some failed messages - activate SQS queue - Lambda service->>SQS queue: Delete successful messages - SQS queue-->>SQS queue: Failed messages return - Note over SQS queue,Lambda service: Process repeat - deactivate SQS queue +--8<-- "examples/snippets/batch/diagrams/sqs.mermaid" ``` SQS mechanism with Batch Item Failures
@@ -288,22 +252,7 @@ Sequence diagram to explain how [`SqsFifoPartialProcessor` works](#fifo-queues)
```mermaid -sequenceDiagram - autonumber - participant SQS queue - participant Lambda service - participant Lambda function - Lambda service->>SQS queue: Poll - Lambda service->>Lambda function: Invoke (batch event) - activate Lambda function - Lambda function-->Lambda function: Process 2 out of 10 batch items - Lambda function--xLambda function: Fail on 3rd batch item - Lambda function->>Lambda service: Report 3rd batch item and unprocessed messages as failure - deactivate Lambda function - activate SQS queue - Lambda service->>SQS queue: Delete successful messages (1-2) - SQS queue-->>SQS queue: Failed messages return (3-10) - deactivate SQS queue +--8<-- "examples/snippets/batch/diagrams/sqs_fifo.mermaid" ``` SQS FIFO mechanism with Batch Item Failures
@@ -312,23 +261,7 @@ Sequence diagram to explain how [`SqsFifoPartialProcessor` works](#fifo-queues)
```mermaid -sequenceDiagram - autonumber - participant SQS queue - participant Lambda service - participant Lambda function - Lambda service->>SQS queue: Poll - Lambda service->>Lambda function: Invoke (batch event) - activate Lambda function - Lambda function-->Lambda function: Process 2 out of 10 batch items - Lambda function--xLambda function: Fail on 3rd batch item - Lambda function-->Lambda function: Process messages from another MessageGroupID - Lambda function->>Lambda service: Report 3rd batch item and all messages within the same MessageGroupID as failure - deactivate Lambda function - activate SQS queue - Lambda service->>SQS queue: Delete successful messages processed - SQS queue-->>SQS queue: Failed messages return - deactivate SQS queue +--8<-- "examples/snippets/batch/diagrams/sqs_fifo_skip_group.mermaid" ``` SQS FIFO mechanism with Batch Item Failures
@@ -343,23 +276,7 @@ For brevity, we will use `Streams` to refer to either services. For theory on st
```mermaid -sequenceDiagram - autonumber - participant Streams - participant Lambda service - participant Lambda function - Lambda service->>Streams: Poll latest records - Lambda service->>Lambda function: Invoke (batch event) - activate Lambda function - Lambda function-->Lambda function: Process 2 out of 10 batch items - Lambda function--xLambda function: Fail on 3rd batch item - Lambda function-->Lambda function: Continue processing batch items (4-10) - Lambda function->>Lambda service: Report batch item as failure (3) - deactivate Lambda function - activate Streams - Lambda service->>Streams: Checkpoints to sequence number from 3rd batch item - Lambda service->>Streams: Poll records starting from updated checkpoint - deactivate Streams +--8<-- "examples/snippets/batch/diagrams/streams.mermaid" ``` Kinesis and DynamoDB streams mechanism with single batch item failure
@@ -370,29 +287,115 @@ The behavior changes slightly when there are multiple item failures. Stream chec
```mermaid -sequenceDiagram - autonumber - participant Streams - participant Lambda service - participant Lambda function - Lambda service->>Streams: Poll latest records - Lambda service->>Lambda function: Invoke (batch event) - activate Lambda function - Lambda function-->Lambda function: Process 2 out of 10 batch items - Lambda function--xLambda function: Fail on 3-5 batch items - Lambda function-->Lambda function: Continue processing batch items (6-10) - Lambda function->>Lambda service: Report batch items as failure (3-5) - deactivate Lambda function - activate Streams - Lambda service->>Streams: Checkpoints to lowest sequence number - Lambda service->>Streams: Poll records starting from updated checkpoint - deactivate Streams +--8<-- "examples/snippets/batch/diagrams/streams_multiple_failures.mermaid" ``` Kinesis and DynamoDB streams mechanism with multiple batch item failures
## Advanced +### Parser integration + +The Batch Processing utility integrates with the [Parser utility](./parser.md) to automatically validate and parse each batch record before processing. This ensures your record handler receives properly typed and validated data, eliminating the need for manual parsing and validation. + +To enable parser integration, import the `parser` function from `@aws-lambda-powertools/batch/parser` and pass it along with a schema when instantiating the `BatchProcessor`. This requires you to also [install the Parser utility](./parser.md#getting-started). + +```typescript +import { parser } from '@aws-lambda-powertools/batch/parser'; +``` + +You have two approaches for schema validation: + +1. **Item schema only** (`innerSchema`) - Focus on your payload schema, we handle extending the base event structure +2. **Full event schema** (`schema`) - Validate the entire event record structure with complete control + +#### Benefits of parser integration + +Parser integration eliminates runtime errors from malformed data and provides compile-time type safety, making your code more reliable and easier to maintain. Invalid records are automatically marked as failed and won't reach your handler, reducing defensive coding. + +=== "Without parser integration" + + ```typescript + const recordHandler = async (record: SQSRecord) => { + // Manual parsing with no type safety + const payload = JSON.parse(record.body); // any type + console.log(payload.name); // No autocomplete, runtime errors possible + }; + ``` + +=== "With parser integration" + + ```typescript + const mySchema = z.object({ name: z.string(), age: z.number() }); + + const recordHandler = async (record: ParsedRecord>) => { + // Automatic validation and strong typing + console.log(record.body.name); // Full type safety and autocomplete + }; + ``` + +#### Using item schema only + +When you want to focus on validating your payload without dealing with the full event structure, use `innerSchema`. We automatically extend the base event schema for you, reducing boilerplate code while still validating the entire record. + +Available transformers by event type: + +| Event Type | Base Schema | Available Transformers | When to use transformer | +|------------|---------------------------|------------------------------|----------------------------------------------------------------| +| SQS | `SqsRecordSchema` | `json`, `base64` | `json` for stringified JSON, `base64` for encoded data | +| Kinesis | `KinesisDataStreamRecord` | `base64` | Required for Kinesis data (always base64 encoded) | +| DynamoDB | `DynamoDBStreamRecord` | `unmarshall` | Required to convert DynamoDB attribute values to plain objects | + +=== "SQS with JSON payload" + + ```typescript hl_lines="6 12-15 19-21 27-28" + --8<-- "examples/snippets/batch/advanced_parser_item_sqs.ts" + ``` + +=== "Sample Event" + + ```json hl_lines="6 22" + --8<-- "examples/snippets/batch/samples/parser_SQS.json" + ``` + +#### Using full event schema + +For complete control over validation, extend the built-in schemas with your custom payload schema. This approach gives you full control over the entire event structure. + +=== "SQS" + + ```typescript hl_lines="6 15-17 22-24 30-31" + --8<-- "examples/snippets/batch/advanced_parser_sqs.ts" + ``` + +=== "Kinesis Data Streams" + + ```typescript hl_lines="6 18-23 28-32 39 41-44" + --8<-- "examples/snippets/batch/advanced_parser_Kinesis.ts" + ``` + +=== "DynamoDB Streams" + + ```typescript hl_lines="6 17-19 24-28 35 37" + --8<-- "examples/snippets/batch/advanced_parser_DynamoDB.ts" + ``` + +#### Typed record handlers with ParsedRecord + +To get full type safety in your record handlers, use the `ParsedRecord` utility type: + +```typescript +import type { ParsedRecord } from '@aws-lambda-powertools/batch'; + +// For most cases - single schema +type MyRecord = ParsedRecord>; + +// For DynamoDB - separate schemas for NewImage and OldImage +type MyDynamoRecord = ParsedRecord, z.infer>; +``` + +This eliminates verbose type annotations and provides clean autocompletion for your parsed data. + ### Accessing processed messages Use the `BatchProcessor` directly in your function to access a list of all returned values from your `recordHandler` function. diff --git a/examples/snippets/batch/advanced_parser_DynamoDB.ts b/examples/snippets/batch/advanced_parser_DynamoDB.ts new file mode 100644 index 0000000000..738e2feaea --- /dev/null +++ b/examples/snippets/batch/advanced_parser_DynamoDB.ts @@ -0,0 +1,44 @@ +import { + BatchProcessor, + EventType, + processPartialResponse, +} from '@aws-lambda-powertools/batch'; +import { parser } from '@aws-lambda-powertools/batch/parser'; +import type { ParsedRecord } from '@aws-lambda-powertools/batch/types'; +import { Logger } from '@aws-lambda-powertools/logger'; +import { DynamoDBMarshalled } from '@aws-lambda-powertools/parser/helpers/dynamodb'; +import { + DynamoDBStreamChangeRecordBase, + DynamoDBStreamRecord, +} from '@aws-lambda-powertools/parser/schemas/dynamodb'; +import type { DynamoDBRecord, DynamoDBStreamHandler } from 'aws-lambda'; +import { z } from 'zod'; + +const myItemSchema = DynamoDBMarshalled( + z.object({ name: z.string(), age: z.number() }) +); + +const logger = new Logger(); +const processor = new BatchProcessor(EventType.SQS, { + parser, + schema: DynamoDBStreamRecord.extend({ + dynamodb: DynamoDBStreamChangeRecordBase.extend({ + NewImage: myItemSchema, + }), + }), + logger, +}); + +const recordHandler = async ({ + eventID, + dynamodb: { + NewImage: { name, age }, + }, +}: ParsedRecord>) => { + logger.info(`Processing record ${eventID}`, { name, age }); +}; + +export const handler: DynamoDBStreamHandler = async (event, context) => + processPartialResponse(event, recordHandler, processor, { + context, + }); diff --git a/examples/snippets/batch/advanced_parser_Kinesis.ts b/examples/snippets/batch/advanced_parser_Kinesis.ts new file mode 100644 index 0000000000..bd71918eb6 --- /dev/null +++ b/examples/snippets/batch/advanced_parser_Kinesis.ts @@ -0,0 +1,54 @@ +import { + BatchProcessor, + EventType, + processPartialResponse, +} from '@aws-lambda-powertools/batch'; +import { parser } from '@aws-lambda-powertools/batch/parser'; +import type { ParsedRecord } from '@aws-lambda-powertools/batch/types'; +import { Logger } from '@aws-lambda-powertools/logger'; +import { Base64Encoded } from '@aws-lambda-powertools/parser/helpers'; +import { + KinesisDataStreamRecord, + KinesisDataStreamRecordPayload, +} from '@aws-lambda-powertools/parser/schemas/kinesis'; +import type { KinesisDataStreamRecordEvent } from '@aws-lambda-powertools/parser/types'; +import type { KinesisStreamHandler } from 'aws-lambda'; +import { z } from 'zod'; + +const myItemSchema = Base64Encoded( + z.object({ + name: z.string(), + age: z.number(), + }) +); + +const logger = new Logger(); +const processor = new BatchProcessor(EventType.KinesisDataStreams, { + parser, + schema: KinesisDataStreamRecord.extend({ + kinesis: KinesisDataStreamRecordPayload.extend({ + data: myItemSchema, + }), + }), + logger, +}); + +const recordHandler = async ({ + kinesis: { + sequenceNumber, + data: { name, age }, + }, +}: ParsedRecord< + KinesisDataStreamRecordEvent, + z.infer +>) => { + logger.info(`Processing record: ${sequenceNumber}`, { + name, + age, + }); +}; + +export const handler: KinesisStreamHandler = async (event, context) => + processPartialResponse(event, recordHandler, processor, { + context, + }); diff --git a/examples/snippets/batch/advanced_parser_item_sqs.ts b/examples/snippets/batch/advanced_parser_item_sqs.ts new file mode 100644 index 0000000000..982280a43d --- /dev/null +++ b/examples/snippets/batch/advanced_parser_item_sqs.ts @@ -0,0 +1,35 @@ +import { + BatchProcessor, + EventType, + processPartialResponse, +} from '@aws-lambda-powertools/batch'; +import { parser } from '@aws-lambda-powertools/batch/parser'; +import type { ParsedRecord } from '@aws-lambda-powertools/batch/types'; +import { Logger } from '@aws-lambda-powertools/logger'; +import type { SQSHandler, SQSRecord } from 'aws-lambda'; +import { z } from 'zod'; + +const myItemSchema = z.object({ + name: z.string(), + age: z.number(), +}); + +const logger = new Logger(); +const processor = new BatchProcessor(EventType.SQS, { + parser, + innerSchema: myItemSchema, + transformer: 'json', + logger, +}); + +const recordHandler = async ({ + messageId, + body: { name, age }, +}: ParsedRecord>) => { + logger.info(`Processing record ${messageId}`, { name, age }); +}; + +export const handler: SQSHandler = async (event, context) => + processPartialResponse(event, recordHandler, processor, { + context, + }); diff --git a/examples/snippets/batch/advanced_parser_sqs.ts b/examples/snippets/batch/advanced_parser_sqs.ts new file mode 100644 index 0000000000..8caee32588 --- /dev/null +++ b/examples/snippets/batch/advanced_parser_sqs.ts @@ -0,0 +1,38 @@ +import { + BatchProcessor, + EventType, + processPartialResponse, +} from '@aws-lambda-powertools/batch'; +import { parser } from '@aws-lambda-powertools/batch/parser'; +import type { ParsedRecord } from '@aws-lambda-powertools/batch/types'; +import { Logger } from '@aws-lambda-powertools/logger'; +import { JSONStringified } from '@aws-lambda-powertools/parser/helpers'; +import { SqsRecordSchema } from '@aws-lambda-powertools/parser/schemas'; +import type { SqsRecord } from '@aws-lambda-powertools/parser/types'; +import type { SQSHandler } from 'aws-lambda'; +import { z } from 'zod'; + +const myItemSchema = JSONStringified( + z.object({ name: z.string(), age: z.number() }) +); + +const logger = new Logger(); +const processor = new BatchProcessor(EventType.SQS, { + parser, + schema: SqsRecordSchema.extend({ + body: myItemSchema, + }), + logger, +}); + +const recordHandler = async ({ + messageId, + body: { name, age }, +}: ParsedRecord>) => { + logger.info(`Processing record ${messageId}`, { name, age }); +}; + +export const handler: SQSHandler = async (event, context) => + processPartialResponse(event, recordHandler, processor, { + context, + }); diff --git a/examples/snippets/batch/diagrams/batch_processing.mermaid b/examples/snippets/batch/diagrams/batch_processing.mermaid new file mode 100644 index 0000000000..ad978a0649 --- /dev/null +++ b/examples/snippets/batch/diagrams/batch_processing.mermaid @@ -0,0 +1,21 @@ +stateDiagram-v2 + direction LR + BatchSource: Amazon SQS

Amazon Kinesis Data Streams

Amazon DynamoDB Streams

+ LambdaInit: Lambda invocation + BatchProcessor: Batch Processor + RecordHandler: Record Handler function + YourLogic: Your logic to process each batch item + LambdaResponse: Lambda response + + BatchSource --> LambdaInit + + LambdaInit --> BatchProcessor + BatchProcessor --> RecordHandler + + state BatchProcessor { + [*] --> RecordHandler: Your function + RecordHandler --> YourLogic + } + + RecordHandler --> BatchProcessor: Collect results + BatchProcessor --> LambdaResponse: Report items that failed processing \ No newline at end of file diff --git a/examples/snippets/batch/diagrams/journey.mermaid b/examples/snippets/batch/diagrams/journey.mermaid new file mode 100644 index 0000000000..a6b3bc95e8 --- /dev/null +++ b/examples/snippets/batch/diagrams/journey.mermaid @@ -0,0 +1,5 @@ +journey + section Conditions + Successful response: 5: Success + Maximum retries: 3: Failure + Records expired: 1: Failure \ No newline at end of file diff --git a/examples/snippets/batch/diagrams/sqs.mermaid b/examples/snippets/batch/diagrams/sqs.mermaid new file mode 100644 index 0000000000..a728bd37b2 --- /dev/null +++ b/examples/snippets/batch/diagrams/sqs.mermaid @@ -0,0 +1,13 @@ +sequenceDiagram + autonumber + participant SQS queue + participant Lambda service + participant Lambda function + Lambda service->>SQS queue: Poll + Lambda service->>Lambda function: Invoke (batch event) + Lambda function->>Lambda service: Report some failed messages + activate SQS queue + Lambda service->>SQS queue: Delete successful messages + SQS queue-->>SQS queue: Failed messages return + Note over SQS queue,Lambda service: Process repeat + deactivate SQS queue \ No newline at end of file diff --git a/examples/snippets/batch/diagrams/sqs_fifo.mermaid b/examples/snippets/batch/diagrams/sqs_fifo.mermaid new file mode 100644 index 0000000000..e5151ceb19 --- /dev/null +++ b/examples/snippets/batch/diagrams/sqs_fifo.mermaid @@ -0,0 +1,16 @@ +sequenceDiagram + autonumber + participant SQS queue + participant Lambda service + participant Lambda function + Lambda service->>SQS queue: Poll + Lambda service->>Lambda function: Invoke (batch event) + activate Lambda function + Lambda function-->Lambda function: Process 2 out of 10 batch items + Lambda function--xLambda function: Fail on 3rd batch item + Lambda function->>Lambda service: Report 3rd batch item and unprocessed messages as failure + deactivate Lambda function + activate SQS queue + Lambda service->>SQS queue: Delete successful messages (1-2) + SQS queue-->>SQS queue: Failed messages return (3-10) + deactivate SQS queue \ No newline at end of file diff --git a/examples/snippets/batch/diagrams/sqs_fifo_skip_group.mermaid b/examples/snippets/batch/diagrams/sqs_fifo_skip_group.mermaid new file mode 100644 index 0000000000..729f47914e --- /dev/null +++ b/examples/snippets/batch/diagrams/sqs_fifo_skip_group.mermaid @@ -0,0 +1,17 @@ +sequenceDiagram + autonumber + participant SQS queue + participant Lambda service + participant Lambda function + Lambda service->>SQS queue: Poll + Lambda service->>Lambda function: Invoke (batch event) + activate Lambda function + Lambda function-->Lambda function: Process 2 out of 10 batch items + Lambda function--xLambda function: Fail on 3rd batch item + Lambda function-->Lambda function: Process messages from another MessageGroupID + Lambda function->>Lambda service: Report 3rd batch item and all messages within the same MessageGroupID as failure + deactivate Lambda function + activate SQS queue + Lambda service->>SQS queue: Delete successful messages processed + SQS queue-->>SQS queue: Failed messages return + deactivate SQS queue \ No newline at end of file diff --git a/examples/snippets/batch/diagrams/streams.mermaid b/examples/snippets/batch/diagrams/streams.mermaid new file mode 100644 index 0000000000..bc634876e1 --- /dev/null +++ b/examples/snippets/batch/diagrams/streams.mermaid @@ -0,0 +1,17 @@ +sequenceDiagram + autonumber + participant Streams + participant Lambda service + participant Lambda function + Lambda service->>Streams: Poll latest records + Lambda service->>Lambda function: Invoke (batch event) + activate Lambda function + Lambda function-->Lambda function: Process 2 out of 10 batch items + Lambda function--xLambda function: Fail on 3rd batch item + Lambda function-->Lambda function: Continue processing batch items (4-10) + Lambda function->>Lambda service: Report batch item as failure (3) + deactivate Lambda function + activate Streams + Lambda service->>Streams: Checkpoints to sequence number from 3rd batch item + Lambda service->>Streams: Poll records starting from updated checkpoint + deactivate Streams \ No newline at end of file diff --git a/examples/snippets/batch/diagrams/streams_multiple_failures.mermaid b/examples/snippets/batch/diagrams/streams_multiple_failures.mermaid new file mode 100644 index 0000000000..817630b63e --- /dev/null +++ b/examples/snippets/batch/diagrams/streams_multiple_failures.mermaid @@ -0,0 +1,17 @@ +sequenceDiagram + autonumber + participant Streams + participant Lambda service + participant Lambda function + Lambda service->>Streams: Poll latest records + Lambda service->>Lambda function: Invoke (batch event) + activate Lambda function + Lambda function-->Lambda function: Process 2 out of 10 batch items + Lambda function--xLambda function: Fail on 3-5 batch items + Lambda function-->Lambda function: Continue processing batch items (6-10) + Lambda function->>Lambda service: Report batch items as failure (3-5) + deactivate Lambda function + activate Streams + Lambda service->>Streams: Checkpoints to lowest sequence number + Lambda service->>Streams: Poll records starting from updated checkpoint + deactivate Streams \ No newline at end of file diff --git a/examples/snippets/batch/samples/parser_SQS.json b/examples/snippets/batch/samples/parser_SQS.json new file mode 100644 index 0000000000..025f5da87d --- /dev/null +++ b/examples/snippets/batch/samples/parser_SQS.json @@ -0,0 +1,36 @@ +{ + "Records": [ + { + "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", + "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a", + "body": "{\"name\": \"test-1\",\"age\": 20}", + "attributes": { + "ApproximateReceiveCount": "1", + "SentTimestamp": "1545082649183", + "SenderId": "AIDAIENQZJOLO23YVJ4VO", + "ApproximateFirstReceiveTimestamp": "1545082649185" + }, + "messageAttributes": {}, + "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", + "eventSource": "aws:sqs", + "eventSourceARN": "arn:aws:sqs:us-east-2: 123456789012:my-queue", + "awsRegion": "us-east-1" + }, + { + "messageId": "244fc6b4-87a3-44ab-83d2-361172410c3a", + "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a", + "body": "{\"name\": \"test-2\",\"age\": 30}", + "attributes": { + "ApproximateReceiveCount": "1", + "SentTimestamp": "1545082649183", + "SenderId": "AIDAIENQZJOLO23YVJ4VO", + "ApproximateFirstReceiveTimestamp": "1545082649185" + }, + "messageAttributes": {}, + "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", + "eventSource": "aws:sqs", + "eventSourceARN": "arn:aws:sqs:us-east-2: 123456789012:my-queue", + "awsRegion": "us-east-1" + } + ] +} diff --git a/packages/batch/src/BatchProcessor.ts b/packages/batch/src/BatchProcessor.ts index 1a8ec918b3..0e1f2296df 100644 --- a/packages/batch/src/BatchProcessor.ts +++ b/packages/batch/src/BatchProcessor.ts @@ -79,6 +79,40 @@ import type { BaseRecord, FailureResponse, SuccessResponse } from './types.js'; * }); * ``` * + * **Process batch with schema validation** + * + * @example + * ```typescript + * import { + * BatchProcessor, + * EventType, + * processPartialResponse, + * } from '@aws-lambda-powertools/batch'; + * import { parser } from '@aws-lambda-powertools/batch/parser'; + * import { SqsRecordSchema } from '@aws-lambda-powertools/parser/schemas'; + * import type { SQSHandler } from 'aws-lambda'; + * import { z } from 'zod'; + * + * const myItemSchema = z.object({ name: z.string(), age: z.number() }); + * + * const processor = new BatchProcessor(EventType.SQS, { + * parser, + * schema: SqsRecordSchema.extend({ + * body: myItemSchema, + * }), + * }); + * + * const recordHandler = async (record) => { + * // record is now fully typed and validated + * console.log(record.body.name, record.body.age); + * }; + * + * export const handler: SQSHandler = async (event, context) => + * processPartialResponse(event, recordHandler, processor, { + * context, + * }); + * ``` + * * @param eventType - The type of event to process (SQS, Kinesis, DynamoDB) */ class BatchProcessor extends BasePartialBatchProcessor { diff --git a/packages/batch/src/index.ts b/packages/batch/src/index.ts index 6cf3370b00..fb0a86a751 100644 --- a/packages/batch/src/index.ts +++ b/packages/batch/src/index.ts @@ -14,3 +14,4 @@ export { processPartialResponse } from './processPartialResponse.js'; export { processPartialResponseSync } from './processPartialResponseSync.js'; export { SqsFifoPartialProcessor } from './SqsFifoPartialProcessor.js'; export { SqsFifoPartialProcessorAsync } from './SqsFifoPartialProcessorAsync.js'; +export type { ParsedRecord } from './types.js'; diff --git a/packages/batch/src/types.ts b/packages/batch/src/types.ts index 4ea03d920d..a160c53e7d 100644 --- a/packages/batch/src/types.ts +++ b/packages/batch/src/types.ts @@ -4,10 +4,13 @@ import type { DynamoDBRecord, KinesisStreamRecord, SQSRecord, + StreamRecord, } from 'aws-lambda'; import type { ZodType } from 'zod'; import type { GenericLogger } from '../../commons/lib/esm/types/GenericLogger.js'; import type { BasePartialBatchProcessor } from './BasePartialBatchProcessor.js'; +import type { BatchProcessor } from './BatchProcessor.js'; +import type { parser } from './parser.js'; import type { SqsFifoPartialProcessor } from './SqsFifoPartialProcessor.js'; import type { SqsFifoPartialProcessorAsync } from './SqsFifoPartialProcessorAsync.js'; @@ -93,29 +96,149 @@ type PartialItemFailures = { itemIdentifier: string }; type PartialItemFailureResponse = { batchItemFailures: PartialItemFailures[] }; /** - * Type representing the parser configuration options passed to the BasePartialBatchProcessor class. + * Configuration options for {@link BatchProcessor | `BatchProcessor`} parser integration. * - * @property schema - The full event schema to be used for parsing - * @property innerSchema - The inner payload schema - * @property transformer - The transformer to be used for parsing the payload - * @property logger - The logger to be used for logging debug and warning messages. + * When enabling parser integration, you must provide {@link parser} along with either `schema` or `innerSchema`. + * Import `parser` from `@aws-lambda-powertools/batch/parser`. + * + * When using `schema`, provide a complete schema for the record that matches the event type. For example, + * when using `EventType.SQS` you need a schema for an SQS Record. If using Zod, you can extend one of the + * built-in schemas to easily get the appropriate schema. + * + * When using `innerSchema`, we use the `EventType` to determine the base schema, so you only provide + * a schema for the payload. You can optionally pass a `transformer` to transform the payload before parsing. + * For example, use the `json` transformer for JSON stringified objects. + * + * You can optionally pass a `logger` for debug and warning messages. + * + * @note `innerSchema` supports only Zod schemas, while `schema` supports any Standard Schema-compatible parsing library. + * + * @property parser - Required when using schema parsing (import from `@aws-lambda-powertools/batch/parser`) + * @property schema - Complete event schema (mutually exclusive with innerSchema) + * @property innerSchema - Payload-only schema (mutually exclusive with schema) + * @property transformer - Payload transformer (only available with innerSchema) + * @property logger - Optional logger for debug/warning messages */ type BasePartialBatchProcessorParserConfig = | { - parser?: CallableFunction; - schema?: StandardSchemaV1; + /** + * Required when using schema parsing - import from `@aws-lambda-powertools/batch/parser` + */ + parser: typeof parser; + /** + * Complete event schema using Standard Schema specification, mutually exclusive with `innerSchema` + */ + schema: StandardSchemaV1; innerSchema?: never; transformer?: never; + /** + * Optional logger for debug and warning messages + */ logger?: Pick; } | { - parser?: CallableFunction; + /** + * Required when using schema parsing - import from `@aws-lambda-powertools/batch/parser` + */ + parser: typeof parser; schema?: never; - innerSchema?: ZodType; + /** + * Payload-only Zod schema, mutually exclusive with `schema` + */ + innerSchema: ZodType; + /** + * Payload transformer, only available with `innerSchema` + */ transformer?: 'json' | 'base64' | 'unmarshall'; + /** + * Optional logger for debug and warning messages + */ + logger?: Pick; + } + | { + parser?: never; + schema?: never; + innerSchema?: never; + transformer?: never; + /** + * Optional logger for debug and warning messages + */ logger?: Pick; }; +/** + * Utility type for creating typed record handlers with custom payload schemas. + * + * @template TRecord - The base record type, one of: `SqsRecord`, `KinesisStreamRecord`, and `DynamoDBRecord` + * @template TPayload - The inferred type from your payload schema + * @template TOldPayload - Optional separate type for DynamoDB `OldImage`, when not specified both `NewImage` and `OldImage` will have the same type + * + * **SQS Records** + * + * @example + * ```typescript + * const mySchema = z.object({ name: z.string(), age: z.number() }); + * type MySqsRecord = ParsedRecord>; + * + * const sqsHandler = async (record: MySqsRecord) => { + * // record.body is now typed as { name: string, age: number } + * }; + * ``` + * + * **Kinesis Records** + * + * @example + * ```typescript + * const kinesisSchema = z.object({ userId: z.string(), action: z.string() }); + * type MyKinesisRecord = ParsedRecord>; + * + * const kinesisHandler = async (record: MyKinesisRecord) => { + * // record.kinesis.data is now typed as { userId: string, action: string } + * }; + * ``` + * + * **DynamoDB Records - Single Schema** + * + * @example + * ```typescript + * const dynamoSchema = z.object({ id: z.string(), status: z.string() }); + * type MyDynamoRecord = ParsedRecord>; + * + * const dynamoHandler = async (record: MyDynamoRecord) => { + * // record.dynamodb.NewImage and record.dynamodb.OldImage are both typed as { id: string, status: string } + * }; + * ``` + * + * @example + * **DynamoDB Records - Separate Schemas** + * ```typescript + * const newSchema = z.object({ id: z.string(), status: z.string(), updatedAt: z.string() }); + * const oldSchema = z.object({ id: z.string(), status: z.string() }); + * type MyDynamoRecordSeparate = ParsedRecord, z.infer>; + * + * const dynamoHandlerSeparate = async (record: MyDynamoRecordSeparate) => { + * // record.dynamodb.NewImage is typed as { id: string, status: string, updatedAt: string } + * // record.dynamodb.OldImage is typed as { id: string, status: string } + * }; + * ``` + */ +type ParsedRecord = TRecord extends { + body: string; +} + ? Omit & { body: TPayload } + : TRecord extends { kinesis: { data: string } } + ? Omit & { + kinesis: Omit & { data: TPayload }; + } + : TRecord extends { dynamodb?: StreamRecord } + ? Omit & { + dynamodb: Omit & { + NewImage: TPayload; + OldImage: TOldPayload; + }; + } + : TRecord; + export type { BatchProcessingOptions, BaseRecord, @@ -125,4 +248,5 @@ export type { PartialItemFailures, PartialItemFailureResponse, BasePartialBatchProcessorParserConfig, + ParsedRecord, }; diff --git a/packages/batch/typedoc.json b/packages/batch/typedoc.json index 2cc575bc18..5873dab1cd 100644 --- a/packages/batch/typedoc.json +++ b/packages/batch/typedoc.json @@ -1,5 +1,5 @@ { "extends": ["../../typedoc.base.json"], - "entryPoints": ["./src/index.ts", "./src/types.ts"], + "entryPoints": ["./src/index.ts", "./src/parser.ts", "./src/types.ts"], "readme": "README.md" } From 9118bbfbaccda931556df48586a3d32d06590ad2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 13 Sep 2025 12:11:22 +0200 Subject: [PATCH 148/255] chore(deps): bump the aws-cdk group across 1 directory with 3 updates (#4443) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi --- examples/app/package.json | 4 +-- layers/package.json | 4 +-- package-lock.json | 51 ++++++++++++++++++----------------- packages/testing/package.json | 4 +-- 4 files changed, 32 insertions(+), 31 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 6dcbcf291b..6292188f61 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -30,7 +30,7 @@ "devDependencies": { "@types/aws-lambda": "^8.10.152", "@types/node": "24.3.1", - "aws-cdk-lib": "^2.213.0", + "aws-cdk-lib": "^2.214.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", "tsx": "^4.20.5", @@ -49,7 +49,7 @@ "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", "@types/node": "24.3.1", - "aws-cdk": "^2.1027.0", + "aws-cdk": "^2.1029.1", "constructs": "^10.4.2", "esbuild": "^0.25.9", "typescript": "^5.9.2" diff --git a/layers/package.json b/layers/package.json index 639da04ec6..090cea3841 100644 --- a/layers/package.json +++ b/layers/package.json @@ -40,8 +40,8 @@ "source-map-support": "^0.5.21" }, "dependencies": { - "aws-cdk": "^2.1027.0", - "aws-cdk-lib": "^2.213.0", + "aws-cdk": "^2.1029.1", + "aws-cdk-lib": "^2.214.0", "esbuild": "^0.25.9", "tsx": "^4.20.5" } diff --git a/package-lock.json b/package-lock.json index 3ec8c627f5..757b75b793 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,7 +61,7 @@ "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", "@types/node": "24.3.1", - "aws-cdk": "^2.1027.0", + "aws-cdk": "^2.1029.1", "constructs": "^10.4.2", "esbuild": "^0.25.9", "typescript": "^5.9.2" @@ -69,7 +69,7 @@ "devDependencies": { "@types/aws-lambda": "^8.10.152", "@types/node": "24.3.1", - "aws-cdk-lib": "^2.213.0", + "aws-cdk-lib": "^2.214.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", "tsx": "^4.20.5", @@ -134,8 +134,8 @@ "version": "2.26.0", "license": "MIT-0", "dependencies": { - "aws-cdk": "^2.1027.0", - "aws-cdk-lib": "^2.213.0", + "aws-cdk": "^2.1029.1", + "aws-cdk-lib": "^2.214.0", "esbuild": "^0.25.9", "tsx": "^4.20.5" }, @@ -317,9 +317,9 @@ } }, "node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "48.6.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-48.6.0.tgz", - "integrity": "sha512-VwAHw5G/meFQsiReu1drD+mkL+jiCL7FMD/xoWDjvKcvFf4Xszl22zVskhfcekeU6+9cUe5Uy+QKkwOwMi1vGg==", + "version": "48.9.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-48.9.0.tgz", + "integrity": "sha512-wZsFnrLLzowYA26yfV6Xe7h6ZAYXZwsAQLLBowxhVdR5NcJIeCWI0dAavNdrUdZgiEbYU4rkUX3AXYI+nC6FTA==", "bundleDependencies": [ "jsonschema", "semver" @@ -420,13 +420,13 @@ } }, "node_modules/@aws-cdk/toolkit-lib": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@aws-cdk/toolkit-lib/-/toolkit-lib-1.6.1.tgz", - "integrity": "sha512-EJlek1OwIsPZ0JJXNnXnQlFqJcbBVrxEPU1mDpgh3EPJmwRX0vAButju1BptRb1q3tHDCShnzfhGFTvDLqA9UQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@aws-cdk/toolkit-lib/-/toolkit-lib-1.8.1.tgz", + "integrity": "sha512-aUlCh9Vq3Yc6wOJnYtUgkSnB3zlTWq5nlwj99OirIB9+i0CHaRr9J6yRUFv6FermbuZd+LmZNUwZT7f/GgND7w==", "license": "Apache-2.0", "dependencies": { "@aws-cdk/cdk-assets-lib": "^1", - "@aws-cdk/cloud-assembly-schema": ">=48.6.0", + "@aws-cdk/cloud-assembly-schema": ">=48.9.0", "@aws-cdk/cloudformation-diff": "^2", "@aws-cdk/cx-api": "^2", "@aws-sdk/client-appsync": "^3", @@ -456,9 +456,10 @@ "@smithy/util-retry": "^4", "@smithy/util-waiter": "^4", "archiver": "^7.0.1", - "cdk-from-cfn": "^0.236.0", + "cdk-from-cfn": "^0.245.0", "chalk": "^4", "chokidar": "^3", + "fast-deep-equal": "^3.1.3", "fs-extra": "^9", "glob": "^11.0.3", "minimatch": "10.0.3", @@ -5979,9 +5980,9 @@ } }, "node_modules/aws-cdk": { - "version": "2.1027.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.1027.0.tgz", - "integrity": "sha512-oo2d1o8L1GBmAG4cDzIloEBOkijf1VzpZKJJguAodUCffDDOaAd6zjEbQbedb3SY+Vg+8m9OUOEXzeLMMg3GPQ==", + "version": "2.1029.1", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.1029.1.tgz", + "integrity": "sha512-etMnV7xwm1pBKOXl5zZKtNRt7ZIMocEe+GrZHVVp6oHsXqpPDi7iyPm7HR3CV1xe9yFjs3hZiHDebg+ONpccuw==", "license": "Apache-2.0", "bin": { "cdk": "bin/cdk" @@ -5994,9 +5995,9 @@ } }, "node_modules/aws-cdk-lib": { - "version": "2.213.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.213.0.tgz", - "integrity": "sha512-U6/1RnVu9R7bpb9gJoEl0tie4+f7/5MIWkolWhsoaaEjQ3XwKicaLxzGPZaU4hShDOG+pp6+1Lp9pofOdV0t8A==", + "version": "2.214.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.214.0.tgz", + "integrity": "sha512-Mj9GSJkkXj8wjiy2pKARquOsiiHsu7tK1WDfdA8Db39hIznWWP+/KscI2iqnntDMeEmcj1QX25PbYT+6rq8zkw==", "bundleDependencies": [ "@balena/dockerignore", "case", @@ -6014,7 +6015,7 @@ "dependencies": { "@aws-cdk/asset-awscli-v1": "2.2.242", "@aws-cdk/asset-node-proxy-agent-v6": "^2.1.0", - "@aws-cdk/cloud-assembly-schema": "^48.3.0", + "@aws-cdk/cloud-assembly-schema": "^48.6.0", "@balena/dockerignore": "^1.0.2", "case": "1.6.3", "fs-extra": "^11.3.1", @@ -6138,7 +6139,7 @@ "license": "MIT" }, "node_modules/aws-cdk-lib/node_modules/fast-uri": { - "version": "3.0.6", + "version": "3.1.0", "funding": [ { "type": "github", @@ -6581,9 +6582,9 @@ } }, "node_modules/cdk-from-cfn": { - "version": "0.236.0", - "resolved": "https://registry.npmjs.org/cdk-from-cfn/-/cdk-from-cfn-0.236.0.tgz", - "integrity": "sha512-D7yG+9ywyasNZFYjRFan06JfoA328N2TF+m67K51BWEqGJs7AowRS5yLb0tkJU67QONyuBLENx3/hIaPLCJ3PA==", + "version": "0.245.0", + "resolved": "https://registry.npmjs.org/cdk-from-cfn/-/cdk-from-cfn-0.245.0.tgz", + "integrity": "sha512-bRybOGt+4jwSQlsuJxb8g6qM4sdjFfW7NIEwSceAJL4inRh4pPhAbsZjmlTyBRPwQ3YUDGYI/VhKrkyMvXnxBw==", "license": "MIT OR Apache-2.0" }, "node_modules/chai": { @@ -10962,10 +10963,10 @@ "version": "2.26.0", "license": "MIT-0", "dependencies": { - "@aws-cdk/toolkit-lib": "^1.6.1", + "@aws-cdk/toolkit-lib": "^1.8.1", "@aws-sdk/client-lambda": "^3.883.0", "@smithy/util-utf8": "^4.0.0", - "aws-cdk-lib": "^2.213.0", + "aws-cdk-lib": "^2.214.0", "esbuild": "^0.25.9", "promise-retry": "^2.0.1" }, diff --git a/packages/testing/package.json b/packages/testing/package.json index b14c88fd80..92e6b9f973 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -97,10 +97,10 @@ }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/testing#readme", "dependencies": { - "@aws-cdk/toolkit-lib": "^1.6.1", + "@aws-cdk/toolkit-lib": "^1.8.1", "@aws-sdk/client-lambda": "^3.883.0", "@smithy/util-utf8": "^4.0.0", - "aws-cdk-lib": "^2.213.0", + "aws-cdk-lib": "^2.214.0", "esbuild": "^0.25.9", "promise-retry": "^2.0.1" }, From 8cfcccd6e94a6f0b25087ffbd8a4a2ec4bbf0e3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Fauvel?= Date: Mon, 15 Sep 2025 12:49:59 +0200 Subject: [PATCH 149/255] fix(batch): declare the @aws-lambda-powertools/commons dependency (#4484) Co-authored-by: Swopnil Dangol --- package-lock.json | 3 +++ packages/batch/package.json | 3 +++ packages/batch/src/BasePartialBatchProcessor.ts | 2 +- packages/batch/src/types.ts | 4 ++-- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 757b75b793..4ee3a8ea62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10743,6 +10743,9 @@ "name": "@aws-lambda-powertools/batch", "version": "2.26.0", "license": "MIT-0", + "dependencies": { + "@aws-lambda-powertools/commons": "2.26.0" + }, "devDependencies": { "@aws-lambda-powertools/parser": "2.26.0", "@aws-lambda-powertools/testing-utils": "file:../testing" diff --git a/packages/batch/package.json b/packages/batch/package.json index 232613b8b8..fbea1a23e2 100644 --- a/packages/batch/package.json +++ b/packages/batch/package.json @@ -80,6 +80,9 @@ "serverless", "nodejs" ], + "dependencies": { + "@aws-lambda-powertools/commons": "2.26.0" + }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", "@aws-lambda-powertools/parser": "2.26.0" diff --git a/packages/batch/src/BasePartialBatchProcessor.ts b/packages/batch/src/BasePartialBatchProcessor.ts index 17537c47d6..4d525dbded 100644 --- a/packages/batch/src/BasePartialBatchProcessor.ts +++ b/packages/batch/src/BasePartialBatchProcessor.ts @@ -1,10 +1,10 @@ +import type { GenericLogger } from '@aws-lambda-powertools/commons/types'; import { getStringFromEnv } from '@aws-lambda-powertools/commons/utils/env'; import type { DynamoDBRecord, KinesisStreamRecord, SQSRecord, } from 'aws-lambda'; -import type { GenericLogger } from '../../commons/lib/esm/types/GenericLogger.js'; import { BasePartialProcessor } from './BasePartialProcessor.js'; import { DATA_CLASS_MAPPING, diff --git a/packages/batch/src/types.ts b/packages/batch/src/types.ts index a160c53e7d..2f2ad880cb 100644 --- a/packages/batch/src/types.ts +++ b/packages/batch/src/types.ts @@ -1,3 +1,4 @@ +import type { GenericLogger } from '@aws-lambda-powertools/commons/types'; import type { StandardSchemaV1 } from '@standard-schema/spec'; import type { Context, @@ -7,7 +8,6 @@ import type { StreamRecord, } from 'aws-lambda'; import type { ZodType } from 'zod'; -import type { GenericLogger } from '../../commons/lib/esm/types/GenericLogger.js'; import type { BasePartialBatchProcessor } from './BasePartialBatchProcessor.js'; import type { BatchProcessor } from './BatchProcessor.js'; import type { parser } from './parser.js'; @@ -111,7 +111,7 @@ type PartialItemFailureResponse = { batchItemFailures: PartialItemFailures[] }; * * You can optionally pass a `logger` for debug and warning messages. * - * @note `innerSchema` supports only Zod schemas, while `schema` supports any Standard Schema-compatible parsing library. + * Note: `innerSchema` supports only Zod schemas, while `schema` supports any Standard Schema-compatible parsing library. * * @property parser - Required when using schema parsing (import from `@aws-lambda-powertools/batch/parser`) * @property schema - Complete event schema (mutually exclusive with innerSchema) From 08555250f6851fa966822f80516a91981e95f28d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 12:31:28 +0100 Subject: [PATCH 150/255] chore(ci): bump version to 2.26.1 (#4486) Co-authored-by: aws-powertools-bot <151832416+aws-powertools-bot@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ examples/app/CHANGELOG.md | 4 ++++ examples/app/package.json | 14 +++++++------- examples/snippets/CHANGELOG.md | 4 ++++ examples/snippets/package.json | 20 +++++++++---------- layers/CHANGELOG.md | 4 ++++ layers/package.json | 2 +- package-lock.json | 30 ++++++++++++++--------------- packages/batch/CHANGELOG.md | 5 +++++ packages/batch/package.json | 6 +++--- packages/commons/CHANGELOG.md | 4 ++++ packages/commons/package.json | 2 +- packages/commons/src/version.ts | 2 +- packages/event-handler/CHANGELOG.md | 4 ++++ packages/event-handler/package.json | 4 ++-- packages/idempotency/CHANGELOG.md | 4 ++++ packages/idempotency/package.json | 6 +++--- packages/jmespath/CHANGELOG.md | 4 ++++ packages/jmespath/package.json | 4 ++-- packages/kafka/CHANGELOG.md | 4 ++++ packages/kafka/package.json | 4 ++-- packages/logger/CHANGELOG.md | 4 ++++ packages/logger/package.json | 6 +++--- packages/metrics/CHANGELOG.md | 4 ++++ packages/metrics/package.json | 4 ++-- packages/parameters/CHANGELOG.md | 4 ++++ packages/parameters/package.json | 4 ++-- packages/parser/CHANGELOG.md | 4 ++++ packages/parser/package.json | 4 ++-- packages/testing/CHANGELOG.md | 4 ++++ packages/testing/package.json | 2 +- packages/tracer/CHANGELOG.md | 4 ++++ packages/tracer/package.json | 4 ++-- packages/validation/CHANGELOG.md | 4 ++++ packages/validation/package.json | 6 +++--- 35 files changed, 134 insertions(+), 62 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e5f2ebe98c..81e73992e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) + +### Bug Fixes + +- **batch** declare the @aws-lambda-powertools/commons dependency ([#4484](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4484)) ([8cfcccd](https://github.com/aws-powertools/powertools-lambda-typescript/commit/8cfcccd6e94a6f0b25087ffbd8a4a2ec4bbf0e3d)) + + ## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) ### Improvements diff --git a/examples/app/CHANGELOG.md b/examples/app/CHANGELOG.md index 79293f3b83..f260afbf19 100644 --- a/examples/app/CHANGELOG.md +++ b/examples/app/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) + +**Note:** Version bump only for this package + ## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) **Note:** Version bump only for this package diff --git a/examples/app/package.json b/examples/app/package.json index 6292188f61..212f8dcdc7 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -1,6 +1,6 @@ { "name": "powertools-sample-app", - "version": "2.26.0", + "version": "2.26.1", "author": { "name": "Amazon Web Services", "url": "https://aws.amazon.com" @@ -38,12 +38,12 @@ "vitest": "^3.0.5" }, "dependencies": { - "@aws-lambda-powertools/batch": "^2.26.0", - "@aws-lambda-powertools/idempotency": "^2.26.0", - "@aws-lambda-powertools/logger": "^2.26.0", - "@aws-lambda-powertools/metrics": "^2.26.0", - "@aws-lambda-powertools/parameters": "^2.26.0", - "@aws-lambda-powertools/tracer": "^2.26.0", + "@aws-lambda-powertools/batch": "^2.26.1", + "@aws-lambda-powertools/idempotency": "^2.26.1", + "@aws-lambda-powertools/logger": "^2.26.1", + "@aws-lambda-powertools/metrics": "^2.26.1", + "@aws-lambda-powertools/parameters": "^2.26.1", + "@aws-lambda-powertools/tracer": "^2.26.1", "@aws-sdk/client-ssm": "^3.883.0", "@aws-sdk/lib-dynamodb": "^3.883.0", "@middy/core": "^4.7.0", diff --git a/examples/snippets/CHANGELOG.md b/examples/snippets/CHANGELOG.md index 4e4dfdce10..ae2c64f7f8 100644 --- a/examples/snippets/CHANGELOG.md +++ b/examples/snippets/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) + +**Note:** Version bump only for this package + ## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) **Note:** Version bump only for this package diff --git a/examples/snippets/package.json b/examples/snippets/package.json index 5e64b613eb..af533eefc6 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -1,6 +1,6 @@ { "name": "code-snippets", - "version": "2.26.0", + "version": "2.26.1", "description": "A collection code snippets for the Powertools for AWS Lambda (TypeScript) docs", "author": { "name": "Amazon Web Services", @@ -24,15 +24,15 @@ }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript#readme", "devDependencies": { - "@aws-lambda-powertools/batch": "^2.26.0", - "@aws-lambda-powertools/event-handler": "^2.26.0", - "@aws-lambda-powertools/idempotency": "^2.26.0", - "@aws-lambda-powertools/jmespath": "^2.26.0", - "@aws-lambda-powertools/logger": "^2.26.0", - "@aws-lambda-powertools/metrics": "^2.26.0", - "@aws-lambda-powertools/parameters": "^2.26.0", - "@aws-lambda-powertools/parser": "^2.26.0", - "@aws-lambda-powertools/tracer": "^2.26.0", + "@aws-lambda-powertools/batch": "^2.26.1", + "@aws-lambda-powertools/event-handler": "^2.26.1", + "@aws-lambda-powertools/idempotency": "^2.26.1", + "@aws-lambda-powertools/jmespath": "^2.26.1", + "@aws-lambda-powertools/logger": "^2.26.1", + "@aws-lambda-powertools/metrics": "^2.26.1", + "@aws-lambda-powertools/parameters": "^2.26.1", + "@aws-lambda-powertools/parser": "^2.26.1", + "@aws-lambda-powertools/tracer": "^2.26.1", "@aws-sdk/client-appconfigdata": "^3.883.0", "@aws-sdk/client-dynamodb": "^3.883.0", "@aws-sdk/client-secrets-manager": "^3.883.0", diff --git a/layers/CHANGELOG.md b/layers/CHANGELOG.md index 62018b3a9f..8dbab88334 100644 --- a/layers/CHANGELOG.md +++ b/layers/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) + +**Note:** Version bump only for this package + ## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) **Note:** Version bump only for this package diff --git a/layers/package.json b/layers/package.json index 090cea3841..1bda881101 100644 --- a/layers/package.json +++ b/layers/package.json @@ -1,6 +1,6 @@ { "name": "layers", - "version": "2.26.0", + "version": "2.26.1", "bin": { "layer": "bin/layers.js" }, diff --git a/package-lock.json b/package-lock.json index 4ee3a8ea62..f5badb1a73 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ }, "examples/app": { "name": "powertools-sample-app", - "version": "2.26.0", + "version": "2.26.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/batch": "^2.26.0", @@ -79,7 +79,7 @@ }, "examples/snippets": { "name": "code-snippets", - "version": "2.26.0", + "version": "2.26.1", "license": "MIT-0", "dependencies": { "arktype": "^2.1.22", @@ -10741,7 +10741,7 @@ }, "packages/batch": { "name": "@aws-lambda-powertools/batch", - "version": "2.26.0", + "version": "2.26.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.0" @@ -10753,7 +10753,7 @@ }, "packages/commons": { "name": "@aws-lambda-powertools/commons", - "version": "2.26.0", + "version": "2.26.1", "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing" @@ -10761,7 +10761,7 @@ }, "packages/event-handler": { "name": "@aws-lambda-powertools/event-handler", - "version": "2.26.0", + "version": "2.26.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.0" @@ -10769,7 +10769,7 @@ }, "packages/idempotency": { "name": "@aws-lambda-powertools/idempotency", - "version": "2.26.0", + "version": "2.26.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.0", @@ -10808,7 +10808,7 @@ }, "packages/jmespath": { "name": "@aws-lambda-powertools/jmespath", - "version": "2.26.0", + "version": "2.26.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.0" @@ -10816,7 +10816,7 @@ }, "packages/kafka": { "name": "@aws-lambda-powertools/kafka", - "version": "2.26.0", + "version": "2.26.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.0", @@ -10846,7 +10846,7 @@ }, "packages/logger": { "name": "@aws-lambda-powertools/logger", - "version": "2.26.0", + "version": "2.26.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.0", @@ -10871,7 +10871,7 @@ }, "packages/metrics": { "name": "@aws-lambda-powertools/metrics", - "version": "2.26.0", + "version": "2.26.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.0" @@ -10893,7 +10893,7 @@ }, "packages/parameters": { "name": "@aws-lambda-powertools/parameters", - "version": "2.26.0", + "version": "2.26.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.0" @@ -10939,7 +10939,7 @@ }, "packages/parser": { "name": "@aws-lambda-powertools/parser", - "version": "2.26.0", + "version": "2.26.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.0", @@ -10963,7 +10963,7 @@ }, "packages/testing": { "name": "@aws-lambda-powertools/testing-utils", - "version": "2.26.0", + "version": "2.26.1", "license": "MIT-0", "dependencies": { "@aws-cdk/toolkit-lib": "^1.8.1", @@ -10980,7 +10980,7 @@ }, "packages/tracer": { "name": "@aws-lambda-powertools/tracer", - "version": "2.26.0", + "version": "2.26.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.0", @@ -11002,7 +11002,7 @@ }, "packages/validation": { "name": "@aws-lambda-powertools/validation", - "version": "2.26.0", + "version": "2.26.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.0", diff --git a/packages/batch/CHANGELOG.md b/packages/batch/CHANGELOG.md index 1aa3ee3895..0f1ad2e93b 100644 --- a/packages/batch/CHANGELOG.md +++ b/packages/batch/CHANGELOG.md @@ -1,5 +1,10 @@ # Change Log +## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) + +### Bug Fixes + +- declare the @aws-lambda-powertools/commons dependency ([#4484](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4484)) ([8cfcccd](https://github.com/aws-powertools/powertools-lambda-typescript/commit/8cfcccd6e94a6f0b25087ffbd8a4a2ec4bbf0e3d)) ## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) ### Improvements diff --git a/packages/batch/package.json b/packages/batch/package.json index fbea1a23e2..41512af4df 100644 --- a/packages/batch/package.json +++ b/packages/batch/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/batch", - "version": "2.26.0", + "version": "2.26.1", "description": "The batch processing package for the Powertools for AWS Lambda (TypeScript) library.", "author": { "name": "Amazon Web Services", @@ -81,10 +81,10 @@ "nodejs" ], "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0" + "@aws-lambda-powertools/commons": "2.26.1" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-lambda-powertools/parser": "2.26.0" + "@aws-lambda-powertools/parser": "2.26.1" } } \ No newline at end of file diff --git a/packages/commons/CHANGELOG.md b/packages/commons/CHANGELOG.md index 903009a529..9305018237 100644 --- a/packages/commons/CHANGELOG.md +++ b/packages/commons/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) + +**Note:** Version bump only for this package + ## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) **Note:** Version bump only for this package diff --git a/packages/commons/package.json b/packages/commons/package.json index dabbaa9f7d..9f8516e349 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/commons", - "version": "2.26.0", + "version": "2.26.1", "description": "A shared utility package for Powertools for AWS Lambda (TypeScript) libraries", "author": { "name": "Amazon Web Services", diff --git a/packages/commons/src/version.ts b/packages/commons/src/version.ts index 266de30175..fc60956423 100644 --- a/packages/commons/src/version.ts +++ b/packages/commons/src/version.ts @@ -1,2 +1,2 @@ // this file is auto generated, do not modify -export const PT_VERSION = '2.26.0'; +export const PT_VERSION = '2.26.1'; diff --git a/packages/event-handler/CHANGELOG.md b/packages/event-handler/CHANGELOG.md index 08d9a5a7a5..7e6b25c7bc 100644 --- a/packages/event-handler/CHANGELOG.md +++ b/packages/event-handler/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) + +**Note:** Version bump only for this package + ## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) ### Features diff --git a/packages/event-handler/package.json b/packages/event-handler/package.json index 90a85b5d68..563e200734 100644 --- a/packages/event-handler/package.json +++ b/packages/event-handler/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/event-handler", - "version": "2.26.0", + "version": "2.26.1", "description": "Lightweight routing to reduce boilerplate for API Gateway REST/HTTP API, ALB, Lambda Function URLs, and AppSync.", "author": { "name": "Amazon Web Services", @@ -114,7 +114,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0" + "@aws-lambda-powertools/commons": "2.26.1" }, "keywords": [ "aws", diff --git a/packages/idempotency/CHANGELOG.md b/packages/idempotency/CHANGELOG.md index 62fa1fe52a..bf523b6c16 100644 --- a/packages/idempotency/CHANGELOG.md +++ b/packages/idempotency/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) + +**Note:** Version bump only for this package + ## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) **Note:** Version bump only for this package diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index 1919e22d54..a7009a6260 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/idempotency", - "version": "2.26.0", + "version": "2.26.1", "description": "The idempotency package for the Powertools for AWS Lambda (TypeScript) library. It provides options to make your Lambda functions idempotent and safe to retry.", "author": { "name": "Amazon Web Services", @@ -113,8 +113,8 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0", - "@aws-lambda-powertools/jmespath": "2.26.0" + "@aws-lambda-powertools/commons": "2.26.1", + "@aws-lambda-powertools/jmespath": "2.26.1" }, "peerDependencies": { "@aws-sdk/client-dynamodb": ">=3.x", diff --git a/packages/jmespath/CHANGELOG.md b/packages/jmespath/CHANGELOG.md index 96a4672b7e..8348394fe7 100644 --- a/packages/jmespath/CHANGELOG.md +++ b/packages/jmespath/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) + +**Note:** Version bump only for this package + ## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) **Note:** Version bump only for this package diff --git a/packages/jmespath/package.json b/packages/jmespath/package.json index cd2f3d1c9a..48065570dc 100644 --- a/packages/jmespath/package.json +++ b/packages/jmespath/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/jmespath", - "version": "2.26.0", + "version": "2.26.1", "description": "A type safe and modern jmespath module to parse and extract data from JSON documents using JMESPath", "author": { "name": "Amazon Web Services", @@ -71,7 +71,7 @@ "lib" ], "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0" + "@aws-lambda-powertools/commons": "2.26.1" }, "repository": { "type": "git", diff --git a/packages/kafka/CHANGELOG.md b/packages/kafka/CHANGELOG.md index 791ade261f..cd6864695b 100644 --- a/packages/kafka/CHANGELOG.md +++ b/packages/kafka/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) + +**Note:** Version bump only for this package + ## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) **Note:** Version bump only for this package diff --git a/packages/kafka/package.json b/packages/kafka/package.json index 95091dc5e1..45cd05c2ab 100644 --- a/packages/kafka/package.json +++ b/packages/kafka/package.json @@ -1,7 +1,7 @@ { "name": "@aws-lambda-powertools/kafka", "description": "Utility to easily handle message deserialization and parsing of Kafka events in AWS Lambda functions", - "version": "2.26.0", + "version": "2.26.1", "author": { "name": "Amazon Web Services", "url": "https://aws.amazon.com" @@ -46,7 +46,7 @@ "nodejs" ], "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0", + "@aws-lambda-powertools/commons": "2.26.1", "@standard-schema/spec": "^1.0.0" }, "peerDependencies": { diff --git a/packages/logger/CHANGELOG.md b/packages/logger/CHANGELOG.md index 230bcd59dd..488e644cdc 100644 --- a/packages/logger/CHANGELOG.md +++ b/packages/logger/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) + +**Note:** Version bump only for this package + ## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) ### Improvements diff --git a/packages/logger/package.json b/packages/logger/package.json index efaf2f6ece..74f29bdaf0 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/logger", - "version": "2.26.0", + "version": "2.26.1", "description": "The logging package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -75,7 +75,7 @@ "@types/lodash.merge": "^4.6.9" }, "peerDependencies": { - "@aws-lambda-powertools/jmespath": "2.26.0", + "@aws-lambda-powertools/jmespath": "2.26.1", "@middy/core": "4.x || 5.x || 6.x" }, "peerDependenciesMeta": { @@ -97,7 +97,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0", + "@aws-lambda-powertools/commons": "2.26.1", "lodash.merge": "^4.6.2" }, "keywords": [ diff --git a/packages/metrics/CHANGELOG.md b/packages/metrics/CHANGELOG.md index c9a1398b09..4ca9b2ce83 100644 --- a/packages/metrics/CHANGELOG.md +++ b/packages/metrics/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) + +**Note:** Version bump only for this package + ## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) **Note:** Version bump only for this package diff --git a/packages/metrics/package.json b/packages/metrics/package.json index 74642d9578..6a9012e84a 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/metrics", - "version": "2.26.0", + "version": "2.26.1", "description": "The metrics package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -87,7 +87,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0" + "@aws-lambda-powertools/commons": "2.26.1" }, "keywords": [ "aws", diff --git a/packages/parameters/CHANGELOG.md b/packages/parameters/CHANGELOG.md index 3605a2822f..2c231f5b2d 100644 --- a/packages/parameters/CHANGELOG.md +++ b/packages/parameters/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) + +**Note:** Version bump only for this package + ## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) **Note:** Version bump only for this package diff --git a/packages/parameters/package.json b/packages/parameters/package.json index b50e2b671a..48af7f88e3 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/parameters", - "version": "2.26.0", + "version": "2.26.1", "description": "The parameters package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -164,7 +164,7 @@ "aws-sdk-client-mock": "^4.1.0" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0" + "@aws-lambda-powertools/commons": "2.26.1" }, "peerDependencies": { "@aws-sdk/client-appconfigdata": ">=3.x", diff --git a/packages/parser/CHANGELOG.md b/packages/parser/CHANGELOG.md index 2c8f629c4d..39c9f7a97c 100644 --- a/packages/parser/CHANGELOG.md +++ b/packages/parser/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) + +**Note:** Version bump only for this package + ## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) ### Bug Fixes diff --git a/packages/parser/package.json b/packages/parser/package.json index c3c8572fd5..f77a688e14 100644 --- a/packages/parser/package.json +++ b/packages/parser/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/parser", - "version": "2.26.0", + "version": "2.26.1", "description": "The parser package for the Powertools for AWS Lambda (TypeScript) library.", "author": { "name": "Amazon Web Services", @@ -199,7 +199,7 @@ "nodejs" ], "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0", + "@aws-lambda-powertools/commons": "2.26.1", "@standard-schema/spec": "^1.0.0" }, "peerDependencies": { diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index 43fba80bc8..df180307db 100644 --- a/packages/testing/CHANGELOG.md +++ b/packages/testing/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) + +**Note:** Version bump only for this package + ## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) **Note:** Version bump only for this package diff --git a/packages/testing/package.json b/packages/testing/package.json index 92e6b9f973..b89726f990 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/testing-utils", - "version": "2.26.0", + "version": "2.26.1", "description": "A package containing utilities to test your serverless workloads", "author": { "name": "Amazon Web Services", diff --git a/packages/tracer/CHANGELOG.md b/packages/tracer/CHANGELOG.md index dcf00c47a0..dd966667cf 100644 --- a/packages/tracer/CHANGELOG.md +++ b/packages/tracer/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) + +**Note:** Version bump only for this package + ## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) **Note:** Version bump only for this package diff --git a/packages/tracer/package.json b/packages/tracer/package.json index f73510fef2..44688c43d6 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/tracer", - "version": "2.26.0", + "version": "2.26.1", "description": "The tracer package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -86,7 +86,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0", + "@aws-lambda-powertools/commons": "2.26.1", "aws-xray-sdk-core": "^3.10.3" }, "keywords": [ diff --git a/packages/validation/CHANGELOG.md b/packages/validation/CHANGELOG.md index b75bdf9d03..648f26c8cf 100644 --- a/packages/validation/CHANGELOG.md +++ b/packages/validation/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) + +**Note:** Version bump only for this package + ## [2.26.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.2...v2.26.0) (2025-09-11) **Note:** Version bump only for this package diff --git a/packages/validation/package.json b/packages/validation/package.json index 92ab96ee99..fd725fe238 100644 --- a/packages/validation/package.json +++ b/packages/validation/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/validation", - "version": "2.26.0", + "version": "2.26.1", "description": "An utility to validate events and responses using JSON Schemas", "author": { "name": "Amazon Web Services", @@ -95,8 +95,8 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0", - "@aws-lambda-powertools/jmespath": "2.26.0", + "@aws-lambda-powertools/commons": "2.26.1", + "@aws-lambda-powertools/jmespath": "2.26.1", "ajv": "^8.17.1" }, "keywords": [ From 5ef087ce0759f3ca72b7dcf833748fc27e56679e Mon Sep 17 00:00:00 2001 From: Swopnil Dangol Date: Mon, 15 Sep 2025 13:15:37 +0100 Subject: [PATCH 151/255] chore(ci): update layer ARN on documentation (#4488) --- docs/getting-started/lambda-layers.md | 88 +++++++++++++-------------- examples/app/cdk/example-stack.ts | 2 +- examples/app/template.yaml | 2 +- 3 files changed, 46 insertions(+), 46 deletions(-) diff --git a/docs/getting-started/lambda-layers.md b/docs/getting-started/lambda-layers.md index 9e1046e76c..9eb2f8058b 100644 --- a/docs/getting-started/lambda-layers.md +++ b/docs/getting-started/lambda-layers.md @@ -19,41 +19,41 @@ We publish the Lambda Layer for Powertools for AWS Lambda in all commercial regi | Region | Layer ARN | | ---------------- | ---------------------------------------------------------------------------------------------------------- | -| `us-east-1` | [arn:aws:lambda:us-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `us-east-2` | [arn:aws:lambda:us-east-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `us-west-1` | [arn:aws:lambda:us-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `us-west-2` | [arn:aws:lambda:us-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `ap-south-1` | [arn:aws:lambda:ap-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `ap-south-2` | [arn:aws:lambda:ap-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `ap-east-1` | [arn:aws:lambda:ap-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `ap-northeast-1` | [arn:aws:lambda:ap-northeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `ap-northeast-2` | [arn:aws:lambda:ap-northeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `ap-northeast-3` | [arn:aws:lambda:ap-northeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `ap-southeast-1` | [arn:aws:lambda:ap-southeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `ap-southeast-2` | [arn:aws:lambda:ap-southeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `ap-southeast-3` | [arn:aws:lambda:ap-southeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `ap-southeast-4` | [arn:aws:lambda:ap-southeast-4:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `ap-southeast-5` | [arn:aws:lambda:ap-southeast-5:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `ap-southeast-7` | [arn:aws:lambda:ap-southeast-7:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `eu-central-1` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `eu-central-2` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `eu-west-1` | [arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `eu-west-2` | [arn:aws:lambda:eu-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `eu-west-3` | [arn:aws:lambda:eu-west-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `eu-north-1` | [arn:aws:lambda:eu-north-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `eu-south-1` | [arn:aws:lambda:eu-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `eu-south-2` | [arn:aws:lambda:eu-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `ca-central-1` | [arn:aws:lambda:ca-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `ca-west-1` | [arn:aws:lambda:ca-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `sa-east-1` | [arn:aws:lambda:sa-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `af-south-1` | [arn:aws:lambda:af-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `me-south-1` | [arn:aws:lambda:me-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `me-central-1` | [arn:aws:lambda:me-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `il-central-1` | [arn:aws:lambda:il-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `mx-central-1` | [arn:aws:lambda:mx-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `us-gov-west-1` | [arn:aws-us-gov:lambda:us-gov-west-1:165093116878:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `us-gov-east-1` | [arn:aws-us-gov:lambda:us-gov-east-1:165087284144:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | -| `cn-north-1` | [arn:aws-aws-cn:lambda:cn-north-1:498634801083:layer:AWSLambdaPowertoolsTypeScriptV2:36](#){: .copyMe} | +| `us-east-1` | [arn:aws:lambda:us-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `us-east-2` | [arn:aws:lambda:us-east-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `us-west-1` | [arn:aws:lambda:us-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `us-west-2` | [arn:aws:lambda:us-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `ap-south-1` | [arn:aws:lambda:ap-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `ap-south-2` | [arn:aws:lambda:ap-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `ap-east-1` | [arn:aws:lambda:ap-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `ap-northeast-1` | [arn:aws:lambda:ap-northeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `ap-northeast-2` | [arn:aws:lambda:ap-northeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `ap-northeast-3` | [arn:aws:lambda:ap-northeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `ap-southeast-1` | [arn:aws:lambda:ap-southeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `ap-southeast-2` | [arn:aws:lambda:ap-southeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `ap-southeast-3` | [arn:aws:lambda:ap-southeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `ap-southeast-4` | [arn:aws:lambda:ap-southeast-4:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `ap-southeast-5` | [arn:aws:lambda:ap-southeast-5:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `ap-southeast-7` | [arn:aws:lambda:ap-southeast-7:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `eu-central-1` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `eu-central-2` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `eu-west-1` | [arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `eu-west-2` | [arn:aws:lambda:eu-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `eu-west-3` | [arn:aws:lambda:eu-west-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `eu-north-1` | [arn:aws:lambda:eu-north-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `eu-south-1` | [arn:aws:lambda:eu-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `eu-south-2` | [arn:aws:lambda:eu-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `ca-central-1` | [arn:aws:lambda:ca-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `ca-west-1` | [arn:aws:lambda:ca-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `sa-east-1` | [arn:aws:lambda:sa-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `af-south-1` | [arn:aws:lambda:af-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `me-south-1` | [arn:aws:lambda:me-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `me-central-1` | [arn:aws:lambda:me-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `il-central-1` | [arn:aws:lambda:il-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `mx-central-1` | [arn:aws:lambda:mx-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `us-gov-west-1` | [arn:aws-us-gov:lambda:us-gov-west-1:165093116878:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `us-gov-east-1` | [arn:aws-us-gov:lambda:us-gov-east-1:165087284144:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `cn-north-1` | [arn:aws-aws-cn:lambda:cn-north-1:498634801083:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | ### Lookup Layer ARN via AWS SSM Parameter Store @@ -71,7 +71,7 @@ Parameter: LastModifiedDate: '2025-02-11T11:08:45.070000+01:00' Name: /aws/service/powertools/typescript/generic/all/2.14.0 Type: String - Value: arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36 + Value: arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37 Version: 1 ``` @@ -91,7 +91,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi === "AWS CLI command to download Lambda Layer content" ```bash - aws lambda get-layer-version-by-arn --arn arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36 --region {aws::region} + aws lambda get-layer-version-by-arn --arn arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37 --region {aws::region} ``` === "AWS CLI output" @@ -104,7 +104,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi "CodeSize": 3548324 }, "LayerArn": "arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2", - "LayerVersionArn": "arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36", + "LayerVersionArn": "arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37", "Description": "Powertools for AWS Lambda (TypeScript) version 2.18.0", "CreatedDate": "2025-04-08T07:38:30.424+0000", "Version": 24, @@ -138,7 +138,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi const powertoolsLayer = LayerVersion.fromLayerVersionArn( this, 'PowertoolsLayer', - `arn:aws:lambda:${Stack.of(this).region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36` + `arn:aws:lambda:${Stack.of(this).region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37` ); new NodejsFunction(this, 'Function', { @@ -208,7 +208,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi Type: AWS::Serverless::Function Properties: Layers: - - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36 + - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37 ``` You can also use AWS SSM Parameter Store to dynamically add Powertools for AWS Lambda and resolve the Layer ARN from SSM Parameter Store in your code, allowing you to pin to `latest` or a specific Powertools for AWS Lambda version. @@ -247,7 +247,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi hello: handler: lambda_function.lambda_handler layers: - - arn:aws:lambda:${aws:region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36 + - arn:aws:lambda:${aws:region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37 ``` If you use `esbuild` to bundle your code, make sure to exclude `@aws-lambda-powertools/*` and `@aws-sdk/*` from being bundled since the packages are already present the layer: @@ -282,7 +282,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi role = ... handler = "index.handler" runtime = "nodejs22.x" - layers = ["arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36"] + layers = ["arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37"] source_code_hash = filebase64sha256("lambda_function_payload.zip") } ``` @@ -317,7 +317,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi const lambdaFunction = new aws.lambda.Function('function', { layers: [ - pulumi.interpolate`arn:aws:lambda:${aws.getRegionOutput().name}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36` + pulumi.interpolate`arn:aws:lambda:${aws.getRegionOutput().name}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37` ], code: new pulumi.asset.FileArchive('lambda_function_payload.zip'), tracingConfig: { @@ -341,7 +341,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi name: "my-function", layers: { "@aws-lambda-powertools/*": - "arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36", + "arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37", }, }); ``` diff --git a/examples/app/cdk/example-stack.ts b/examples/app/cdk/example-stack.ts index 841982cf11..0db50ab9fb 100644 --- a/examples/app/cdk/example-stack.ts +++ b/examples/app/cdk/example-stack.ts @@ -39,7 +39,7 @@ export class PowertoolsExampleStack extends Stack { 'powertools-layer', `arn:aws:lambda:${ Stack.of(this).region - }:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36` + }:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37` ); // Items table diff --git a/examples/app/template.yaml b/examples/app/template.yaml index e65e5b910d..c6d5051fff 100644 --- a/examples/app/template.yaml +++ b/examples/app/template.yaml @@ -130,7 +130,7 @@ Resources: - DynamoDBReadPolicy: TableName: !Ref itemsTable Layers: - - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:36 + - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37 Environment: Variables: TABLE_NAME: !Ref itemsTable From 64616ee9f2ac5f527185cc6e446c8393230b83ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 14:33:52 +0100 Subject: [PATCH 152/255] chore(deps): bump squidfunk/mkdocs-material from `209b62d` to `86d21da` in /docs (#4490) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Dockerfile b/docs/Dockerfile index 279f8bf0c3..b3df3d8763 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -1,5 +1,5 @@ # version 9.5.35 -FROM squidfunk/mkdocs-material@sha256:209b62dd9530163cc5cf9a49853b5bb8570ffb3f3b5fe4eadc1d319bbda5ce2f +FROM squidfunk/mkdocs-material@sha256:86d21da4f45f16e30774bf911e5b4795da13ce0cd197dbf8d3d059f256b2cc37 # Install Node.js RUN apk add --no-cache nodejs=22.13.1-r0 npm From 9b334bfd3902eb996d5629ea05aa603aadbf1d89 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 15:18:40 +0100 Subject: [PATCH 153/255] chore(deps-dev): bump typedoc from 0.28.12 to 0.28.13 in the typescript group across 1 directory (#4491) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 70 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/package-lock.json b/package-lock.json index f5badb1a73..da33b3728b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "markdownlint-cli2": "^0.18.1", "middy5": "npm:@middy/core@^5.4.3", "middy6": "npm:@middy/core@^6.0.0", - "typedoc": "^0.28.12", + "typedoc": "^0.28.13", "typedoc-plugin-missing-exports": "^4.1.0", "typescript": "^5.9.2", "vitest": "^3.0.9" @@ -50,12 +50,12 @@ "version": "2.26.1", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/batch": "^2.26.0", - "@aws-lambda-powertools/idempotency": "^2.26.0", - "@aws-lambda-powertools/logger": "^2.26.0", - "@aws-lambda-powertools/metrics": "^2.26.0", - "@aws-lambda-powertools/parameters": "^2.26.0", - "@aws-lambda-powertools/tracer": "^2.26.0", + "@aws-lambda-powertools/batch": "^2.26.1", + "@aws-lambda-powertools/idempotency": "^2.26.1", + "@aws-lambda-powertools/logger": "^2.26.1", + "@aws-lambda-powertools/metrics": "^2.26.1", + "@aws-lambda-powertools/parameters": "^2.26.1", + "@aws-lambda-powertools/tracer": "^2.26.1", "@aws-sdk/client-ssm": "^3.883.0", "@aws-sdk/lib-dynamodb": "^3.883.0", "@middy/core": "^4.7.0", @@ -86,15 +86,15 @@ "valibot": "^1.1.0" }, "devDependencies": { - "@aws-lambda-powertools/batch": "^2.26.0", - "@aws-lambda-powertools/event-handler": "^2.26.0", - "@aws-lambda-powertools/idempotency": "^2.26.0", - "@aws-lambda-powertools/jmespath": "^2.26.0", - "@aws-lambda-powertools/logger": "^2.26.0", - "@aws-lambda-powertools/metrics": "^2.26.0", - "@aws-lambda-powertools/parameters": "^2.26.0", - "@aws-lambda-powertools/parser": "^2.26.0", - "@aws-lambda-powertools/tracer": "^2.26.0", + "@aws-lambda-powertools/batch": "^2.26.1", + "@aws-lambda-powertools/event-handler": "^2.26.1", + "@aws-lambda-powertools/idempotency": "^2.26.1", + "@aws-lambda-powertools/jmespath": "^2.26.1", + "@aws-lambda-powertools/logger": "^2.26.1", + "@aws-lambda-powertools/metrics": "^2.26.1", + "@aws-lambda-powertools/parameters": "^2.26.1", + "@aws-lambda-powertools/parser": "^2.26.1", + "@aws-lambda-powertools/tracer": "^2.26.1", "@aws-sdk/client-appconfigdata": "^3.883.0", "@aws-sdk/client-dynamodb": "^3.883.0", "@aws-sdk/client-secrets-manager": "^3.883.0", @@ -131,7 +131,7 @@ } }, "layers": { - "version": "2.26.0", + "version": "2.26.1", "license": "MIT-0", "dependencies": { "aws-cdk": "^2.1029.1", @@ -10089,9 +10089,9 @@ } }, "node_modules/typedoc": { - "version": "0.28.12", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.12.tgz", - "integrity": "sha512-H5ODu4f7N+myG4MfuSp2Vh6wV+WLoZaEYxKPt2y8hmmqNEMVrH69DAjjdmYivF4tP/C2jrIZCZhPalZlTU/ipA==", + "version": "0.28.13", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.13.tgz", + "integrity": "sha512-dNWY8msnYB2a+7Audha+aTF1Pu3euiE7ySp53w8kEsXoYw7dMouV5A1UsTUY345aB152RHnmRMDiovuBi7BD+w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -10744,10 +10744,10 @@ "version": "2.26.1", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0" + "@aws-lambda-powertools/commons": "2.26.1" }, "devDependencies": { - "@aws-lambda-powertools/parser": "2.26.0", + "@aws-lambda-powertools/parser": "2.26.1", "@aws-lambda-powertools/testing-utils": "file:../testing" } }, @@ -10764,7 +10764,7 @@ "version": "2.26.1", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0" + "@aws-lambda-powertools/commons": "2.26.1" } }, "packages/idempotency": { @@ -10772,8 +10772,8 @@ "version": "2.26.1", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0", - "@aws-lambda-powertools/jmespath": "2.26.0" + "@aws-lambda-powertools/commons": "2.26.1", + "@aws-lambda-powertools/jmespath": "2.26.1" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", @@ -10811,7 +10811,7 @@ "version": "2.26.1", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0" + "@aws-lambda-powertools/commons": "2.26.1" } }, "packages/kafka": { @@ -10819,7 +10819,7 @@ "version": "2.26.1", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0", + "@aws-lambda-powertools/commons": "2.26.1", "@standard-schema/spec": "^1.0.0" }, "devDependencies": { @@ -10849,7 +10849,7 @@ "version": "2.26.1", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0", + "@aws-lambda-powertools/commons": "2.26.1", "lodash.merge": "^4.6.2" }, "devDependencies": { @@ -10857,7 +10857,7 @@ "@types/lodash.merge": "^4.6.9" }, "peerDependencies": { - "@aws-lambda-powertools/jmespath": "2.26.0", + "@aws-lambda-powertools/jmespath": "2.26.1", "@middy/core": "4.x || 5.x || 6.x" }, "peerDependenciesMeta": { @@ -10874,7 +10874,7 @@ "version": "2.26.1", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0" + "@aws-lambda-powertools/commons": "2.26.1" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", @@ -10896,7 +10896,7 @@ "version": "2.26.1", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0" + "@aws-lambda-powertools/commons": "2.26.1" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", @@ -10942,7 +10942,7 @@ "version": "2.26.1", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0", + "@aws-lambda-powertools/commons": "2.26.1", "@standard-schema/spec": "^1.0.0" }, "devDependencies": { @@ -10983,7 +10983,7 @@ "version": "2.26.1", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0", + "@aws-lambda-powertools/commons": "2.26.1", "aws-xray-sdk-core": "^3.10.3" }, "devDependencies": { @@ -11005,8 +11005,8 @@ "version": "2.26.1", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.0", - "@aws-lambda-powertools/jmespath": "2.26.0", + "@aws-lambda-powertools/commons": "2.26.1", + "@aws-lambda-powertools/jmespath": "2.26.1", "ajv": "^8.17.1" } } diff --git a/package.json b/package.json index adc9444bbb..ce8822194d 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "markdownlint-cli2": "^0.18.1", "middy5": "npm:@middy/core@^5.4.3", "middy6": "npm:@middy/core@^6.0.0", - "typedoc": "^0.28.12", + "typedoc": "^0.28.13", "typedoc-plugin-missing-exports": "^4.1.0", "typescript": "^5.9.2", "vitest": "^3.0.9" From 141688be303ee3ab353e908c7792f737f04c2fcc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 15:21:20 +0100 Subject: [PATCH 154/255] chore(deps): bump mkdocs-material from 9.6.19 to 9.6.20 in /docs (#4492) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Swopnil Dangol --- docs/requirements.in | 2 +- docs/requirements.txt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/requirements.in b/docs/requirements.in index 0974e13f14..f8adff9be7 100644 --- a/docs/requirements.in +++ b/docs/requirements.in @@ -1,5 +1,5 @@ mike==1.1.2 -mkdocs-material==9.6.19 +mkdocs-material==9.6.20 mkdocs-git-revision-date-plugin==0.3.2 mkdocs-exclude==1.0.2 mkdocs-typedoc==1.0.4 diff --git a/docs/requirements.txt b/docs/requirements.txt index 703ec95a04..e53921473e 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -278,9 +278,9 @@ mkdocs-llmstxt==0.3.1 \ --hash=sha256:123119d9b984c1d1224ed5af250bfbc49879ad83decdaff59d8b0ebb459ddc54 \ --hash=sha256:31f5b6aaae6123c09a2b1c32912c3eb21ccb356b5db7abb867f105e8cc392653 # via -r requirements.in -mkdocs-material==9.6.19 \ - --hash=sha256:7492d2ac81952a467ca8a10cac915d6ea5c22876932f44b5a0f4f8e7d68ac06f \ - --hash=sha256:80e7b3f9acabfee9b1f68bd12c26e59c865b3d5bbfb505fd1344e970db02c4aa +mkdocs-material==9.6.20 \ + --hash=sha256:b8d8c8b0444c7c06dd984b55ba456ce731f0035c5a1533cc86793618eb1e6c82 \ + --hash=sha256:e1f84d21ec5fb730673c4259b2e0d39f8d32a3fef613e3a8e7094b012d43e790 # via -r requirements.in mkdocs-material-extensions==1.3.1 \ --hash=sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443 \ From 74eab7432960fe9d39c69eecc6fc5b6c5ee40f19 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 18:31:41 +0100 Subject: [PATCH 155/255] chore(deps): bump @types/node from 24.3.1 to 24.4.0 (#4493) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Swopnil Dangol --- examples/app/package.json | 4 ++-- package-lock.json | 20 ++++++++++---------- package.json | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 212f8dcdc7..d3419b498b 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -29,7 +29,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.152", - "@types/node": "24.3.1", + "@types/node": "24.4.0", "aws-cdk-lib": "^2.214.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -48,7 +48,7 @@ "@aws-sdk/lib-dynamodb": "^3.883.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", - "@types/node": "24.3.1", + "@types/node": "24.4.0", "aws-cdk": "^2.1029.1", "constructs": "^10.4.2", "esbuild": "^0.25.9", diff --git a/package-lock.json b/package-lock.json index da33b3728b..5a630da2a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.4", "@types/aws-lambda": "^8.10.152", - "@types/node": "^24.3.1", + "@types/node": "^24.4.0", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.1.6", @@ -60,7 +60,7 @@ "@aws-sdk/lib-dynamodb": "^3.883.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", - "@types/node": "24.3.1", + "@types/node": "24.4.0", "aws-cdk": "^2.1029.1", "constructs": "^10.4.2", "esbuild": "^0.25.9", @@ -68,7 +68,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.152", - "@types/node": "24.3.1", + "@types/node": "24.4.0", "aws-cdk-lib": "^2.214.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -5086,12 +5086,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.3.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.1.tgz", - "integrity": "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==", + "version": "24.4.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.4.0.tgz", + "integrity": "sha512-gUuVEAK4/u6F9wRLznPUU4WGUacSEBDPoC2TrBkw3GAnOLHBL45QdfHOXp1kJ4ypBGLxTOB+t7NJLpKoC3gznQ==", "license": "MIT", "dependencies": { - "undici-types": "~7.10.0" + "undici-types": "~7.11.0" } }, "node_modules/@types/promise-retry": { @@ -10165,9 +10165,9 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.11.0.tgz", + "integrity": "sha512-kt1ZriHTi7MU+Z/r9DOdAI3ONdaR3M3csEaRc6ewa4f4dTvX4cQCbJ4NkEn0ohE4hHtq85+PhPSTY+pO/1PwgA==", "license": "MIT" }, "node_modules/unicorn-magic": { diff --git a/package.json b/package.json index ce8822194d..b919b9b40e 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.4", "@types/aws-lambda": "^8.10.152", - "@types/node": "^24.3.1", + "@types/node": "^24.4.0", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.1.6", From b96575410093ec54be6299b16e3b65bf297dd780 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Sep 2025 17:31:05 +0100 Subject: [PATCH 156/255] chore(deps): bump @types/node from 24.4.0 to 24.5.0 (#4497) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/app/package.json | 4 ++-- package-lock.json | 20 ++++++++++---------- package.json | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index d3419b498b..1f9cf7ec47 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -29,7 +29,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.152", - "@types/node": "24.4.0", + "@types/node": "24.5.0", "aws-cdk-lib": "^2.214.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -48,7 +48,7 @@ "@aws-sdk/lib-dynamodb": "^3.883.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", - "@types/node": "24.4.0", + "@types/node": "24.5.0", "aws-cdk": "^2.1029.1", "constructs": "^10.4.2", "esbuild": "^0.25.9", diff --git a/package-lock.json b/package-lock.json index 5a630da2a4..1e4cd939f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.4", "@types/aws-lambda": "^8.10.152", - "@types/node": "^24.4.0", + "@types/node": "^24.5.0", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.1.6", @@ -60,7 +60,7 @@ "@aws-sdk/lib-dynamodb": "^3.883.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", - "@types/node": "24.4.0", + "@types/node": "24.5.0", "aws-cdk": "^2.1029.1", "constructs": "^10.4.2", "esbuild": "^0.25.9", @@ -68,7 +68,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.152", - "@types/node": "24.4.0", + "@types/node": "24.5.0", "aws-cdk-lib": "^2.214.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -5086,12 +5086,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.4.0.tgz", - "integrity": "sha512-gUuVEAK4/u6F9wRLznPUU4WGUacSEBDPoC2TrBkw3GAnOLHBL45QdfHOXp1kJ4ypBGLxTOB+t7NJLpKoC3gznQ==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.0.tgz", + "integrity": "sha512-y1dMvuvJspJiPSDZUQ+WMBvF7dpnEqN4x9DDC9ie5Fs/HUZJA3wFp7EhHoVaKX/iI0cRoECV8X2jL8zi0xrHCg==", "license": "MIT", "dependencies": { - "undici-types": "~7.11.0" + "undici-types": "~7.12.0" } }, "node_modules/@types/promise-retry": { @@ -10165,9 +10165,9 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.11.0.tgz", - "integrity": "sha512-kt1ZriHTi7MU+Z/r9DOdAI3ONdaR3M3csEaRc6ewa4f4dTvX4cQCbJ4NkEn0ohE4hHtq85+PhPSTY+pO/1PwgA==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz", + "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==", "license": "MIT" }, "node_modules/unicorn-magic": { diff --git a/package.json b/package.json index b919b9b40e..c51b42582b 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.4", "@types/aws-lambda": "^8.10.152", - "@types/node": "^24.4.0", + "@types/node": "^24.5.0", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.1.6", From 22b3b96c3b0120f7423c690eaf007a7b6d2aba29 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Sep 2025 20:01:13 +0100 Subject: [PATCH 157/255] chore(deps): bump the aws-sdk-v3 group across 1 directory with 88 updates (#4494) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/app/package.json | 4 +- examples/snippets/package.json | 10 +- package-lock.json | 3072 +++++++++++++++-------------- packages/idempotency/package.json | 4 +- packages/metrics/package.json | 2 +- packages/parameters/package.json | 10 +- packages/testing/package.json | 2 +- packages/tracer/package.json | 4 +- 8 files changed, 1559 insertions(+), 1549 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 1f9cf7ec47..166ceb0291 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -44,8 +44,8 @@ "@aws-lambda-powertools/metrics": "^2.26.1", "@aws-lambda-powertools/parameters": "^2.26.1", "@aws-lambda-powertools/tracer": "^2.26.1", - "@aws-sdk/client-ssm": "^3.883.0", - "@aws-sdk/lib-dynamodb": "^3.883.0", + "@aws-sdk/client-ssm": "^3.888.0", + "@aws-sdk/lib-dynamodb": "^3.888.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", "@types/node": "24.5.0", diff --git a/examples/snippets/package.json b/examples/snippets/package.json index af533eefc6..3b14b2a73b 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -33,11 +33,11 @@ "@aws-lambda-powertools/parameters": "^2.26.1", "@aws-lambda-powertools/parser": "^2.26.1", "@aws-lambda-powertools/tracer": "^2.26.1", - "@aws-sdk/client-appconfigdata": "^3.883.0", - "@aws-sdk/client-dynamodb": "^3.883.0", - "@aws-sdk/client-secrets-manager": "^3.883.0", - "@aws-sdk/client-ssm": "^3.883.0", - "@aws-sdk/util-dynamodb": "^3.883.0", + "@aws-sdk/client-appconfigdata": "^3.888.0", + "@aws-sdk/client-dynamodb": "^3.888.0", + "@aws-sdk/client-secrets-manager": "^3.888.0", + "@aws-sdk/client-ssm": "^3.888.0", + "@aws-sdk/util-dynamodb": "^3.888.0", "@middy/core": "^4.7.0", "@redis/client": "^5.8.2", "@valkey/valkey-glide": "^2.0.1", diff --git a/package-lock.json b/package-lock.json index 1e4cd939f4..505f393b4d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,8 +56,8 @@ "@aws-lambda-powertools/metrics": "^2.26.1", "@aws-lambda-powertools/parameters": "^2.26.1", "@aws-lambda-powertools/tracer": "^2.26.1", - "@aws-sdk/client-ssm": "^3.883.0", - "@aws-sdk/lib-dynamodb": "^3.883.0", + "@aws-sdk/client-ssm": "^3.888.0", + "@aws-sdk/lib-dynamodb": "^3.888.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", "@types/node": "24.5.0", @@ -95,11 +95,11 @@ "@aws-lambda-powertools/parameters": "^2.26.1", "@aws-lambda-powertools/parser": "^2.26.1", "@aws-lambda-powertools/tracer": "^2.26.1", - "@aws-sdk/client-appconfigdata": "^3.883.0", - "@aws-sdk/client-dynamodb": "^3.883.0", - "@aws-sdk/client-secrets-manager": "^3.883.0", - "@aws-sdk/client-ssm": "^3.883.0", - "@aws-sdk/util-dynamodb": "^3.883.0", + "@aws-sdk/client-appconfigdata": "^3.888.0", + "@aws-sdk/client-dynamodb": "^3.888.0", + "@aws-sdk/client-secrets-manager": "^3.888.0", + "@aws-sdk/client-ssm": "^3.888.0", + "@aws-sdk/util-dynamodb": "^3.888.0", "@middy/core": "^4.7.0", "@redis/client": "^5.8.2", "@valkey/valkey-glide": "^2.0.1", @@ -874,51 +874,51 @@ "link": true }, "node_modules/@aws-sdk/client-appconfigdata": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.883.0.tgz", - "integrity": "sha512-qRck+k/CtpTTQ4HGwiRD+fpx4ZW0HflTEt+gMbtFMP8PjAWoMYfyRU/xKRu2iq9ocWNPWACicPfSLzfFmbtsGg==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.888.0.tgz", + "integrity": "sha512-b4yc9Tl2TVZV8ZYpFLkCp7QTSyN4l+802Ehd33OKLiliq9j+s+eNL9X6y9uSF9mDHvsyAy3+gDbls3DrqIFjcQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-stream": "^4.2.4", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-stream": "^4.3.1", + "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, "engines": { @@ -926,50 +926,50 @@ } }, "node_modules/@aws-sdk/client-appsync": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-appsync/-/client-appsync-3.883.0.tgz", - "integrity": "sha512-+07NiCz74TOc0CfLRbAeH8NnZ3usrm82Ii4PBu6Zb1AYtDHziwGGmwp0QwpUM5jb4ZI+8w4HhGq9+diPb5I8Fg==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appsync/-/client-appsync-3.888.0.tgz", + "integrity": "sha512-MFZtS7oBrA5TiVMYIj07cPj3n+Yl9NGSLlP5nnTgNwt+qCiVe6RRccI1p4w8vX6omHHOTsJHEOz53gLNj2zb8w==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-stream": "^4.2.4", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-stream": "^4.3.1", + "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, "engines": { @@ -977,50 +977,50 @@ } }, "node_modules/@aws-sdk/client-cloudcontrol": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudcontrol/-/client-cloudcontrol-3.883.0.tgz", - "integrity": "sha512-OmxodH8LY+415vlcbLLHFzUupV48UffpXXsbKhEaqmgTpmgjo1iN9UsckFhIM3aNHeOnxzVan5D/6W9CBajGmA==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudcontrol/-/client-cloudcontrol-3.888.0.tgz", + "integrity": "sha512-BsQPotE/AsbK8QBteOpXhDeFrKjBDMdbradrA845o06t7OyU8rl+eF7oB8asdj/7/1dK3xgpIVwmKtir7TDJdg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.7", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", + "@smithy/util-waiter": "^4.1.1", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" @@ -1030,50 +1030,50 @@ } }, "node_modules/@aws-sdk/client-cloudformation": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.883.0.tgz", - "integrity": "sha512-5Zl79ZpzsjhopoCy/JzEzUXvky7Tp3a4Cfe3dnmlWY6xuTqW5Ob0Qvi0JOSD7tAi1MW91xcrwED1VGVlzGzz+w==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.888.0.tgz", + "integrity": "sha512-49Ve6lTSdG6oY+62s2m5or/SZOFJqZPm5r+Y/eS6XbX/sBdlHPxVvuBMI98J2zCR/bYagQ2jnWZVQwwDevMdmw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.7", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", + "@smithy/util-waiter": "^4.1.1", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" @@ -1083,52 +1083,52 @@ } }, "node_modules/@aws-sdk/client-cloudwatch": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.883.0.tgz", - "integrity": "sha512-LTlVaMc/45N64Mkz4nheYGdVYOvnCzF+ReOV6t98GACZ/tjIz2ufPJjzijD1j7KJ+fOM6L4HpmDqK/W+D4QlFA==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.888.0.tgz", + "integrity": "sha512-HfoIHfFtDAQLddROW1Tx9X6e3x2mzKTOBQRM5eAC2ARfSVqaiPUkqMI2GGQgyKLBptO8oui0G3wyfoZHP3HYeQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-compression": "^4.1.19", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.7", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-compression": "^4.2.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", + "@smithy/util-waiter": "^4.1.1", "tslib": "^2.6.2" }, "engines": { @@ -1136,52 +1136,52 @@ } }, "node_modules/@aws-sdk/client-cloudwatch-logs": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.883.0.tgz", - "integrity": "sha512-FiCShuNlBdJL20HOAX+lojTuwG8o0cV2Oe31aKNicCSQYkB/otkg3PdXqrK44Ho/1B0/D15UuEdnFMCZ8OyvCA==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.888.0.tgz", + "integrity": "sha512-eBuxqt6ltF5DLMw7jkGlqiS1MrAY90GCmXwKfUMSqqptBRSmD/0ytCIa1cphWxgHiouEuv4m53ofUHKxZ5xqVA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/eventstream-serde-browser": "^4.0.5", - "@smithy/eventstream-serde-config-resolver": "^4.1.3", - "@smithy/eventstream-serde-node": "^4.0.5", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/eventstream-serde-browser": "^4.1.1", + "@smithy/eventstream-serde-config-resolver": "^4.2.1", + "@smithy/eventstream-serde-node": "^4.1.1", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" @@ -1191,49 +1191,49 @@ } }, "node_modules/@aws-sdk/client-codebuild": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-codebuild/-/client-codebuild-3.883.0.tgz", - "integrity": "sha512-IYyrDQsR2TEn/nuBy3f21IAeVDQbbfXwuORw7PRuu1ULIbjnbGd1ehVHrYkCVyGP6hJO+zEf6uWOPOnBIyuubA==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-codebuild/-/client-codebuild-3.888.0.tgz", + "integrity": "sha512-8Vxg+vbPLtRTSCKGhUvsm3WJsQdGK2I/RLBhU7GlzA6YsXD5eamX5m7zMNSpYcj1ZhiU56XOQbj9tfO9o/lbuQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, "engines": { @@ -1241,49 +1241,49 @@ } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.883.0.tgz", - "integrity": "sha512-/uezRmLtkx7kZkC0o6B+hahCVBTij2ghCW+kXgbK0tz6Gl7WDYRIyszR9Vf0wDUqsj5S3hgBXKr6zR4V4ULTmw==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.888.0.tgz", + "integrity": "sha512-FsHdPF9iXnCGp3oOsEl1EHR0pc0sw0emlhG67QxfMj4imPwspsypTaPslkILe+0aAwKYW64i7J9Vd4JCQKVxgQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, "engines": { @@ -1291,51 +1291,51 @@ } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.883.0.tgz", - "integrity": "sha512-7Mrlix4PW+zoXH3fGYPMRgkxpFmHlD5qgfsZgkZ2glddtTxZbuTgKGwPSPu22Ax55Jiz3HRZgV5wZ2T0bHgZgA==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.888.0.tgz", + "integrity": "sha512-AjR+L/EK+HvPwj1AshKcFgNVQxYF2zsRRKaxU3gYxSpDpkIIlSz+GuM0MShPGgZocRTI80K3b9D3eFWHlI1Hqg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-endpoint-discovery": "3.873.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.7", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-endpoint-discovery": "3.887.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", + "@smithy/util-waiter": "^4.1.1", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" @@ -1345,51 +1345,51 @@ } }, "node_modules/@aws-sdk/client-ec2": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ec2/-/client-ec2-3.883.0.tgz", - "integrity": "sha512-OBIrw0uJr0bJy/+rbHzoPmVjlCsj0M/MAnnEOEDYVAsP/kkapG2u1KhNKQL2eMx9IHxC3GodqPKJGUrv1QZ4ZA==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ec2/-/client-ec2-3.888.0.tgz", + "integrity": "sha512-HAACb5sxpnZi+E6xDxUI24JdooVp51e23sNfr90dOlRdZ9H1wDkKCM0Gaiig0Nvf+x+/tcKaCMK1nxsTVEaq+Q==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-sdk-ec2": "3.882.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.7", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-sdk-ec2": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", + "@smithy/util-waiter": "^4.1.1", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" @@ -1399,50 +1399,50 @@ } }, "node_modules/@aws-sdk/client-ecr": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.883.0.tgz", - "integrity": "sha512-qNYoYZzOXFoqtBODi09dtv71OVpHdkLPk9trgHHxFpxHkhlFzfXGCHXLmxVTFSJ7DNGdxUSMWqFhS6kARnlE1w==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.888.0.tgz", + "integrity": "sha512-WErHOnnH0Z5zvbOBohHIpNoQq6wKLChrrAG1YMQrplKn3owlLBlVxidNWyzpd+pu+3XHN/yGItQ0qn7gC7yBGg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.7", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", + "@smithy/util-waiter": "^4.1.1", "tslib": "^2.6.2" }, "engines": { @@ -1450,50 +1450,50 @@ } }, "node_modules/@aws-sdk/client-ecs": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecs/-/client-ecs-3.883.0.tgz", - "integrity": "sha512-MojYGFI7uBGXLXXY0cTS07XKmIJN4QqYq2P0868trDeERxQrT03QcO6b8QTvT9ZIyu1gdrD9kX+yMiulGAFlGA==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecs/-/client-ecs-3.888.0.tgz", + "integrity": "sha512-mj1yI5/eVkofd5kt1GtKukFG5QFlFMI4V+TgXJf62vAVCGCUTlJCUxLovfuORi5WPiN1d91Eco2NHG2qMv8fqA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.7", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", + "@smithy/util-waiter": "^4.1.1", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" @@ -1503,50 +1503,50 @@ } }, "node_modules/@aws-sdk/client-elastic-load-balancing-v2": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-elastic-load-balancing-v2/-/client-elastic-load-balancing-v2-3.883.0.tgz", - "integrity": "sha512-bS8NCNvD0IzfjJYSt13eODZKLzSlMsfcXSkugKCht0PbGSi77P8u4TlL0BLSOsYDeLUrVIM2ze8dicdOeHbw1g==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-elastic-load-balancing-v2/-/client-elastic-load-balancing-v2-3.888.0.tgz", + "integrity": "sha512-qW3SHLNkASfbv2Xma5PYSYWMuGv0t328Jic3Rc1Gjek50nvQ9LTq3I+ka5szH+p2fIhQHtJ9Xu1+lbkRrLruZw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.7", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", + "@smithy/util-waiter": "^4.1.1", "tslib": "^2.6.2" }, "engines": { @@ -1554,50 +1554,50 @@ } }, "node_modules/@aws-sdk/client-iam": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-iam/-/client-iam-3.883.0.tgz", - "integrity": "sha512-UCU6qC2iNO1wmgRFjp4xbvn23wQSH4ATxooc8tgR3TH12lQzYV34ksseFx3mpP8JRE8QUgJ6EVX8yuf9XjNWTA==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-iam/-/client-iam-3.888.0.tgz", + "integrity": "sha512-BYJVOji9jrYcOiUsWspS94viNK0XCGb7QyLcHc4cyq2BXqTy3HXINnPtk+xHvep1LqRaIuyfIOGlmIKKsJ1tGA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.7", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", + "@smithy/util-waiter": "^4.1.1", "tslib": "^2.6.2" }, "engines": { @@ -1605,49 +1605,49 @@ } }, "node_modules/@aws-sdk/client-kms": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.883.0.tgz", - "integrity": "sha512-cB9br5OQQbavaeGytzaaZc558IcpIJVpX92GcbrPcdLsPWybG5wCw0U6XvZcsHJd2I7fVr+s0OVn5wf8bQvsSA==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.888.0.tgz", + "integrity": "sha512-VVwBRy6rCQDiku1Da3ilnENxdI6Et1jVqVSLuWlAfwtnRUdZrTM7iMMmenMXMfhT85lyXAZL171aHW8IHys0Dg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, "engines": { @@ -1655,54 +1655,54 @@ } }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.883.0.tgz", - "integrity": "sha512-kLqPovA/6N1Qfw10t2hyYEMf3bIM9zxXxtB5ADgUURYRKqjOnC7RuOhr7ezNVxNsZu5tjJJxrYWf3HljOuYYhQ==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.888.0.tgz", + "integrity": "sha512-5s3S+2E2jnyRnX/u5Dp4TCFANVcCKnUuvVLUc0jS9peUAPJLeE4ZfksC2XmWha3ZwInE/7XU2j7maPbM/BinkA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/eventstream-serde-browser": "^4.0.5", - "@smithy/eventstream-serde-config-resolver": "^4.1.3", - "@smithy/eventstream-serde-node": "^4.0.5", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-stream": "^4.2.4", - "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.7", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/eventstream-serde-browser": "^4.1.1", + "@smithy/eventstream-serde-config-resolver": "^4.2.1", + "@smithy/eventstream-serde-node": "^4.1.1", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-stream": "^4.3.1", + "@smithy/util-utf8": "^4.1.0", + "@smithy/util-waiter": "^4.1.1", "tslib": "^2.6.2" }, "engines": { @@ -1710,52 +1710,52 @@ } }, "node_modules/@aws-sdk/client-route-53": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-route-53/-/client-route-53-3.883.0.tgz", - "integrity": "sha512-S2r3zvOLvH2PX6oj7E8LvWgHAq/4zchQKvoHB0ovb4xRyJDcoAXawDuuTh9uOtnGcNIj7sbKhYD0ymkyE91Eww==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-route-53/-/client-route-53-3.888.0.tgz", + "integrity": "sha512-rYtv3m2cwYvu4o2pCxUNLtaHYKBs36FUZMeJat3hXLtENjJWj0yHUIHGcGY43ZpHyMhSxggWSrB8Rv3pEWcy+w==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-sdk-route53": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@aws-sdk/xml-builder": "3.873.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.7", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-sdk-route53": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@aws-sdk/xml-builder": "3.887.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", + "@smithy/util-waiter": "^4.1.1", "tslib": "^2.6.2" }, "engines": { @@ -1763,66 +1763,66 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.883.0.tgz", - "integrity": "sha512-+l/p5G/bbobzcils5wKSV1vQEITvJIXDkLfkMWLpF6CC3YfdSDlVn1VOD+NcfuOuVGv4UkwcJzWuC6eaX6t8jg==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.888.0.tgz", + "integrity": "sha512-MgYyF/qpvCMYVSiOpRJ5C/EtdFxuYAeF5SprtMsbf71xBiiCH5GurB616i+ZxJqHlfhBQTTvR0qugnWvk1Wqvw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-bucket-endpoint": "3.873.0", - "@aws-sdk/middleware-expect-continue": "3.873.0", - "@aws-sdk/middleware-flexible-checksums": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-location-constraint": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-sdk-s3": "3.883.0", - "@aws-sdk/middleware-ssec": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/signature-v4-multi-region": "3.883.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@aws-sdk/xml-builder": "3.873.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/eventstream-serde-browser": "^4.0.5", - "@smithy/eventstream-serde-config-resolver": "^4.1.3", - "@smithy/eventstream-serde-node": "^4.0.5", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-blob-browser": "^4.0.5", - "@smithy/hash-node": "^4.0.5", - "@smithy/hash-stream-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/md5-js": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-stream": "^4.2.4", - "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.7", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-bucket-endpoint": "3.887.0", + "@aws-sdk/middleware-expect-continue": "3.887.0", + "@aws-sdk/middleware-flexible-checksums": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-location-constraint": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-sdk-s3": "3.888.0", + "@aws-sdk/middleware-ssec": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/signature-v4-multi-region": "3.888.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@aws-sdk/xml-builder": "3.887.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/eventstream-serde-browser": "^4.1.1", + "@smithy/eventstream-serde-config-resolver": "^4.2.1", + "@smithy/eventstream-serde-node": "^4.1.1", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-blob-browser": "^4.1.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/hash-stream-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/md5-js": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-stream": "^4.3.1", + "@smithy/util-utf8": "^4.1.0", + "@smithy/util-waiter": "^4.1.1", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" @@ -1832,49 +1832,49 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.883.0.tgz", - "integrity": "sha512-qpt9oRPES5+DkE2vBmwu9FPcLIHQPj35hmLkupNptiXEYqN5eUJV/nINDUHJgyEsPN05Dc+847R+QH5u1rSFVg==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.888.0.tgz", + "integrity": "sha512-6BQMysniH1VQF/EMMLC6Wp4VlbEu+VXOn3fJAebeQaWKZlwhrelxo4v+OsHPAWgwgycyVfAyBEcLO68lK0lB5w==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" @@ -1884,49 +1884,49 @@ } }, "node_modules/@aws-sdk/client-sfn": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sfn/-/client-sfn-3.883.0.tgz", - "integrity": "sha512-0IfWMvcPdIWkP+VkWkEBCKBEhxeK3nKMWJp6crJIllIDQj3aJo456n0XUChzM1YpkaPN8q2QN4wiMz7iZVZcRQ==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sfn/-/client-sfn-3.888.0.tgz", + "integrity": "sha512-YSQyCtsorjTIdsLAiA4GsWweBm1AaQ+vAwpGrmFkHSxvmsQyY1wZzsgC69IfrIGaSfDkOm67VhPGBjB97eTmvA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" @@ -1936,50 +1936,50 @@ } }, "node_modules/@aws-sdk/client-ssm": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.883.0.tgz", - "integrity": "sha512-iqTo0elstBR9jgFlvNRVqb+DjR0j0R5cm9Fwm63RsMAcLJYXrSzMA2c6XZZEhbLzHt8ZkIot+yn4DnO5mIHriQ==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.888.0.tgz", + "integrity": "sha512-QnyKY3ikZtd0aw2lAMFs4uE24BkdMgyYQGil74xu0essW0aMBaw4c+XxTcmwKfXsMt1rBYQmjtwQsIXJXwy1Bw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.7", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", + "@smithy/util-waiter": "^4.1.1", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" @@ -1989,48 +1989,48 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.883.0.tgz", - "integrity": "sha512-Ybjw76yPceEBO7+VLjy5+/Gr0A1UNymSDHda5w8tfsS2iHZt/vuD6wrYpHdLoUx4H5la8ZhwcSfK/+kmE+QLPw==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.888.0.tgz", + "integrity": "sha512-8CLy/ehGKUmekjH+VtZJ4w40PqDg3u0K7uPziq/4P8Q7LLgsy8YQoHNbuY4am7JU3HWrqLXJI9aaz1+vPGPoWA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, "engines": { @@ -2038,49 +2038,49 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.883.0.tgz", - "integrity": "sha512-S3j+lkUPmgGq8fOHMFXXQI/P51Pf7Q6eA6vbJW5hztkgw+OMNcAuOiUJ2p9sTWA1XaAIkcqOPfx80xgDP939lg==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.888.0.tgz", + "integrity": "sha512-77hkMP0BKtDW8BqgxNUVLgmzUzI8pVQKi8o3AAa5hYcZ3L8fKtWyAt1d+vZ+ZTeUhnQa9BCsxmua5HvKl5LOlQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, "engines": { @@ -2088,50 +2088,50 @@ } }, "node_modules/@aws-sdk/client-xray": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.883.0.tgz", - "integrity": "sha512-l2diNBoqO16BDBuxMPZQJzy0EO9ZpLkpDrk0zJSkCTvid6H3NN4V3neM8o0cW1FhsvUW2zfqe0+Dm7oLCxOmfw==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.888.0.tgz", + "integrity": "sha512-HZnG7UuiTtMa7yMgGpZu6ODnBuQFvwy5cBZa4smxhzcCyPmjMsFJUDWAJmAMls7IRlb7Ad9Tj24C4XWR0br8AQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, "engines": { @@ -2139,24 +2139,24 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.883.0.tgz", - "integrity": "sha512-FmkqnqBLkXi4YsBPbF6vzPa0m4XKUuvgKDbamfw4DZX2CzfBZH6UU4IwmjNV3ZM38m0xraHarK8KIbGSadN3wg==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.888.0.tgz", + "integrity": "sha512-L3S2FZywACo4lmWv37Y4TbefuPJ1fXWyWwIJ3J4wkPYFJ47mmtUPqThlVrSbdTHkEjnZgJe5cRfxk0qCLsFh1w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.862.0", - "@aws-sdk/xml-builder": "3.873.0", - "@smithy/core": "^3.9.2", - "@smithy/node-config-provider": "^4.1.4", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/xml-builder": "3.887.0", + "@smithy/core": "^3.11.0", + "@smithy/node-config-provider": "^4.2.1", "@smithy/property-provider": "^4.0.5", - "@smithy/protocol-http": "^5.1.3", + "@smithy/protocol-http": "^5.2.1", "@smithy/signature-v4": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-utf8": "^4.0.0", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, @@ -2165,15 +2165,15 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.883.0.tgz", - "integrity": "sha512-r5KQ1UP1LxtZ5PfBQr08zgn1fIgpDlyDSk59h3kpj91+xcuaQtn3241D61iTv0ICFTaurO5SqM25f87aQuAsDw==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.888.0.tgz", + "integrity": "sha512-mGKLEAFsIaYci219lL42L22fEkbdwLSEuqeBN2D4LzNsbuGyLuE9vIRSOZr/wbHJ3UegI+1eCn0cF+qDgP4cdg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.883.0", - "@aws-sdk/types": "3.862.0", + "@aws-sdk/client-cognito-identity": "3.888.0", + "@aws-sdk/types": "3.887.0", "@smithy/property-provider": "^4.0.5", - "@smithy/types": "^4.3.2", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2181,15 +2181,15 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.883.0.tgz", - "integrity": "sha512-Z6tPBXPCodfhIF1rvQKoeRGMkwL6TK0xdl1UoMIA1x4AfBpPICAF77JkFBExk/pdiFYq1d04Qzddd/IiujSlLg==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.888.0.tgz", + "integrity": "sha512-shPi4AhUKbIk7LugJWvNpeZA8va7e5bOHAEKo89S0Ac8WDZt2OaNzbh/b9l0iSL2eEyte8UgIsYGcFxOwIF1VA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.883.0", - "@aws-sdk/types": "3.862.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/types": "3.887.0", "@smithy/property-provider": "^4.0.5", - "@smithy/types": "^4.3.2", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2197,20 +2197,20 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.883.0.tgz", - "integrity": "sha512-P589ug1lMOOEYLTaQJjSP+Gee34za8Kk2LfteNQfO9SpByHFgGj++Sg8VyIe30eZL8Q+i4qTt24WDCz1c+dgYg==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.888.0.tgz", + "integrity": "sha512-Jvuk6nul0lE7o5qlQutcqlySBHLXOyoPtiwE6zyKbGc7RVl0//h39Lab7zMeY2drMn8xAnIopL4606Fd8JI/Hw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.883.0", - "@aws-sdk/types": "3.862.0", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/node-http-handler": "^4.1.1", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/types": "3.887.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/node-http-handler": "^4.2.1", "@smithy/property-provider": "^4.0.5", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/util-stream": "^4.2.4", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/util-stream": "^4.3.1", "tslib": "^2.6.2" }, "engines": { @@ -2218,23 +2218,23 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.883.0.tgz", - "integrity": "sha512-n6z9HTzuDEdugXvPiE/95VJXbF4/gBffdV/SRHDJKtDHaRuvp/gggbfmfVSTFouGVnlKPb2pQWQsW3Nr/Y3Lrw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-env": "3.883.0", - "@aws-sdk/credential-provider-http": "3.883.0", - "@aws-sdk/credential-provider-process": "3.883.0", - "@aws-sdk/credential-provider-sso": "3.883.0", - "@aws-sdk/credential-provider-web-identity": "3.883.0", - "@aws-sdk/nested-clients": "3.883.0", - "@aws-sdk/types": "3.862.0", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.888.0.tgz", + "integrity": "sha512-M82ItvS5yq+tO6ZOV1ruaVs2xOne+v8HW85GFCXnz8pecrzYdgxh6IsVqEbbWruryG/mUGkWMbkBZoEsy4MgyA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-env": "3.888.0", + "@aws-sdk/credential-provider-http": "3.888.0", + "@aws-sdk/credential-provider-process": "3.888.0", + "@aws-sdk/credential-provider-sso": "3.888.0", + "@aws-sdk/credential-provider-web-identity": "3.888.0", + "@aws-sdk/nested-clients": "3.888.0", + "@aws-sdk/types": "3.887.0", "@smithy/credential-provider-imds": "^4.0.7", "@smithy/property-provider": "^4.0.5", "@smithy/shared-ini-file-loader": "^4.0.5", - "@smithy/types": "^4.3.2", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2242,22 +2242,22 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.883.0.tgz", - "integrity": "sha512-QIUhsatsrwfB9ZsKpmi0EySSfexVP61wgN7hr493DOileh2QsKW4XATEfsWNmx0dj9323Vg1Mix7bXtRfl9cGg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.883.0", - "@aws-sdk/credential-provider-http": "3.883.0", - "@aws-sdk/credential-provider-ini": "3.883.0", - "@aws-sdk/credential-provider-process": "3.883.0", - "@aws-sdk/credential-provider-sso": "3.883.0", - "@aws-sdk/credential-provider-web-identity": "3.883.0", - "@aws-sdk/types": "3.862.0", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.888.0.tgz", + "integrity": "sha512-KCrQh1dCDC8Y+Ap3SZa6S81kHk+p+yAaOQ5jC3dak4zhHW3RCrsGR/jYdemTOgbEGcA6ye51UbhWfrrlMmeJSA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.888.0", + "@aws-sdk/credential-provider-http": "3.888.0", + "@aws-sdk/credential-provider-ini": "3.888.0", + "@aws-sdk/credential-provider-process": "3.888.0", + "@aws-sdk/credential-provider-sso": "3.888.0", + "@aws-sdk/credential-provider-web-identity": "3.888.0", + "@aws-sdk/types": "3.887.0", "@smithy/credential-provider-imds": "^4.0.7", "@smithy/property-provider": "^4.0.5", "@smithy/shared-ini-file-loader": "^4.0.5", - "@smithy/types": "^4.3.2", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2265,16 +2265,16 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.883.0.tgz", - "integrity": "sha512-m1shbHY/Vppy4EdddG9r8x64TO/9FsCjokp5HbKcZvVoTOTgUJrdT8q2TAQJ89+zYIJDqsKbqfrmfwJ1zOdnGQ==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.888.0.tgz", + "integrity": "sha512-+aX6piSukPQ8DUS4JAH344GePg8/+Q1t0+kvSHAZHhYvtQ/1Zek3ySOJWH2TuzTPCafY4nmWLcQcqvU1w9+4Lw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.883.0", - "@aws-sdk/types": "3.862.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/types": "3.887.0", "@smithy/property-provider": "^4.0.5", "@smithy/shared-ini-file-loader": "^4.0.5", - "@smithy/types": "^4.3.2", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2282,18 +2282,18 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.883.0.tgz", - "integrity": "sha512-37ve9Tult08HLXrJFHJM/sGB/vO7wzI6v1RUUfeTiShqx8ZQ5fTzCTNY/duO96jCtCexmFNSycpQzh7lDIf0aA==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.888.0.tgz", + "integrity": "sha512-b1ZJji7LJ6E/j1PhFTyvp51in2iCOQ3VP6mj5H6f5OUnqn7efm41iNMoinKr87n0IKZw7qput5ggXVxEdPhouA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.883.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/token-providers": "3.883.0", - "@aws-sdk/types": "3.862.0", + "@aws-sdk/client-sso": "3.888.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/token-providers": "3.888.0", + "@aws-sdk/types": "3.887.0", "@smithy/property-provider": "^4.0.5", "@smithy/shared-ini-file-loader": "^4.0.5", - "@smithy/types": "^4.3.2", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2301,16 +2301,16 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.883.0.tgz", - "integrity": "sha512-SL82K9Jb0vpuTadqTO4Fpdu7SKtebZ3Yo4LZvk/U0UauVMlJj5ZTos0mFx1QSMB9/4TpqifYrSZcdnxgYg8Eqw==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.888.0.tgz", + "integrity": "sha512-7P0QNtsDzMZdmBAaY/vY1BsZHwTGvEz3bsn2bm5VSKFAeMmZqsHK1QeYdNsFjLtegnVh+wodxMq50jqLv3LFlA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.883.0", - "@aws-sdk/nested-clients": "3.883.0", - "@aws-sdk/types": "3.862.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/nested-clients": "3.888.0", + "@aws-sdk/types": "3.887.0", "@smithy/property-provider": "^4.0.5", - "@smithy/types": "^4.3.2", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2318,29 +2318,29 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.883.0.tgz", - "integrity": "sha512-gIoGVbOTAaWm9muDo5QI42EAYW03RyNbtGb+Yhiy72EX15aZhRsW9v9Gs1YxC2d7dTW5Zs3qXMcenoMzas5aQg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.883.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/credential-provider-cognito-identity": "3.883.0", - "@aws-sdk/credential-provider-env": "3.883.0", - "@aws-sdk/credential-provider-http": "3.883.0", - "@aws-sdk/credential-provider-ini": "3.883.0", - "@aws-sdk/credential-provider-node": "3.883.0", - "@aws-sdk/credential-provider-process": "3.883.0", - "@aws-sdk/credential-provider-sso": "3.883.0", - "@aws-sdk/credential-provider-web-identity": "3.883.0", - "@aws-sdk/nested-clients": "3.883.0", - "@aws-sdk/types": "3.862.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.888.0.tgz", + "integrity": "sha512-If2AnDiJJLT889imXn6cEM4WoduPgTye/vYiVXZaDqMvjk+tJVbA9uFuv1ixF3DHMC6aE0LU9cTjXX+I4TayFg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.888.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-cognito-identity": "3.888.0", + "@aws-sdk/credential-provider-env": "3.888.0", + "@aws-sdk/credential-provider-http": "3.888.0", + "@aws-sdk/credential-provider-ini": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/credential-provider-process": "3.888.0", + "@aws-sdk/credential-provider-sso": "3.888.0", + "@aws-sdk/credential-provider-web-identity": "3.888.0", + "@aws-sdk/nested-clients": "3.888.0", + "@aws-sdk/types": "3.887.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", "@smithy/credential-provider-imds": "^4.0.7", - "@smithy/node-config-provider": "^4.1.4", + "@smithy/node-config-provider": "^4.2.1", "@smithy/property-provider": "^4.0.5", - "@smithy/types": "^4.3.2", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2348,17 +2348,17 @@ } }, "node_modules/@aws-sdk/ec2-metadata-service": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/ec2-metadata-service/-/ec2-metadata-service-3.883.0.tgz", - "integrity": "sha512-eQRXYL2qkO0dcYUi/b2BiiKGpvFD9Rq5cYIJ6Hnn/JfsKtU9o94yZ7rJDMioKIAYP8bf8B03BmsGjkTwGgJoYw==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/ec2-metadata-service/-/ec2-metadata-service-3.888.0.tgz", + "integrity": "sha512-tq5SBNvvTTtB33EP1hpXViZPFCEhEyAptzj1YeYMiA0b4Lr4n/CRplgmXV6NpT2s9cR5BwkO65twoNRsIV4+OA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", - "@smithy/util-stream": "^4.2.4", + "@aws-sdk/types": "3.887.0", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", + "@smithy/util-stream": "^4.3.1", "tslib": "^2.6.2" }, "engines": { @@ -2379,34 +2379,34 @@ } }, "node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.883.0.tgz", - "integrity": "sha512-eLlgfePMRXBDBkHrLYcH0W+DjRg1gVbX8jUQExZ2R+0lotv8Gma53ZQaVYgLwR+sX/QIm29pdvMNeBUNrm2ksg==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.888.0.tgz", + "integrity": "sha512-Im2TsHOBKKtY6wCsrcg66bgIEZisJfJyI323ee8oIWlS9sPIgXo1tq2rVbYQfTu2srtYgmbvxts9uzNrrPVRyA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.883.0", - "@aws-sdk/util-dynamodb": "3.883.0", - "@smithy/core": "^3.9.2", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/util-dynamodb": "3.888.0", + "@smithy/core": "^3.11.0", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.883.0" + "@aws-sdk/client-dynamodb": "^3.888.0" } }, "node_modules/@aws-sdk/lib-storage": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.883.0.tgz", - "integrity": "sha512-6E7WEeFjbENGA3rilQoHwCtr8EHOxmQgPHcWQ+5o0jhG832xJZ8qzb+e2PXqZqj0N/yfkQAIVkRWzKFAb3/u1Q==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.888.0.tgz", + "integrity": "sha512-UCZsVxjnQ6QpVWI1ZiNGmxfd1+8YBNbriQJ5lssR2IudQt5ThGhamGkwoYBmFV4iwhmgIT2fn5+gErugFZuUhw==", "license": "Apache-2.0", "dependencies": { "@smithy/abort-controller": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/smithy-client": "^4.5.2", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/smithy-client": "^4.6.1", "buffer": "5.6.0", "events": "3.3.0", "stream-browserify": "3.0.0", @@ -2416,7 +2416,7 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-s3": "^3.883.0" + "@aws-sdk/client-s3": "^3.888.0" } }, "node_modules/@aws-sdk/lib-storage/node_modules/events": { @@ -2428,16 +2428,16 @@ } }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.873.0.tgz", - "integrity": "sha512-b4bvr0QdADeTUs+lPc9Z48kXzbKHXQKgTvxx/jXDgSW9tv4KmYPO1gIj6Z9dcrBkRWQuUtSW3Tu2S5n6pe+zeg==", + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.887.0.tgz", + "integrity": "sha512-qRCte/3MtNiMhPh4ZEGk9cHfAXq6IDTflvi2t1tkOIVZFyshkSCvNQNJrrE2D/ljVbOK1f3XbBDaF43EoQzIRQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.862.0", + "@aws-sdk/types": "3.887.0", "@aws-sdk/util-arn-parser": "3.873.0", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", "@smithy/util-config-provider": "^4.0.0", "tslib": "^2.6.2" }, @@ -2446,16 +2446,16 @@ } }, "node_modules/@aws-sdk/middleware-endpoint-discovery": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.873.0.tgz", - "integrity": "sha512-qKQocn1MzaLS9dt5xt3MvQsZaQzRsmOFdazWXkMup1AtFrULSUklsbHjm5fg5xyFPN8ipNzPi+MCXcgPzfpKkg==", + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.887.0.tgz", + "integrity": "sha512-ik+0B5nEMILseILZiBiOomcBuBV+fPzp1+u+zD9CWFjPy2ZnGdXtEgKec2mIjJKD1PxHcJm/lFD8/mHP3Rm9RA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/endpoint-cache": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", + "@aws-sdk/types": "3.887.0", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2463,14 +2463,14 @@ } }, "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.873.0.tgz", - "integrity": "sha512-GIqoc8WgRcf/opBOZXFLmplJQKwOMjiOMmDz9gQkaJ8FiVJoAp8EGVmK2TOWZMQUYsavvHYsHaor5R2xwPoGVg==", + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.887.0.tgz", + "integrity": "sha512-AlrTZZScDTG9SYeT82BC5cK/6Q4N0miN5xqMW/pbBqP3fNXlsdJOWKB+EKD3V6DV41EV5GVKHKe/1065xKSQ4w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", + "@aws-sdk/types": "3.887.0", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2478,23 +2478,23 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.883.0.tgz", - "integrity": "sha512-EloU4ZjkH+CXCHJcYElXo5nZ1vK6Miam/S02YSHk5JTrJkm4RV478KXXO29TIIAwZXcLT/FEQOZ9ZH/JHFFCFQ==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.888.0.tgz", + "integrity": "sha512-vdwd4wMAlXSg1bldhXyTsDSnyPP+bbEVihapejGKNd4gLfyyHwjTfbli+B/hEONGttQs5Dp54UMn8yW/UA189g==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/types": "3.862.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/types": "3.887.0", "@smithy/is-array-buffer": "^4.0.0", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-stream": "^4.2.4", - "@smithy/util-utf8": "^4.0.0", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-stream": "^4.3.1", + "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, "engines": { @@ -2502,14 +2502,14 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.873.0.tgz", - "integrity": "sha512-KZ/W1uruWtMOs7D5j3KquOxzCnV79KQW9MjJFZM/M0l6KI8J6V3718MXxFHsTjUE4fpdV6SeCNLV1lwGygsjJA==", + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.887.0.tgz", + "integrity": "sha512-ulzqXv6NNqdu/kr0sgBYupWmahISHY+azpJidtK6ZwQIC+vBUk9NdZeqQpy7KVhIk2xd4+5Oq9rxapPwPI21CA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", + "@aws-sdk/types": "3.887.0", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2517,13 +2517,13 @@ } }, "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.873.0.tgz", - "integrity": "sha512-r+hIaORsW/8rq6wieDordXnA/eAu7xAPLue2InhoEX6ML7irP52BgiibHLpt9R0psiCzIHhju8qqKa4pJOrmiw==", + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.887.0.tgz", + "integrity": "sha512-eU/9Cq4gg2sS32bOomxdx2YF43kb+o70pMhnEBBnVVeqzE8co78SO5FQdWfRTfhNJgTyQ6Vgosx//CNMPIfZPg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/types": "^4.3.2", + "@aws-sdk/types": "3.887.0", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2531,13 +2531,13 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.876.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.876.0.tgz", - "integrity": "sha512-cpWJhOuMSyz9oV25Z/CMHCBTgafDCbv7fHR80nlRrPdPZ8ETNsahwRgltXP1QJJ8r3X/c1kwpOR7tc+RabVzNA==", + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.887.0.tgz", + "integrity": "sha512-YbbgLI6jKp2qSoAcHnXrQ5jcuc5EYAmGLVFgMVdk8dfCfJLfGGSaOLxF4CXC7QYhO50s+mPPkhBYejCik02Kug==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/types": "^4.3.2", + "@aws-sdk/types": "3.887.0", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2545,14 +2545,15 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.873.0.tgz", - "integrity": "sha512-OtgY8EXOzRdEWR//WfPkA/fXl0+WwE8hq0y9iw2caNyKPtca85dzrrZWnPqyBK/cpImosrpR1iKMYr41XshsCg==", + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.887.0.tgz", + "integrity": "sha512-tjrUXFtQnFLo+qwMveq5faxP5MQakoLArXtqieHphSqZTXm21wDJM73hgT4/PQQGTwgYjDKqnqsE1hvk0hcfDw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", + "@aws-sdk/types": "3.887.0", + "@aws/lambda-invoke-store": "^0.0.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2560,18 +2561,18 @@ } }, "node_modules/@aws-sdk/middleware-sdk-ec2": { - "version": "3.882.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-ec2/-/middleware-sdk-ec2-3.882.0.tgz", - "integrity": "sha512-8oaMNXj6VnDsN2eczx3RC/NDm/uf/Vt0EKEkvF6WSZlc1nqFhvVj0UiCS08VIZpeRNNc9IBselbCTI/4vQ9M4Q==", + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-ec2/-/middleware-sdk-ec2-3.887.0.tgz", + "integrity": "sha512-8lJRulmhpGpELX+ZHp9LnOX5vULPClh1KSNtHVLN/ClGuFVTpBgXVpAs5F/pU8dJSJnbY6qEpY4VDlIuEBtFRA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-format-url": "3.873.0", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/protocol-http": "^5.1.3", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-format-url": "3.887.0", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", "@smithy/signature-v4": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2579,13 +2580,13 @@ } }, "node_modules/@aws-sdk/middleware-sdk-route53": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-route53/-/middleware-sdk-route53-3.873.0.tgz", - "integrity": "sha512-nzW9Bh874QiswJC14KEznJ8vUD8vVyIUT4fUJdVVAL0iuvT1cx7czWKyA8POPe6WKS2N55Olh8hiGBa/NmHETQ==", + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-route53/-/middleware-sdk-route53-3.887.0.tgz", + "integrity": "sha512-3E91c2XuIJ4WTKMZjGEAlrbqb3mwh24KPpgd9yzOzFPWkc1ZkfbrHeFUNYpR3BR2DJJ+No6rE9NIznvcH0hZ4g==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/types": "^4.3.2", + "@aws-sdk/types": "3.887.0", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2593,24 +2594,24 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.883.0.tgz", - "integrity": "sha512-i4sGOj9xhSN6/LkYj3AJ2SRWENnpN9JySwNqIoRqO1Uon8gfyNLJd1yV+s43vXQsU5wbKWVXK8l9SRo+vNTQwg==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.888.0.tgz", + "integrity": "sha512-rKOFNfqgqOfrdcLGF8fcO75azWS2aq2ksRHFoIEFru5FJxzu/yDAhY4C2FKiP/X34xeIUS2SbE/gQgrgWHSN2g==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.883.0", - "@aws-sdk/types": "3.862.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/types": "3.887.0", "@aws-sdk/util-arn-parser": "3.873.0", - "@smithy/core": "^3.9.2", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/protocol-http": "^5.1.3", + "@smithy/core": "^3.11.0", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", "@smithy/signature-v4": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-stream": "^4.2.4", - "@smithy/util-utf8": "^4.0.0", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-stream": "^4.3.1", + "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, "engines": { @@ -2618,13 +2619,13 @@ } }, "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.873.0.tgz", - "integrity": "sha512-AF55J94BoiuzN7g3hahy0dXTVZahVi8XxRBLgzNp6yQf0KTng+hb/V9UQZVYY1GZaDczvvvnqC54RGe9OZZ9zQ==", + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.887.0.tgz", + "integrity": "sha512-1ixZks0IDkdac1hjPe4vdLSuD9HznkhblCEb4T0wNyw3Ee1fdXg+MlcPWywzG5zkPXLcIrULUzJg/OSYfaDXcQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/types": "^4.3.2", + "@aws-sdk/types": "3.887.0", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2632,17 +2633,17 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.883.0.tgz", - "integrity": "sha512-q58uLYnGLg7hsnWpdj7Cd1Ulsq1/PUJOHvAfgcBuiDE/+Fwh0DZxZZyjrU+Cr+dbeowIdUaOO8BEDDJ0CUenJw==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.888.0.tgz", + "integrity": "sha512-ZkcUkoys8AdrNNG7ATjqw2WiXqrhTvT+r4CIK3KhOqIGPHX0p0DQWzqjaIl7ZhSUToKoZ4Ud7MjF795yUr73oA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.883.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@smithy/core": "^3.9.2", - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@smithy/core": "^3.11.0", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2650,48 +2651,48 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.883.0.tgz", - "integrity": "sha512-IhzDM+v0ga53GOOrZ9jmGNr7JU5OR6h6ZK9NgB7GXaa+gsDbqfUuXRwyKDYXldrTXf1sUR3vy1okWDXA7S2ejQ==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.888.0.tgz", + "integrity": "sha512-py4o4RPSGt+uwGvSBzR6S6cCBjS4oTX5F8hrHFHfPCdIOMVjyOBejn820jXkCrcdpSj3Qg1yUZXxsByvxc9Lyg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.883.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.876.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.879.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.883.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.9.2", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.21", - "@smithy/middleware-retry": "^4.1.22", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.5.2", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.0.29", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, "engines": { @@ -2699,16 +2700,16 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.873.0.tgz", - "integrity": "sha512-q9sPoef+BBG6PJnc4x60vK/bfVwvRWsPgcoQyIra057S/QGjq5VkjvNk6H8xedf6vnKlXNBwq9BaANBXnldUJg==", + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.887.0.tgz", + "integrity": "sha512-VdSMrIqJ3yjJb/fY+YAxrH/lCVv0iL8uA+lbMNfQGtO5tB3Zx6SU9LEpUwBNX8fPK1tUpI65CNE4w42+MY/7Mg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/types": "^4.3.2", + "@aws-sdk/types": "3.887.0", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/types": "^4.5.0", "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.5", + "@smithy/util-middleware": "^4.1.1", "tslib": "^2.6.2" }, "engines": { @@ -2716,16 +2717,16 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.883.0.tgz", - "integrity": "sha512-86PO7+xhuQ48cD3xlZgEpRxVP1lBarWAJy23sB6zZLHgZSbnYXYjRFuyxX4PlFzqllM3PDKJvq3WnXeqSXeNsg==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.888.0.tgz", + "integrity": "sha512-FmOHUaJzEhqfcpyh0L7HLwYcYopK13Dbmuf+oUyu56/RoeB1nLnltH1VMQVj8v3Am2IwlGR+/JpFyrdkErN+cA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.883.0", - "@aws-sdk/types": "3.862.0", - "@smithy/protocol-http": "^5.1.3", + "@aws-sdk/middleware-sdk-s3": "3.888.0", + "@aws-sdk/types": "3.887.0", + "@smithy/protocol-http": "^5.2.1", "@smithy/signature-v4": "^5.1.3", - "@smithy/types": "^4.3.2", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2733,17 +2734,17 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.883.0.tgz", - "integrity": "sha512-tcj/Z5paGn9esxhmmkEW7gt39uNoIRbXG1UwJrfKu4zcTr89h86PDiIE2nxUO3CMQf1KgncPpr5WouPGzkh/QQ==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.888.0.tgz", + "integrity": "sha512-WA3NF+3W8GEuCMG1WvkDYbB4z10G3O8xuhT7QSjhvLYWQ9CPt3w4VpVIfdqmUn131TCIbhCzD0KN/1VJTjAjyw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.883.0", - "@aws-sdk/nested-clients": "3.883.0", - "@aws-sdk/types": "3.862.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/nested-clients": "3.888.0", + "@aws-sdk/types": "3.887.0", "@smithy/property-provider": "^4.0.5", "@smithy/shared-ini-file-loader": "^4.0.5", - "@smithy/types": "^4.3.2", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2751,12 +2752,12 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.862.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", - "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.887.0.tgz", + "integrity": "sha512-fmTEJpUhsPsovQ12vZSpVTEP/IaRoJAMBGQXlQNjtCpkBp6Iq3KQDa/HDaPINE+3xxo6XvTdtibsNOd5zJLV9A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.2", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2776,9 +2777,9 @@ } }, "node_modules/@aws-sdk/util-dynamodb": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.883.0.tgz", - "integrity": "sha512-vxesHv1nn9KxQ5jAAqBip6QECJJptyvqNMN/5MBbS9QlpflgUacRlgqKaP+e1Cu2WXA2ZGgbTeGLqs3Rl9nQrg==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.888.0.tgz", + "integrity": "sha512-CmgHcL+k259MsMoZb9Xy90/kv98XwVuFMdcX3ClcR2UwGyJSpfjMRu78x2tl4rIMzYElDqso2FTD367n91kssg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2787,19 +2788,19 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.883.0" + "@aws-sdk/client-dynamodb": "^3.888.0" } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.879.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.879.0.tgz", - "integrity": "sha512-aVAJwGecYoEmbEFju3127TyJDF9qJsKDUUTRMDuS8tGn+QiWQFnfInmbt+el9GU1gEJupNTXV+E3e74y51fb7A==", + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.887.0.tgz", + "integrity": "sha512-kpegvT53KT33BMeIcGLPA65CQVxLUL/C3gTz9AzlU/SDmeusBHX4nRApAicNzI/ltQ5lxZXbQn18UczzBuwF1w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@smithy/util-endpoints": "^3.0.7", + "@aws-sdk/types": "3.887.0", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", "tslib": "^2.6.2" }, "engines": { @@ -2807,14 +2808,14 @@ } }, "node_modules/@aws-sdk/util-format-url": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.873.0.tgz", - "integrity": "sha512-v//b9jFnhzTKKV3HFTw2MakdM22uBAs2lBov51BWmFXuFtSTdBLrR7zgfetQPE3PVkFai0cmtJQPdc3MX+T/cQ==", + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.887.0.tgz", + "integrity": "sha512-ABDSP6KsrdD+JC7qwMqUpLXqPidvfgT+Q+W8sGGuk/IBy7smgZDOdYSZLE4VBbQpH3N/zSJuslAWhL2x37Qwww==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/querystring-builder": "^4.0.5", - "@smithy/types": "^4.3.2", + "@aws-sdk/types": "3.887.0", + "@smithy/querystring-builder": "^4.1.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2834,27 +2835,27 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.873.0.tgz", - "integrity": "sha512-AcRdbK6o19yehEcywI43blIBhOCSo6UgyWcuOJX5CFF8k39xm1ILCjQlRRjchLAxWrm0lU0Q7XV90RiMMFMZtA==", + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.887.0.tgz", + "integrity": "sha512-X71UmVsYc6ZTH4KU6hA5urOzYowSXc3qvroagJNLJYU1ilgZ529lP4J9XOYfEvTXkLR1hPFSRxa43SrwgelMjA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/types": "^4.3.2", + "@aws-sdk/types": "3.887.0", + "@smithy/types": "^4.5.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.883.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.883.0.tgz", - "integrity": "sha512-28cQZqC+wsKUHGpTBr+afoIdjS6IoEJkMqcZsmo2Ag8LzmTa6BUWQenFYB0/9BmDy4PZFPUn+uX+rJgWKB+jzA==", + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.888.0.tgz", + "integrity": "sha512-rSB3OHyuKXotIGfYEo//9sU0lXAUrTY28SUUnxzOGYuQsAt0XR5iYwBAp+RjV6x8f+Hmtbg0PdCsy1iNAXa0UQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.883.0", - "@aws-sdk/types": "3.862.0", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/types": "^4.3.2", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/types": "3.887.0", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2870,18 +2871,27 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.873.0.tgz", - "integrity": "sha512-kLO7k7cGJ6KaHiExSJWojZurF7SnGMDHXRuQunFnEoD0n1yB6Lqy/S/zHiQ7oJnBhPr9q0TW9qFkrsZb1Uc54w==", + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.887.0.tgz", + "integrity": "sha512-lMwgWK1kNgUhHGfBvO/5uLe7TKhycwOn3eRCqsKPT9aPCx/HWuTlpcQp8oW2pCRGLS7qzcxqpQulcD+bbUL7XQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.2", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.0.1.tgz", + "integrity": "sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", @@ -4248,12 +4258,12 @@ "dev": true }, "node_modules/@smithy/abort-controller": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.1.0.tgz", - "integrity": "sha512-wEhSYznxOmx7EdwK1tYEWJF5+/wmSFsff9BfTOn8oO/+KPl3gsmThrb6MJlWbOC391+Ya31s5JuHiC2RlT80Zg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.1.1.tgz", + "integrity": "sha512-vkzula+IwRvPR6oKQhMYioM3A/oX/lFCZiwuxkQbRhqJS2S4YRY2k7k/SyR2jMf3607HLtbEwlRxi0ndXHMjRg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.4.0", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4286,15 +4296,15 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.2.0.tgz", - "integrity": "sha512-FA10YhPFLy23uxeWu7pOM2ctlw+gzbPMTZQwrZ8FRIfyJ/p8YIVz7AVTB5jjLD+QIerydyKcVMZur8qzzDILAQ==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.2.2.tgz", + "integrity": "sha512-IT6MatgBWagLybZl1xQcURXRICvqz1z3APSCAI9IqdvfCkrA7RaQIEfgC6G/KvfxnDfQUDqFV+ZlixcuFznGBQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.2.0", - "@smithy/types": "^4.4.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.0", + "@smithy/util-middleware": "^4.1.1", "tslib": "^2.6.2" }, "engines": { @@ -4302,18 +4312,18 @@ } }, "node_modules/@smithy/core": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.10.0.tgz", - "integrity": "sha512-bXyD3Ij6b1qDymEYlEcF+QIjwb9gObwZNaRjETJsUEvSIzxFdynSQ3E4ysY7lUFSBzeWBNaFvX+5A0smbC2q6A==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.11.0.tgz", + "integrity": "sha512-Abs5rdP1o8/OINtE49wwNeWuynCu0kme1r4RI3VXVrHr4odVDG7h7mTnw1WXXfN5Il+c25QOnrdL2y56USfxkA==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.1.0", - "@smithy/protocol-http": "^5.2.0", - "@smithy/types": "^4.4.0", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", - "@smithy/util-middleware": "^4.1.0", - "@smithy/util-stream": "^4.3.0", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-stream": "^4.3.1", "@smithy/util-utf8": "^4.1.0", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", @@ -4324,15 +4334,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.1.0.tgz", - "integrity": "sha512-iVwNhxTsCQTPdp++4C/d9xvaDmuEWhXi55qJobMp9QMaEHRGH3kErU4F8gohtdsawRqnUy/ANylCjKuhcR2mPw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.1.2.tgz", + "integrity": "sha512-JlYNq8TShnqCLg0h+afqe2wLAwZpuoSgOyzhYvTgbiKBWRov+uUve+vrZEQO6lkdLOWPh7gK5dtb9dS+KGendg==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.2.0", - "@smithy/property-provider": "^4.1.0", - "@smithy/types": "^4.4.0", - "@smithy/url-parser": "^4.1.0", + "@smithy/node-config-provider": "^4.2.2", + "@smithy/property-provider": "^4.1.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", "tslib": "^2.6.2" }, "engines": { @@ -4340,13 +4350,13 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.1.0.tgz", - "integrity": "sha512-MSOb6pwG3Tss1UwlZMHC+rYergWCo4fwep3Y1fJxwdLLxReSaKFfXxPQhEHi/8LSNQFEcBYBxybgjXjw4jJWqQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.1.1.tgz", + "integrity": "sha512-PwkQw1hZwHTQB6X5hSUWz2OSeuj5Z6enWuAqke7DgWoP3t6vg3ktPpqPz3Erkn6w+tmsl8Oss6nrgyezoea2Iw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.4.0", + "@smithy/types": "^4.5.0", "@smithy/util-hex-encoding": "^4.1.0", "tslib": "^2.6.2" }, @@ -4355,13 +4365,13 @@ } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.1.0.tgz", - "integrity": "sha512-VvHXoBoLos2OCdMtUvKWK7ckcvun6ZP4KBYhf38+kszk6BEuK9k8c3xbIMIpC6K4vTK72qHlHAdBoR9qU+F7xw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.1.1.tgz", + "integrity": "sha512-Q9QWdAzRaIuVkefupRPRFAasaG/droBqn1feiMnmLa+LLEUG45pqX1+FurHFmlqiCfobB3nUlgoJfeXZsr7MPA==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.1.0", - "@smithy/types": "^4.4.0", + "@smithy/eventstream-serde-universal": "^4.1.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4369,12 +4379,12 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.2.0.tgz", - "integrity": "sha512-T7YlcU0cP2bjAC4eXo9E6puqrrmqv5VHBL8bPMOMgEE1p4m+bwkDWRQpeiXqn/idoKM1qwXq8PvRLYmpbYB6uw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.2.1.tgz", + "integrity": "sha512-oSUkF9zDN9zcOUBMtxp8RewJlh71E9NoHWU8jE3hU9JMYCsmW4assVTpgic/iS3/dM317j6hO5x18cc3XrfvEw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.4.0", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4382,13 +4392,13 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.1.0.tgz", - "integrity": "sha512-WlIKVRkcPjwuN3x+e8+5KOI9nL6s93bxgWH+39VwwQMl+4FagKPtTM3VCumSoZJ9qn/CNl4W5mVdFFRkDF84lQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.1.1.tgz", + "integrity": "sha512-tn6vulwf/ScY0vjhzptSJuDJJqlhNtUjkxJ4wiv9E3SPoEqTEKbaq6bfqRO7nvhTG29ALICRcvfFheOUPl8KNA==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.1.0", - "@smithy/types": "^4.4.0", + "@smithy/eventstream-serde-universal": "^4.1.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4396,13 +4406,13 @@ } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.1.0.tgz", - "integrity": "sha512-GjMezHHd0xrjJcWLAcnXlVePe7PY8KsdxzKeXcMn7V3vfIScGUpKQJrlSmEXwzFH9Mjl0G0EdOS5GzewZEwtxg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.1.1.tgz", + "integrity": "sha512-uLOAiM/Dmgh2CbEXQx+6/ssK7fbzFhd+LjdyFxXid5ZBCbLHTFHLdD/QbXw5aEDsLxQhgzDxLLsZhsftAYwHJA==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^4.1.0", - "@smithy/types": "^4.4.0", + "@smithy/eventstream-codec": "^4.1.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4410,14 +4420,14 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.2.0.tgz", - "integrity": "sha512-VZenjDdVaUGiy3hwQtxm75nhXZrhFG+3xyL93qCQAlYDyhT/jeDWM8/3r5uCFMlTmmyrIjiDyiOynVFchb0BSg==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.2.1.tgz", + "integrity": "sha512-5/3wxKNtV3wO/hk1is+CZUhL8a1yy/U+9u9LKQ9kZTkMsHaQjJhc3stFfiujtMnkITjzWfndGA2f7g9Uh9vKng==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.2.0", - "@smithy/querystring-builder": "^4.1.0", - "@smithy/types": "^4.4.0", + "@smithy/protocol-http": "^5.2.1", + "@smithy/querystring-builder": "^4.1.1", + "@smithy/types": "^4.5.0", "@smithy/util-base64": "^4.1.0", "tslib": "^2.6.2" }, @@ -4426,14 +4436,14 @@ } }, "node_modules/@smithy/hash-blob-browser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.1.0.tgz", - "integrity": "sha512-brRgh2qEYPHYImfqoQB/xfcT/CjSz9Z/dH2vURSS0lIw3bImFK5t15l4iypwRw4GtZlZTK/VsLqsR54OJWRerg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.1.1.tgz", + "integrity": "sha512-avAtk++s1e/1VODf+rg7c9R2pB5G9y8yaJaGY4lPZI2+UIqVyuSDMikWjeWfBVmFZ3O7NpDxBbUCyGhThVUKWQ==", "license": "Apache-2.0", "dependencies": { "@smithy/chunked-blob-reader": "^5.1.0", "@smithy/chunked-blob-reader-native": "^4.1.0", - "@smithy/types": "^4.4.0", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4441,12 +4451,12 @@ } }, "node_modules/@smithy/hash-node": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.1.0.tgz", - "integrity": "sha512-mXkJQ/6lAXTuoSsEH+d/fHa4ms4qV5LqYoPLYhmhCRTNcMMdg+4Ya8cMgU1W8+OR40eX0kzsExT7fAILqtTl2w==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.1.1.tgz", + "integrity": "sha512-H9DIU9WBLhYrvPs9v4sYvnZ1PiAI0oc8CgNQUJ1rpN3pP7QADbTOUjchI2FB764Ub0DstH5xbTqcMJu1pnVqxA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.4.0", + "@smithy/types": "^4.5.0", "@smithy/util-buffer-from": "^4.1.0", "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" @@ -4456,12 +4466,12 @@ } }, "node_modules/@smithy/hash-stream-node": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.1.0.tgz", - "integrity": "sha512-9TToqq62msanK/L6pV1ZAOm2+1VgCz9gE6/TVJhZXV352DnAItaO9jx6FFGujUDXrRJV0lpwe4c0vymz/vXMUQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.1.1.tgz", + "integrity": "sha512-3ztT4pV0Moazs3JAYFdfKk11kYFDo4b/3R3+xVjIm6wY9YpJf+xfz+ocEnNKcWAdcmSMqi168i2EMaKmJHbJMA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.4.0", + "@smithy/types": "^4.5.0", "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, @@ -4470,12 +4480,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.1.0.tgz", - "integrity": "sha512-4/FcV6aCMzgpM4YyA/GRzTtG28G0RQJcWK722MmpIgzOyfSceWcI9T9c8matpHU9qYYLaWtk8pSGNCLn5kzDRw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.1.1.tgz", + "integrity": "sha512-1AqLyFlfrrDkyES8uhINRlJXmHA2FkG+3DY8X+rmLSqmFwk3DJnvhyGzyByPyewh2jbmV+TYQBEfngQax8IFGg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.4.0", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4495,12 +4505,12 @@ } }, "node_modules/@smithy/md5-js": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.1.0.tgz", - "integrity": "sha512-RW1+/E3rv80254ekFqiUTM8ExtN0dG9dkUwU2x17rxS4Mn2ib3SrTCdayCiNbfj6xWHupzgOJB6iNoXiOzNe6g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.1.1.tgz", + "integrity": "sha512-MvWXKK743BuHjr/hnWuT6uStdKEaoqxHAQUvbKJPPZM5ZojTNFI5D+47BoQfBE5RgGlRRty05EbWA+NXDv+hIA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.4.0", + "@smithy/types": "^4.5.0", "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, @@ -4509,19 +4519,19 @@ } }, "node_modules/@smithy/middleware-compression": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-4.2.0.tgz", - "integrity": "sha512-SMvkezP4xWwUmPYLX959JN4uthj9hWBOaPhmK44bxvvNwCySEATkLbujJ53XKwn2uFvrb8FDOdY1z6VQoE6OCQ==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-4.2.2.tgz", + "integrity": "sha512-rXE9uwFvzJtqJmu7BZlJ1PVSJM/+sopo20SI6g0VqrhtYVmmbXJcpGyo/TP1ufPtnNQ2G6R10Gvec/6TRxQR1Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.10.0", + "@smithy/core": "^3.11.0", "@smithy/is-array-buffer": "^4.1.0", - "@smithy/node-config-provider": "^4.2.0", - "@smithy/protocol-http": "^5.2.0", - "@smithy/types": "^4.4.0", + "@smithy/node-config-provider": "^4.2.2", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", "@smithy/util-config-provider": "^4.1.0", - "@smithy/util-middleware": "^4.1.0", + "@smithy/util-middleware": "^4.1.1", "@smithy/util-utf8": "^4.1.0", "fflate": "0.8.1", "tslib": "^2.6.2" @@ -4531,13 +4541,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.1.0.tgz", - "integrity": "sha512-x3dgLFubk/ClKVniJu+ELeZGk4mq7Iv0HgCRUlxNUIcerHTLVmq7Q5eGJL0tOnUltY6KFw5YOKaYxwdcMwox/w==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.1.1.tgz", + "integrity": "sha512-9wlfBBgTsRvC2JxLJxv4xDGNBrZuio3AgSl0lSFX7fneW2cGskXTYpFxCdRYD2+5yzmsiTuaAJD1Wp7gWt9y9w==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.2.0", - "@smithy/types": "^4.4.0", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4545,18 +4555,18 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.2.0.tgz", - "integrity": "sha512-J1eCF7pPDwgv7fGwRd2+Y+H9hlIolF3OZ2PjptonzzyOXXGh/1KGJAHpEcY1EX+WLlclKu2yC5k+9jWXdUG4YQ==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.2.2.tgz", + "integrity": "sha512-M51KcwD+UeSOFtpALGf5OijWt915aQT5eJhqnMKJt7ZTfDfNcvg2UZgIgTZUoiORawb6o5lk4n3rv7vnzQXgsA==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.10.0", - "@smithy/middleware-serde": "^4.1.0", - "@smithy/node-config-provider": "^4.2.0", - "@smithy/shared-ini-file-loader": "^4.1.0", - "@smithy/types": "^4.4.0", - "@smithy/url-parser": "^4.1.0", - "@smithy/util-middleware": "^4.1.0", + "@smithy/core": "^3.11.0", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/node-config-provider": "^4.2.2", + "@smithy/shared-ini-file-loader": "^4.2.0", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-middleware": "^4.1.1", "tslib": "^2.6.2" }, "engines": { @@ -4564,18 +4574,18 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.2.0.tgz", - "integrity": "sha512-raL5oWYf5ALl3jCJrajE8enKJEnV/2wZkKS6mb3ZRY2tg3nj66ssdWy5Ps8E6Yu8Wqh3Tt+Sb9LozjvwZupq+A==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.2.2.tgz", + "integrity": "sha512-KZJueEOO+PWqflv2oGx9jICpHdBYXwCI19j7e2V3IMwKgFcXc9D9q/dsTf4B+uCnYxjNoS1jpyv6pGNGRsKOXA==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.2.0", - "@smithy/protocol-http": "^5.2.0", - "@smithy/service-error-classification": "^4.1.0", - "@smithy/smithy-client": "^4.6.0", - "@smithy/types": "^4.4.0", - "@smithy/util-middleware": "^4.1.0", - "@smithy/util-retry": "^4.1.0", + "@smithy/node-config-provider": "^4.2.2", + "@smithy/protocol-http": "^5.2.1", + "@smithy/service-error-classification": "^4.1.1", + "@smithy/smithy-client": "^4.6.2", + "@smithy/types": "^4.5.0", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" @@ -4585,13 +4595,13 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.1.0.tgz", - "integrity": "sha512-CtLFYlHt7c2VcztyVRc+25JLV4aGpmaSv9F1sPB0AGFL6S+RPythkqpGDa2XBQLJQooKkjLA1g7Xe4450knShg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.1.1.tgz", + "integrity": "sha512-lh48uQdbCoj619kRouev5XbWhCwRKLmphAif16c4J6JgJ4uXjub1PI6RL38d3BLliUvSso6klyB/LTNpWSNIyg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.2.0", - "@smithy/types": "^4.4.0", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4599,12 +4609,12 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.1.0.tgz", - "integrity": "sha512-91Fuw4IKp0eK8PNhMXrHRcYA1jvbZ9BJGT91wwPy3bTQT8mHTcQNius/EhSQTlT9QUI3Ki1wjHeNXbWK0tO8YQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.1.1.tgz", + "integrity": "sha512-ygRnniqNcDhHzs6QAPIdia26M7e7z9gpkIMUe/pK0RsrQ7i5MblwxY8078/QCnGq6AmlUUWgljK2HlelsKIb/A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.4.0", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4612,14 +4622,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.2.0.tgz", - "integrity": "sha512-8/fpilqKurQ+f8nFvoFkJ0lrymoMJ+5/CQV5IcTv/MyKhk2Q/EFYCAgTSWHD4nMi9ux9NyBBynkyE9SLg2uSLA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.2.2.tgz", + "integrity": "sha512-SYGTKyPvyCfEzIN5rD8q/bYaOPZprYUPD2f5g9M7OjaYupWOoQFYJ5ho+0wvxIRf471i2SR4GoiZ2r94Jq9h6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.1.0", - "@smithy/shared-ini-file-loader": "^4.1.0", - "@smithy/types": "^4.4.0", + "@smithy/property-provider": "^4.1.1", + "@smithy/shared-ini-file-loader": "^4.2.0", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4627,15 +4637,15 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.2.0.tgz", - "integrity": "sha512-G4NV70B4hF9vBrUkkvNfWO6+QR4jYjeO4tc+4XrKCb4nPYj49V9Hu8Ftio7Mb0/0IlFyEOORudHrm+isY29nCA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.2.1.tgz", + "integrity": "sha512-REyybygHlxo3TJICPF89N2pMQSf+p+tBJqpVe1+77Cfi9HBPReNjTgtZ1Vg73exq24vkqJskKDpfF74reXjxfw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.1.0", - "@smithy/protocol-http": "^5.2.0", - "@smithy/querystring-builder": "^4.1.0", - "@smithy/types": "^4.4.0", + "@smithy/abort-controller": "^4.1.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/querystring-builder": "^4.1.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4643,12 +4653,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.1.0.tgz", - "integrity": "sha512-eksMjMHUlG5PwOUWO3k+rfLNOPVPJ70mUzyYNKb5lvyIuAwS4zpWGsxGiuT74DFWonW0xRNy+jgzGauUzX7SyA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.1.1.tgz", + "integrity": "sha512-gm3ZS7DHxUbzC2wr8MUCsAabyiXY0gaj3ROWnhSx/9sPMc6eYLMM4rX81w1zsMaObj2Lq3PZtNCC1J6lpEY7zg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.4.0", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4656,12 +4666,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.2.0.tgz", - "integrity": "sha512-bwjlh5JwdOQnA01be+5UvHK4HQz4iaRKlVG46hHSJuqi0Ribt3K06Z1oQ29i35Np4G9MCDgkOGcHVyLMreMcbg==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.2.1.tgz", + "integrity": "sha512-T8SlkLYCwfT/6m33SIU/JOVGNwoelkrvGjFKDSDtVvAXj/9gOT78JVJEas5a+ETjOu4SVvpCstKgd0PxSu/aHw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.4.0", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4669,12 +4679,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.1.0.tgz", - "integrity": "sha512-JqTWmVIq4AF8R8OK/2cCCiQo5ZJ0SRPsDkDgLO5/3z8xxuUp1oMIBBjfuueEe+11hGTZ6rRebzYikpKc6yQV9Q==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.1.1.tgz", + "integrity": "sha512-J9b55bfimP4z/Jg1gNo+AT84hr90p716/nvxDkPGCD4W70MPms0h8KF50RDRgBGZeL83/u59DWNqJv6tEP/DHA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.4.0", + "@smithy/types": "^4.5.0", "@smithy/util-uri-escape": "^4.1.0", "tslib": "^2.6.2" }, @@ -4683,12 +4693,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.1.0.tgz", - "integrity": "sha512-VgdHhr8YTRsjOl4hnKFm7xEMOCRTnKw3FJ1nU+dlWNhdt/7eEtxtkdrJdx7PlRTabdANTmvyjE4umUl9cK4awg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.1.1.tgz", + "integrity": "sha512-63TEp92YFz0oQ7Pj9IuI3IgnprP92LrZtRAkE3c6wLWJxfy/yOPRt39IOKerVr0JS770olzl0kGafXlAXZ1vng==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.4.0", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4696,24 +4706,24 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.1.0.tgz", - "integrity": "sha512-UBpNFzBNmS20jJomuYn++Y+soF8rOK9AvIGjS9yGP6uRXF5rP18h4FDUsoNpWTlSsmiJ87e2DpZo9ywzSMH7PQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.1.1.tgz", + "integrity": "sha512-Iam75b/JNXyDE41UvrlM6n8DNOa/r1ylFyvgruTUx7h2Uk7vDNV9AAwP1vfL1fOL8ls0xArwEGVcGZVd7IO/Cw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.4.0" + "@smithy/types": "^4.5.0" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.1.0.tgz", - "integrity": "sha512-W0VMlz9yGdQ/0ZAgWICFjFHTVU0YSfGoCVpKaExRM/FDkTeP/yz8OKvjtGjs6oFokCRm0srgj/g4Cg0xuHu8Rw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.2.0.tgz", + "integrity": "sha512-OQTfmIEp2LLuWdxa8nEEPhZmiOREO6bcB6pjs0AySf4yiZhl6kMOfqmcwcY8BaBPX+0Tb+tG7/Ia/6mwpoZ7Pw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.4.0", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4721,16 +4731,16 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.2.0.tgz", - "integrity": "sha512-ObX1ZqG2DdZQlXx9mLD7yAR8AGb7yXurGm+iWx9x4l1fBZ8CZN2BRT09aSbcXVPZXWGdn5VtMuupjxhOTI2EjA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.2.1.tgz", + "integrity": "sha512-M9rZhWQLjlQVCCR37cSjHfhriGRN+FQ8UfgrYNufv66TJgk+acaggShl3KS5U/ssxivvZLlnj7QH2CUOKlxPyA==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^4.1.0", - "@smithy/protocol-http": "^5.2.0", - "@smithy/types": "^4.4.0", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", "@smithy/util-hex-encoding": "^4.1.0", - "@smithy/util-middleware": "^4.1.0", + "@smithy/util-middleware": "^4.1.1", "@smithy/util-uri-escape": "^4.1.0", "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" @@ -4740,17 +4750,17 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.6.0.tgz", - "integrity": "sha512-TvlIshqx5PIi0I0AiR+PluCpJ8olVG++xbYkAIGCUkByaMUlfOXLgjQTmYbr46k4wuDe8eHiTIlUflnjK2drPQ==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.6.2.tgz", + "integrity": "sha512-u82cjh/x7MlMat76Z38TRmEcG6JtrrxN4N2CSNG5o2v2S3hfLAxRgSgFqf0FKM3dglH41Evknt/HOX+7nfzZ3g==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.10.0", - "@smithy/middleware-endpoint": "^4.2.0", - "@smithy/middleware-stack": "^4.1.0", - "@smithy/protocol-http": "^5.2.0", - "@smithy/types": "^4.4.0", - "@smithy/util-stream": "^4.3.0", + "@smithy/core": "^3.11.0", + "@smithy/middleware-endpoint": "^4.2.2", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", + "@smithy/util-stream": "^4.3.1", "tslib": "^2.6.2" }, "engines": { @@ -4758,9 +4768,9 @@ } }, "node_modules/@smithy/types": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.4.0.tgz", - "integrity": "sha512-4jY91NgZz+ZnSFcVzWwngOW6VuK3gR/ihTwSU1R/0NENe9Jd8SfWgbhDCAGUWL3bI7DiDSW7XF6Ui6bBBjrqXw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.5.0.tgz", + "integrity": "sha512-RkUpIOsVlAwUIZXO1dsz8Zm+N72LClFfsNqf173catVlvRZiwPy0x2u0JLEA4byreOPKDZPGjmPDylMoP8ZJRg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -4770,13 +4780,13 @@ } }, "node_modules/@smithy/url-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.1.0.tgz", - "integrity": "sha512-/LYEIOuO5B2u++tKr1NxNxhZTrr3A63jW8N73YTwVeUyAlbB/YM+hkftsvtKAcMt3ADYo0FsF1GY3anehffSVQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.1.1.tgz", + "integrity": "sha512-bx32FUpkhcaKlEoOMbScvc93isaSiRM75pQ5IgIBaMkT7qMlIibpPRONyx/0CvrXHzJLpOn/u6YiDX2hcvs7Dg==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.1.0", - "@smithy/types": "^4.4.0", + "@smithy/querystring-parser": "^4.1.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4847,14 +4857,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.1.0.tgz", - "integrity": "sha512-D27cLtJtC4EEeERJXS+JPoogz2tE5zeE3zhWSSu6ER5/wJ5gihUxIzoarDX6K1U27IFTHit5YfHqU4Y9RSGE0w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.1.2.tgz", + "integrity": "sha512-QKrOw01DvNHKgY+3p4r9Ut4u6EHLVZ01u6SkOMe6V6v5C+nRPXJeWh72qCT1HgwU3O7sxAIu23nNh+FOpYVZKA==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.1.0", - "@smithy/smithy-client": "^4.6.0", - "@smithy/types": "^4.4.0", + "@smithy/property-provider": "^4.1.1", + "@smithy/smithy-client": "^4.6.2", + "@smithy/types": "^4.5.0", "bowser": "^2.11.0", "tslib": "^2.6.2" }, @@ -4863,17 +4873,17 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.1.0.tgz", - "integrity": "sha512-gnZo3u5dP1o87plKupg39alsbeIY1oFFnCyV2nI/++pL19vTtBLgOyftLEjPjuXmoKn2B2rskX8b7wtC/+3Okg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.1.2.tgz", + "integrity": "sha512-l2yRmSfx5haYHswPxMmCR6jGwgPs5LjHLuBwlj9U7nNBMS43YV/eevj+Xq1869UYdiynnMrCKtoOYQcwtb6lKg==", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.2.0", - "@smithy/credential-provider-imds": "^4.1.0", - "@smithy/node-config-provider": "^4.2.0", - "@smithy/property-provider": "^4.1.0", - "@smithy/smithy-client": "^4.6.0", - "@smithy/types": "^4.4.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/credential-provider-imds": "^4.1.2", + "@smithy/node-config-provider": "^4.2.2", + "@smithy/property-provider": "^4.1.1", + "@smithy/smithy-client": "^4.6.2", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4881,13 +4891,13 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.1.0.tgz", - "integrity": "sha512-5LFg48KkunBVGrNs3dnQgLlMXJLVo7k9sdZV5su3rjO3c3DmQ2LwUZI0Zr49p89JWK6sB7KmzyI2fVcDsZkwuw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.1.2.tgz", + "integrity": "sha512-+AJsaaEGb5ySvf1SKMRrPZdYHRYSzMkCoK16jWnIMpREAnflVspMIDeCVSZJuj+5muZfgGpNpijE3mUNtjv01Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.2.0", - "@smithy/types": "^4.4.0", + "@smithy/node-config-provider": "^4.2.2", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4907,12 +4917,12 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.1.0.tgz", - "integrity": "sha512-612onNcKyxhP7/YOTKFTb2F6sPYtMRddlT5mZvYf1zduzaGzkYhpYIPxIeeEwBZFjnvEqe53Ijl2cYEfJ9d6/Q==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.1.1.tgz", + "integrity": "sha512-CGmZ72mL29VMfESz7S6dekqzCh8ZISj3B+w0g1hZFXaOjGTVaSqfAEFAq8EGp8fUL+Q2l8aqNmt8U1tglTikeg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.4.0", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4920,13 +4930,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.1.0.tgz", - "integrity": "sha512-5AGoBHb207xAKSVwaUnaER+L55WFY8o2RhlafELZR3mB0J91fpL+Qn+zgRkPzns3kccGaF2vy0HmNVBMWmN6dA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.1.1.tgz", + "integrity": "sha512-jGeybqEZ/LIordPLMh5bnmnoIgsqnp4IEimmUp5c5voZ8yx+5kAlN5+juyr7p+f7AtZTgvhmInQk4Q0UVbrZ0Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.1.0", - "@smithy/types": "^4.4.0", + "@smithy/service-error-classification": "^4.1.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4934,14 +4944,14 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.3.0.tgz", - "integrity": "sha512-ZOYS94jksDwvsCJtppHprUhsIscRnCKGr6FXCo3SxgQ31ECbza3wqDBqSy6IsAak+h/oAXb1+UYEBmDdseAjUQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.3.1.tgz", + "integrity": "sha512-khKkW/Jqkgh6caxMWbMuox9+YfGlsk9OnHOYCGVEdYQb/XVzcORXHLYUubHmmda0pubEDncofUrPNniS9d+uAA==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.2.0", - "@smithy/node-http-handler": "^4.2.0", - "@smithy/types": "^4.4.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/types": "^4.5.0", "@smithy/util-base64": "^4.1.0", "@smithy/util-buffer-from": "^4.1.0", "@smithy/util-hex-encoding": "^4.1.0", @@ -4978,13 +4988,13 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.1.0.tgz", - "integrity": "sha512-IUuj2zpGdeKaY5OdGnU83BUJsv7OA9uw3rNVSOuvzLMXMpBTU+W6V0SsQh6iI32lKUJArlnEU4BIzp83hghR/g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.1.1.tgz", + "integrity": "sha512-PJBmyayrlfxM7nbqjomF4YcT1sApQwZio0NHSsT0EzhJqljRmvhzqZua43TyEs80nJk2Cn2FGPg/N8phH6KeCQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.1.0", - "@smithy/types": "^4.4.0", + "@smithy/abort-controller": "^4.1.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -10777,8 +10787,8 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.883.0", - "@aws-sdk/lib-dynamodb": "^3.883.0", + "@aws-sdk/client-dynamodb": "^3.888.0", + "@aws-sdk/lib-dynamodb": "^3.888.0", "aws-sdk-client-mock": "^4.1.0" }, "peerDependencies": { @@ -10878,7 +10888,7 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.883.0", + "@aws-sdk/client-cloudwatch": "^3.888.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, @@ -10900,11 +10910,11 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.883.0", - "@aws-sdk/client-dynamodb": "^3.883.0", - "@aws-sdk/client-secrets-manager": "^3.883.0", - "@aws-sdk/client-ssm": "^3.883.0", - "@aws-sdk/util-dynamodb": "^3.883.0", + "@aws-sdk/client-appconfigdata": "^3.888.0", + "@aws-sdk/client-dynamodb": "^3.888.0", + "@aws-sdk/client-secrets-manager": "^3.888.0", + "@aws-sdk/client-ssm": "^3.888.0", + "@aws-sdk/util-dynamodb": "^3.888.0", "@smithy/util-base64": "^4.0.0", "aws-sdk-client-mock": "^4.1.0" }, @@ -10967,7 +10977,7 @@ "license": "MIT-0", "dependencies": { "@aws-cdk/toolkit-lib": "^1.8.1", - "@aws-sdk/client-lambda": "^3.883.0", + "@aws-sdk/client-lambda": "^3.888.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.214.0", "esbuild": "^0.25.9", @@ -10988,8 +10998,8 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.883.0", - "@aws-sdk/client-xray": "^3.883.0" + "@aws-sdk/client-dynamodb": "^3.888.0", + "@aws-sdk/client-xray": "^3.888.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x" diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index a7009a6260..1c23058d99 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -150,8 +150,8 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.883.0", - "@aws-sdk/lib-dynamodb": "^3.883.0", + "@aws-sdk/client-dynamodb": "^3.888.0", + "@aws-sdk/lib-dynamodb": "^3.888.0", "aws-sdk-client-mock": "^4.1.0" } } diff --git a/packages/metrics/package.json b/packages/metrics/package.json index 6a9012e84a..db404e997b 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -64,7 +64,7 @@ "main": "./lib/cjs/index.js", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.883.0", + "@aws-sdk/client-cloudwatch": "^3.888.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, diff --git a/packages/parameters/package.json b/packages/parameters/package.json index 48af7f88e3..382d9715cc 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -155,11 +155,11 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.883.0", - "@aws-sdk/client-dynamodb": "^3.883.0", - "@aws-sdk/client-secrets-manager": "^3.883.0", - "@aws-sdk/client-ssm": "^3.883.0", - "@aws-sdk/util-dynamodb": "^3.883.0", + "@aws-sdk/client-appconfigdata": "^3.888.0", + "@aws-sdk/client-dynamodb": "^3.888.0", + "@aws-sdk/client-secrets-manager": "^3.888.0", + "@aws-sdk/client-ssm": "^3.888.0", + "@aws-sdk/util-dynamodb": "^3.888.0", "@smithy/util-base64": "^4.0.0", "aws-sdk-client-mock": "^4.1.0" }, diff --git a/packages/testing/package.json b/packages/testing/package.json index b89726f990..b90656d5db 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -98,7 +98,7 @@ "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/testing#readme", "dependencies": { "@aws-cdk/toolkit-lib": "^1.8.1", - "@aws-sdk/client-lambda": "^3.883.0", + "@aws-sdk/client-lambda": "^3.888.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.214.0", "esbuild": "^0.25.9", diff --git a/packages/tracer/package.json b/packages/tracer/package.json index 44688c43d6..2b82120c25 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -29,8 +29,8 @@ "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.883.0", - "@aws-sdk/client-xray": "^3.883.0" + "@aws-sdk/client-dynamodb": "^3.888.0", + "@aws-sdk/client-xray": "^3.888.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x" From ef67b43921f1d67b06b3257fb0f96c74e0d6dbae Mon Sep 17 00:00:00 2001 From: Swopnil Dangol Date: Wed, 17 Sep 2025 12:04:10 +0100 Subject: [PATCH 158/255] fix(batch): fixed the build issue with Batch processor due to missing dependencies (#4498) Co-authored-by: Andrea Amorosi --- docs/features/batch.md | 3 + package-lock.json | 78 +-- packages/batch/package.json | 6 +- .../batch/src/BasePartialBatchProcessor.ts | 6 +- packages/batch/src/BatchProcessor.ts | 36 +- packages/batch/src/parser.ts | 27 +- packages/batch/src/types.ts | 11 +- packages/batch/tests/helpers/factories.ts | 1 + packages/batch/tests/unit/parsing.test.ts | 485 +++++++----------- 9 files changed, 309 insertions(+), 344 deletions(-) diff --git a/docs/features/batch.md b/docs/features/batch.md index 7c5de6d3da..088deff619 100644 --- a/docs/features/batch.md +++ b/docs/features/batch.md @@ -358,6 +358,9 @@ Available transformers by event type: --8<-- "examples/snippets/batch/samples/parser_SQS.json" ``` +!!! note + If `innerSchema` is used with DynamoDB streams, the schema will be applied to both the `NewImage` and the `OldImage` by default. If you want to have dedicated schemas, see the section below. + #### Using full event schema For complete control over validation, extend the built-in schemas with your custom payload schema. This approach gives you full control over the entire event structure. diff --git a/package-lock.json b/package-lock.json index 505f393b4d..b896b6e615 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9967,14 +9967,14 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -9984,11 +9984,14 @@ } }, "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -9999,9 +10002,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -10256,24 +10259,24 @@ } }, "node_modules/vite": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.5.tgz", + "integrity": "sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -10282,14 +10285,14 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", - "less": "*", + "less": "^4.0.0", "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" @@ -10354,11 +10357,14 @@ } }, "node_modules/vite/node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -10384,9 +10390,9 @@ } }, "node_modules/vite/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -10754,11 +10760,13 @@ "version": "2.26.1", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1" + "@aws-lambda-powertools/commons": "2.26.1", + "@standard-schema/spec": "^1.0.0" }, "devDependencies": { "@aws-lambda-powertools/parser": "2.26.1", - "@aws-lambda-powertools/testing-utils": "file:../testing" + "@aws-lambda-powertools/testing-utils": "file:../testing", + "zod": "^4.1.8" } }, "packages/commons": { @@ -11021,4 +11029,4 @@ } } } -} +} \ No newline at end of file diff --git a/packages/batch/package.json b/packages/batch/package.json index 41512af4df..e723bbe1d6 100644 --- a/packages/batch/package.json +++ b/packages/batch/package.json @@ -81,10 +81,12 @@ "nodejs" ], "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1" + "@aws-lambda-powertools/commons": "2.26.1", + "@standard-schema/spec": "^1.0.0" }, "devDependencies": { + "@aws-lambda-powertools/parser": "2.26.1", "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-lambda-powertools/parser": "2.26.1" + "zod": "^4.1.8" } } \ No newline at end of file diff --git a/packages/batch/src/BasePartialBatchProcessor.ts b/packages/batch/src/BasePartialBatchProcessor.ts index 4d525dbded..21806be424 100644 --- a/packages/batch/src/BasePartialBatchProcessor.ts +++ b/packages/batch/src/BasePartialBatchProcessor.ts @@ -13,7 +13,7 @@ import { } from './constants.js'; import { FullBatchFailureError } from './errors.js'; import type { - BasePartialBatchProcessorParserConfig, + BatchProcessorConfig, EventSourceDataClassTypes, PartialItemFailureResponse, PartialItemFailures, @@ -55,7 +55,7 @@ abstract class BasePartialBatchProcessor extends BasePartialProcessor { /** * The configuration options for the parser integration */ - protected parserConfig?: BasePartialBatchProcessorParserConfig; + protected parserConfig?: BatchProcessorConfig; /** * Initializes base batch processing class @@ -64,7 +64,7 @@ abstract class BasePartialBatchProcessor extends BasePartialProcessor { */ public constructor( eventType: keyof typeof EventType, - parserConfig?: BasePartialBatchProcessorParserConfig + parserConfig?: BatchProcessorConfig ) { super(); this.eventType = eventType; diff --git a/packages/batch/src/BatchProcessor.ts b/packages/batch/src/BatchProcessor.ts index 0e1f2296df..30ae521001 100644 --- a/packages/batch/src/BatchProcessor.ts +++ b/packages/batch/src/BatchProcessor.ts @@ -33,7 +33,7 @@ import type { BaseRecord, FailureResponse, SuccessResponse } from './types.js'; * }); * ``` * - * **Process batch triggered by Kinesis Data Streams* + * **Process batch triggered by Kinesis Data Streams** * * @example * ```typescript @@ -113,6 +113,40 @@ import type { BaseRecord, FailureResponse, SuccessResponse } from './types.js'; * }); * ``` * + * **Process batch with inner schema validation** + * + * @example + * ```typescript + * import { + * BatchProcessor, + * EventType, + * processPartialResponse, + * } from '@aws-lambda-powertools/batch'; + * import { parser } from '@aws-lambda-powertools/batch/parser'; + * import type { SQSHandler } from 'aws-lambda'; + * import { z } from 'zod'; + * + * const myItemSchema = z.object({ name: z.string(), age: z.number() }); + * + * const processor = new BatchProcessor(EventType.SQS, { + * parser, + * innerSchema: myItemSchema, + * transformer: 'json' + * }); + * + * const recordHandler = async (record) => { + * // record is now fully typed and validated + * console.log(record.body.name, record.body.age); + * }; + * + * export const handler: SQSHandler = async (event, context) => + * processPartialResponse(event, recordHandler, processor, { + * context, + * }); + * ``` + * + * Note: If `innerSchema` is used with DynamoDB streams, the schema will be applied to both the NewImage and the OldImage by default. If you want to have separate schema for both, you will need to extend the schema and use the full schema for parsing. + * * @param eventType - The type of event to process (SQS, Kinesis, DynamoDB) */ class BatchProcessor extends BasePartialBatchProcessor { diff --git a/packages/batch/src/parser.ts b/packages/batch/src/parser.ts index fe1cb795a6..cb9374cceb 100644 --- a/packages/batch/src/parser.ts +++ b/packages/batch/src/parser.ts @@ -1,29 +1,30 @@ import type { GenericLogger } from '@aws-lambda-powertools/commons/types'; import type { StandardSchemaV1 } from '@standard-schema/spec'; -import type { ZodType } from 'zod'; import { EventType, SchemaVendor } from './constants.js'; import { ParsingError } from './errors.js'; import type { - BasePartialBatchProcessorParserConfig, + BatchProcessorConfig, EventSourceDataClassTypes, } from './types.js'; /** * Extend the schema according to the event type passed. * - * If useTransformers is true, extend using opinionated transformers. + * If `useTransformers` is true, extend using opinionated transformers. * Otherwise, extend without any transformers. * + * The vendor is already checked at runtime to ensure Zod is being used when required using `StandardSchemaV1['~standard'].vendor`. + * * @param options - The options for creating the extended schema * @param options.eventType - The type of event to process (SQS, Kinesis, DynamoDB) - * @param options.schema - The StandardSchema to be used for parsing + * @param options.innerSchema - The StandardSchema to be used for parsing. To avoid forcing a direct dependency on Zod, we use `unknown` here, which is not ideal but necessary. * @param options.useTransformers - Whether to use transformers for parsing * @param options.logger - A logger instance for logging */ const createExtendedSchema = async (options: { eventType: keyof typeof EventType; - innerSchema: ZodType; - transformer?: BasePartialBatchProcessorParserConfig['transformer']; + innerSchema: unknown; + transformer?: BatchProcessorConfig['transformer']; }) => { const { eventType, innerSchema, transformer } = options; let schema = innerSchema; @@ -32,6 +33,7 @@ const createExtendedSchema = async (options: { const { JSONStringified } = await import( '@aws-lambda-powertools/parser/helpers' ); + // @ts-expect-error - we know it's a Zod schema due to the runtime check earlier schema = JSONStringified(innerSchema); break; } @@ -39,6 +41,7 @@ const createExtendedSchema = async (options: { const { Base64Encoded } = await import( '@aws-lambda-powertools/parser/helpers' ); + // @ts-expect-error - we know it's a Zod schema due to the runtime check earlier schema = Base64Encoded(innerSchema); break; } @@ -46,6 +49,7 @@ const createExtendedSchema = async (options: { const { DynamoDBMarshalled } = await import( '@aws-lambda-powertools/parser/helpers/dynamodb' ); + // @ts-expect-error - we know it's a Zod schema due to the runtime check earlier schema = DynamoDBMarshalled(innerSchema); break; } @@ -73,8 +77,8 @@ const createExtendedSchema = async (options: { ); return DynamoDBStreamRecord.extend({ dynamodb: DynamoDBStreamChangeRecordBase.extend({ - OldImage: schema.optional(), - NewImage: schema.optional(), + OldImage: schema, + NewImage: schema, }), }); }; @@ -101,7 +105,7 @@ const parseWithErrorHandling = async ( const errorMessage = issues .map((issue) => `${issue.path?.join('.')}: ${issue.message}`) .join('; '); - logger.debug(errorMessage); + logger.debug(`Failed to parse record: ${errorMessage}`); throw new ParsingError(errorMessage); }; @@ -111,7 +115,8 @@ const parseWithErrorHandling = async ( * If the passed schema is already an extended schema, * use the schema directly to parse the record. * - * Only Zod Schemas are supported for schema extension. + * Parts of the parser integration within BatchProcessor rely on Zod for schema transformations, + * however some other parts also support other Standard Schema-compatible libraries. * * @param record - The record to be parsed * @param eventType - The type of event to process @@ -122,7 +127,7 @@ const parser = async ( record: EventSourceDataClassTypes, eventType: keyof typeof EventType, logger: Pick, - parserConfig: BasePartialBatchProcessorParserConfig + parserConfig: BatchProcessorConfig ): Promise => { const { schema, innerSchema, transformer } = parserConfig; // If the external schema is specified, use it to parse the record diff --git a/packages/batch/src/types.ts b/packages/batch/src/types.ts index 2f2ad880cb..8cd4fa4575 100644 --- a/packages/batch/src/types.ts +++ b/packages/batch/src/types.ts @@ -7,7 +7,6 @@ import type { SQSRecord, StreamRecord, } from 'aws-lambda'; -import type { ZodType } from 'zod'; import type { BasePartialBatchProcessor } from './BasePartialBatchProcessor.js'; import type { BatchProcessor } from './BatchProcessor.js'; import type { parser } from './parser.js'; @@ -119,7 +118,7 @@ type PartialItemFailureResponse = { batchItemFailures: PartialItemFailures[] }; * @property transformer - Payload transformer (only available with innerSchema) * @property logger - Optional logger for debug/warning messages */ -type BasePartialBatchProcessorParserConfig = +type BatchProcessorConfig = | { /** * Required when using schema parsing - import from `@aws-lambda-powertools/batch/parser` @@ -144,8 +143,12 @@ type BasePartialBatchProcessorParserConfig = schema?: never; /** * Payload-only Zod schema, mutually exclusive with `schema` + * + * @remarks + * Only Zod schemas are supported for `innerSchema` as we rely on Zod's schema extension capabilities. + * If you need to use a different Standard Schema-compatible library, use `schema` instead. */ - innerSchema: ZodType; + innerSchema: StandardSchemaV1; /** * Payload transformer, only available with `innerSchema` */ @@ -247,6 +250,6 @@ export type { FailureResponse, PartialItemFailures, PartialItemFailureResponse, - BasePartialBatchProcessorParserConfig, + BatchProcessorConfig, ParsedRecord, }; diff --git a/packages/batch/tests/helpers/factories.ts b/packages/batch/tests/helpers/factories.ts index bf3b75a7cb..196d7abbd4 100644 --- a/packages/batch/tests/helpers/factories.ts +++ b/packages/batch/tests/helpers/factories.ts @@ -61,6 +61,7 @@ const dynamodbRecordFactory = (body: string): DynamoDBRecord => { eventVersion: '1.0', dynamodb: { Keys: { Id: { N: '101' } }, + OldImage: { Message: { S: body } }, NewImage: { Message: { S: body } }, StreamViewType: 'NEW_AND_OLD_IMAGES', SequenceNumber: seq, diff --git a/packages/batch/tests/unit/parsing.test.ts b/packages/batch/tests/unit/parsing.test.ts index 231ec162a2..f31dc592ee 100644 --- a/packages/batch/tests/unit/parsing.test.ts +++ b/packages/batch/tests/unit/parsing.test.ts @@ -45,339 +45,248 @@ describe('Batch processing with Parser Integration', () => { const successPayload2 = { Message: 'test-2', }; - const failurePayload1 = { - Message: 1, - }; - const sqsRecordHandler = async (parsedRecord: SQSRecord) => { - return parsedRecord.body; - }; - const kinesisRecordHandler = async (parsedRecord: KinesisStreamRecord) => { - return parsedRecord.kinesis.data; - }; - const dynamodbRecordHandler = async (parsedRecord: DynamoDBRecord) => { - return parsedRecord.dynamodb?.NewImage; - }; - const cases = [ - { - description: 'passing Extended Schema', - SQSParserConfig: { - parser, - schema: SqsRecordSchema.extend({ - body: JSONStringified(customSchema), - }), - }, - KinesisParserConfig: { - parser, - schema: KinesisDataStreamRecord.extend({ - kinesis: KinesisDataStreamRecordPayload.extend({ - data: Base64Encoded(customSchema).optional(), - }), - }), - }, - DynamoDBParserConfig: { - parser, - schema: DynamoDBStreamRecord.extend({ - dynamodb: DynamoDBStreamChangeRecordBase.extend({ - NewImage: DynamoDBMarshalled(customSchema).optional(), - }), - }), - }, - }, - { - description: 'passing Internal Schema without transformer property set', - SQSParserConfig: { - parser, - innerSchema: JSONStringified(customSchema), - }, - KinesisParserConfig: { - parser, - innerSchema: Base64Encoded(customSchema), - }, - DynamoDBParserConfig: { - parser, - innerSchema: DynamoDBMarshalled(customSchema), - }, - }, - { - description: 'passing Internal Schema with transformer property set', - SQSParserConfig: { - parser, - innerSchema: customSchema, - transformer: 'json' as const, - }, - KinesisParserConfig: { - parser, - innerSchema: customSchema, - transformer: 'base64' as const, - }, - DynamoDBParserConfig: { - parser, - innerSchema: customSchema, - transformer: 'unmarshall' as const, - }, - }, + const sqsRecordHandler = async (parsedRecord: SQSRecord) => parsedRecord.body; + const sqsRecords = [ + sqsRecordFactory(JSON.stringify(successPayload1)), + sqsRecordFactory(JSON.stringify(successPayload2)), + ]; + const kinesisRecordHandler = async (parsedRecord: KinesisStreamRecord) => + parsedRecord.kinesis.data; + const kinesisRecords = [ + kinesisRecordFactory( + Buffer.from(JSON.stringify(successPayload1)).toString('base64') + ), + kinesisRecordFactory( + Buffer.from(JSON.stringify(successPayload2)).toString('base64') + ), + ]; + const dynamodbRecordHandler = async (parsedRecord: DynamoDBRecord) => + parsedRecord.dynamodb?.NewImage; + const dynamodbRecords = [ + dynamodbRecordFactory(successPayload1.Message), + dynamodbRecordFactory(successPayload2.Message), ]; - describe.each(cases)( - 'SQS Record Schema $description', - ({ SQSParserConfig }) => { - it('completes the processing with no failures and parses the payload before passing to the record handler', async () => { - // Prepare - const firstRecord = sqsRecordFactory(JSON.stringify(successPayload1)); - const secondRecord = sqsRecordFactory(JSON.stringify(successPayload2)); - const records = [firstRecord, secondRecord]; - const processor = new BatchProcessor(EventType.SQS, SQSParserConfig); - - // Act - processor.register(records, sqsRecordHandler); - const processedMessages = await processor.process(); - - // Assess - expect(processedMessages).toStrictEqual([ - ['success', successPayload1, firstRecord], - ['success', successPayload2, secondRecord], - ]); - }); - - it('completes the processing with failures if some of the payload does not match the passed schema', async () => { - // Prepare - const firstRecord = sqsRecordFactory(JSON.stringify(successPayload1)); - const secondRecord = sqsRecordFactory(JSON.stringify(failurePayload1)); - const records = [firstRecord, secondRecord]; - const processor = new BatchProcessor(EventType.SQS, SQSParserConfig); - - // Act - processor.register(records, sqsRecordHandler); - const processedMessages = await processor.process(); - - // Assess - expect(processedMessages[0]).toStrictEqual([ - 'success', - successPayload1, - firstRecord, - ]); - expect(processor.failureMessages.length).toBe(1); - expect(processor.response()).toStrictEqual({ - batchItemFailures: [{ itemIdentifier: secondRecord.messageId }], - }); - }); - } - ); - - describe.each(cases)( - 'Kinesis Record Schema $description', - ({ KinesisParserConfig }) => { - it('completes the processing with no failures and parses the payload before passing to the record handler', async () => { - // Prepare - const firstRecord = kinesisRecordFactory( - Buffer.from(JSON.stringify(successPayload1)).toString('base64') - ); - const secondRecord = kinesisRecordFactory( - Buffer.from(JSON.stringify(successPayload2)).toString('base64') - ); - const records = [firstRecord, secondRecord]; - const processor = new BatchProcessor( - EventType.KinesisDataStreams, - KinesisParserConfig - ); - - // Act - processor.register(records, kinesisRecordHandler); - const processedMessages = await processor.process(); - - // Assess - expect(processedMessages).toStrictEqual([ - ['success', successPayload1, firstRecord], - ['success', successPayload2, secondRecord], - ]); - }); - - it('completes the processing with failures if some of the payload does not match the passed schema', async () => { - // Prepare - const firstRecord = kinesisRecordFactory( - Buffer.from(JSON.stringify(successPayload1)).toString('base64') - ); - const secondRecord = kinesisRecordFactory( - Buffer.from(JSON.stringify(failurePayload1)).toString('base64') - ); - const records = [firstRecord, secondRecord]; - const processor = new BatchProcessor( - EventType.KinesisDataStreams, - KinesisParserConfig - ); - - // Act - processor.register(records, kinesisRecordHandler); - const processedMessages = await processor.process(); - - // Assess - expect(processedMessages[0]).toStrictEqual([ - 'success', - successPayload1, - firstRecord, - ]); - expect(processor.failureMessages.length).toBe(1); - expect(processor.response()).toStrictEqual({ - batchItemFailures: [ - { itemIdentifier: secondRecord.kinesis.sequenceNumber }, - ], - }); - }); - } - ); - - describe.each(cases)( - 'DynamoDB Record Schema $description', - ({ DynamoDBParserConfig }) => { - it('completes the processing with no failures and parses the payload before passing to the record handler', async () => { - // Prepare - const firstRecord = dynamodbRecordFactory(successPayload1.Message); - const secondRecord = dynamodbRecordFactory(successPayload2.Message); - const records = [firstRecord, secondRecord]; - const processor = new BatchProcessor( - EventType.DynamoDBStreams, - DynamoDBParserConfig - ); - - // Act - processor.register(records, dynamodbRecordHandler); - const processedMessages = await processor.process(); - // Assess - expect(processedMessages).toStrictEqual([ - ['success', successPayload1, firstRecord], - ['success', successPayload2, secondRecord], - ]); - }); + it('uses a custom logger when provided', async () => { + // Prepare + const logger = { + debug: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; + const unsupportedSchema = object({ + Message: string(), + }); + const processor = new BatchProcessor(EventType.SQS, { + parser, + innerSchema: unsupportedSchema, + transformer: 'json', + logger, + }); + processor.register(sqsRecords, sqsRecordHandler); - it('completes the processing with failures if some of the payload does not match the passed schema', async () => { - // Prepare - vi.stubEnv('AWS_LAMBDA_LOG_LEVEL', 'DEBUG'); - const firstRecord = dynamodbRecordFactory(successPayload1.Message); - //@ts-expect-error Passing an invalid payload for testing - const secondRecord = dynamodbRecordFactory(failurePayload1.Message); - const records = [firstRecord, secondRecord]; - const processor = new BatchProcessor(EventType.DynamoDBStreams, { - ...DynamoDBParserConfig, - logger: console, - }); + // Act & Assess + await expect(processor.process()).rejects.toThrowError( + FullBatchFailureError + ); + expect(logger.error).toHaveBeenCalledWith( + 'The schema provided is not supported. Only Zod schemas are supported for extension.' + ); + }); - // Act - processor.register(records, dynamodbRecordHandler); - const processedMessages = await processor.process(); + it('completes processing with failures if the schema is not passed for the parsing', async () => { + // Prepare + vi.stubEnv('AWS_LAMBDA_LOG_LEVEL', 'INFO'); + // @ts-expect-error - testing missing required params + const processor = new BatchProcessor(EventType.SQS, { + parser, + transformer: 'json', + }); + processor.register(sqsRecords, sqsRecordHandler); - // Assess - expect(processedMessages[0]).toStrictEqual([ - 'success', - successPayload1, - firstRecord, - ]); - expect(processor.failureMessages.length).toBe(1); - expect(processor.response()).toStrictEqual({ - batchItemFailures: [ - { itemIdentifier: secondRecord.dynamodb?.SequenceNumber }, - ], - }); - expect(console.debug).toHaveBeenCalledWith( - 'dynamodb.NewImage.Message: Invalid input: expected string, received number' - ); - }); - } - ); + // Act & Assess + await expect(processor.process()).rejects.toThrowError( + FullBatchFailureError + ); + }); - it('completes processing with all failures if an unsupported event type is used for parsing', async () => { + it('does not log debug logs if the lambda log level is set to higher than INFO', async () => { // Prepare - const firstRecord = sqsRecordFactory(JSON.stringify(successPayload1)); - const secondRecord = sqsRecordFactory(JSON.stringify(successPayload2)); - const records = [firstRecord, secondRecord]; - //@ts-expect-error - const processor = new BatchProcessor('invalid-event-type', { + vi.stubEnv('AWS_LAMBDA_LOG_LEVEL', 'INFO'); + const processor = new BatchProcessor(EventType.SQS, { + parser, innerSchema: customSchema, transformer: 'json', }); + processor.register([sqsRecordFactory('fail')], sqsRecordHandler); - // Act - processor.register(records, sqsRecordHandler); - - // Assess + // Act & Assess await expect(processor.process()).rejects.toThrowError( FullBatchFailureError ); + expect(console.debug).not.toHaveBeenCalled(); }); - it('completes processing with failures if an unsupported schema type is used for parsing', async () => { + it('reports the parsing error if the record does not conform to the schema', async () => { // Prepare - const unsupportedSchema = object({ - Message: string(), - }); - const firstRecord = sqsRecordFactory(JSON.stringify(successPayload1)); - const secondRecord = sqsRecordFactory(JSON.stringify(successPayload2)); - const records = [firstRecord, secondRecord]; + vi.stubEnv('AWS_LAMBDA_LOG_LEVEL', 'DEBUG'); + const records = [sqsRecordFactory(JSON.stringify({ Invalid: 'invalid' }))]; const processor = new BatchProcessor(EventType.SQS, { parser, - // @ts-expect-error - we are explicitly testing a wrong schema vendor - innerSchema: unsupportedSchema, + innerSchema: customSchema, transformer: 'json', + logger: console, + }); + processor.register(records, sqsRecordHandler, { + throwOnFullBatchFailure: false, }); // Act - processor.register(records, sqsRecordHandler); + const result = await processor.process(); // Assess - await expect(processor.process()).rejects.toThrowError( - FullBatchFailureError + expect(console.debug).toHaveBeenCalledWith( + 'Failed to parse record: body.Message: Invalid input: expected string, received undefined' ); + expect(result).toEqual([ + [ + 'fail', + 'body.Message: Invalid input: expected string, received undefined', + records[0], + ], + ]); }); - it('completes processing with failures if the schema is not passed for the parsing', async () => { + it.each([ + { + case: 'full schema', + records: sqsRecords, + params: { + schema: SqsRecordSchema.extend({ + body: JSONStringified(customSchema), + }), + }, + }, + { + case: 'inner schema', + records: sqsRecords, + params: { + innerSchema: JSONStringified(customSchema), + }, + }, + { + case: 'inner schema with transformer', + records: sqsRecords, + params: { + innerSchema: customSchema, + transformer: 'json' as const, + }, + }, + ])('processes SQS records with $case', async ({ records, params }) => { // Prepare - const firstRecord = sqsRecordFactory(JSON.stringify(successPayload1)); - const secondRecord = sqsRecordFactory(JSON.stringify(successPayload2)); - const records = [firstRecord, secondRecord]; - const processor = new BatchProcessor(EventType.SQS, { parser, - transformer: 'json', + ...params, }); + processor.register(records, sqsRecordHandler); // Act - processor.register(records, sqsRecordHandler); + const result = await processor.process(); // Assess - await expect(processor.process()).rejects.toThrowError( - FullBatchFailureError - ); + expect(result).toEqual([ + ['success', successPayload1, sqsRecords[0]], + ['success', successPayload2, sqsRecords[1]], + ]); }); - it('uses a custom logger when provided', async () => { + it.each([ + { + case: 'full schema', + records: kinesisRecords, + params: { + schema: KinesisDataStreamRecord.extend({ + kinesis: KinesisDataStreamRecordPayload.extend({ + data: Base64Encoded(customSchema), + }), + }), + }, + }, + { + case: 'inner schema', + records: kinesisRecords, + params: { + innerSchema: Base64Encoded(customSchema), + }, + }, + { + case: 'inner schema with transformer', + records: kinesisRecords, + params: { + innerSchema: customSchema, + transformer: 'base64' as const, + }, + }, + ])('processes Kinesis records with $case', async ({ records, params }) => { // Prepare - const logger = { - debug: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }; - const unsupportedSchema = object({ - Message: string(), + const processor = new BatchProcessor(EventType.KinesisDataStreams, { + parser, + ...params, }); - const firstRecord = sqsRecordFactory(JSON.stringify(successPayload1)); - const secondRecord = sqsRecordFactory(JSON.stringify(successPayload2)); - const records = [firstRecord, secondRecord]; - const processor = new BatchProcessor(EventType.SQS, { + processor.register(records, kinesisRecordHandler); + + // Act + const result = await processor.process(); + + // Assess + expect(result).toEqual([ + ['success', successPayload1, kinesisRecords[0]], + ['success', successPayload2, kinesisRecords[1]], + ]); + }); + + it.each([ + { + case: 'full schema', + records: dynamodbRecords, + params: { + schema: DynamoDBStreamRecord.extend({ + dynamodb: DynamoDBStreamChangeRecordBase.extend({ + NewImage: DynamoDBMarshalled(customSchema), + }), + }), + }, + }, + { + case: 'inner schema', + records: dynamodbRecords, + params: { + innerSchema: DynamoDBMarshalled(customSchema), + }, + }, + { + case: 'inner schema with transformer', + records: dynamodbRecords, + params: { + innerSchema: customSchema, + transformer: 'unmarshall' as const, + }, + }, + ])('processes DynamoDB records with $case', async ({ records, params }) => { + // Prepare + const processor = new BatchProcessor(EventType.DynamoDBStreams, { parser, - // @ts-expect-error - we are explicitly testing a wrong schema vendor - innerSchema: unsupportedSchema, - transformer: 'json', - logger, + ...params, }); + processor.register(records, dynamodbRecordHandler); // Act - processor.register(records, sqsRecordHandler); + const result = await processor.process(); // Assess - await expect(processor.process()).rejects.toThrowError( - FullBatchFailureError - ); - expect(logger.error).toHaveBeenCalledWith( - 'The schema provided is not supported. Only Zod schemas are supported for extension.' - ); + expect(result).toEqual([ + ['success', successPayload1, dynamodbRecords[0]], + ['success', successPayload2, dynamodbRecords[1]], + ]); }); }); From f5ba102783b466a5e91ffe0e1f42dd4d48eb38d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Sep 2025 14:33:02 +0100 Subject: [PATCH 159/255] chore(deps-dev): bump zod from 4.1.8 to 4.1.9 (#4500) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/snippets/package.json | 2 +- package-lock.json | 16 ++++++++-------- packages/batch/package.json | 2 +- packages/kafka/package.json | 2 +- packages/parser/package.json | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/examples/snippets/package.json b/examples/snippets/package.json index 3b14b2a73b..7e29e8d069 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -43,7 +43,7 @@ "@valkey/valkey-glide": "^2.0.1", "aws-sdk": "^2.1692.0", "aws-sdk-client-mock": "^4.1.0", - "zod": "^4.1.8" + "zod": "^4.1.9" }, "dependencies": { "arktype": "^2.1.22", diff --git a/package-lock.json b/package-lock.json index b896b6e615..e34ec8366c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -105,7 +105,7 @@ "@valkey/valkey-glide": "^2.0.1", "aws-sdk": "^2.1692.0", "aws-sdk-client-mock": "^4.1.0", - "zod": "^4.1.8" + "zod": "^4.1.9" } }, "examples/snippets/node_modules/@valkey/valkey-glide": { @@ -10746,9 +10746,9 @@ } }, "node_modules/zod": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.8.tgz", - "integrity": "sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.9.tgz", + "integrity": "sha512-HI32jTq0AUAC125z30E8bQNz0RQ+9Uc+4J7V97gLYjZVKRjeydPgGt6dvQzFrav7MYOUGFqqOGiHpA/fdbd0cQ==", "dev": true, "license": "MIT", "funding": { @@ -10766,7 +10766,7 @@ "devDependencies": { "@aws-lambda-powertools/parser": "2.26.1", "@aws-lambda-powertools/testing-utils": "file:../testing", - "zod": "^4.1.8" + "zod": "^4.1.9" } }, "packages/commons": { @@ -10843,7 +10843,7 @@ "devDependencies": { "avro-js": "^1.12.0", "protobufjs": "^7.5.4", - "zod": "^4.1.8" + "zod": "^4.1.9" }, "peerDependencies": { "arktype": ">=2.0.0", @@ -10964,7 +10964,7 @@ "@standard-schema/spec": "^1.0.0" }, "devDependencies": { - "zod": "^4.1.8" + "zod": "^4.1.9" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x", @@ -11029,4 +11029,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/batch/package.json b/packages/batch/package.json index e723bbe1d6..f5faf875f9 100644 --- a/packages/batch/package.json +++ b/packages/batch/package.json @@ -87,6 +87,6 @@ "devDependencies": { "@aws-lambda-powertools/parser": "2.26.1", "@aws-lambda-powertools/testing-utils": "file:../testing", - "zod": "^4.1.8" + "zod": "^4.1.9" } } \ No newline at end of file diff --git a/packages/kafka/package.json b/packages/kafka/package.json index 45cd05c2ab..daf47fd320 100644 --- a/packages/kafka/package.json +++ b/packages/kafka/package.json @@ -116,6 +116,6 @@ "devDependencies": { "avro-js": "^1.12.0", "protobufjs": "^7.5.4", - "zod": "^4.1.8" + "zod": "^4.1.9" } } diff --git a/packages/parser/package.json b/packages/parser/package.json index f77a688e14..f9f6453779 100644 --- a/packages/parser/package.json +++ b/packages/parser/package.json @@ -215,6 +215,6 @@ } }, "devDependencies": { - "zod": "^4.1.8" + "zod": "^4.1.9" } } From 59fe03cb706b6d0d4f9bddcbcac9e1736cb88716 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Sep 2025 14:35:43 +0100 Subject: [PATCH 160/255] chore(deps): bump @types/node from 24.5.0 to 24.5.1 (#4501) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- examples/app/package.json | 4 ++-- package-lock.json | 12 ++++++------ package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 166ceb0291..031f7dbee3 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -29,7 +29,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.152", - "@types/node": "24.5.0", + "@types/node": "24.5.1", "aws-cdk-lib": "^2.214.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -48,7 +48,7 @@ "@aws-sdk/lib-dynamodb": "^3.888.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", - "@types/node": "24.5.0", + "@types/node": "24.5.1", "aws-cdk": "^2.1029.1", "constructs": "^10.4.2", "esbuild": "^0.25.9", diff --git a/package-lock.json b/package-lock.json index e34ec8366c..3ffde5872b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.4", "@types/aws-lambda": "^8.10.152", - "@types/node": "^24.5.0", + "@types/node": "^24.5.1", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.1.6", @@ -60,7 +60,7 @@ "@aws-sdk/lib-dynamodb": "^3.888.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", - "@types/node": "24.5.0", + "@types/node": "24.5.1", "aws-cdk": "^2.1029.1", "constructs": "^10.4.2", "esbuild": "^0.25.9", @@ -68,7 +68,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.152", - "@types/node": "24.5.0", + "@types/node": "24.5.1", "aws-cdk-lib": "^2.214.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -5096,9 +5096,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.0.tgz", - "integrity": "sha512-y1dMvuvJspJiPSDZUQ+WMBvF7dpnEqN4x9DDC9ie5Fs/HUZJA3wFp7EhHoVaKX/iI0cRoECV8X2jL8zi0xrHCg==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.1.tgz", + "integrity": "sha512-/SQdmUP2xa+1rdx7VwB9yPq8PaKej8TD5cQ+XfKDPWWC+VDJU4rvVVagXqKUzhKjtFoNA8rXDJAkCxQPAe00+Q==", "license": "MIT", "dependencies": { "undici-types": "~7.12.0" diff --git a/package.json b/package.json index c51b42582b..5ca711e48b 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.4", "@types/aws-lambda": "^8.10.152", - "@types/node": "^24.5.0", + "@types/node": "^24.5.1", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.1.6", From 320e0dcaa07476de3b7d07209ef27379b9d4900a Mon Sep 17 00:00:00 2001 From: Swopnil Dangol Date: Thu, 18 Sep 2025 09:37:13 +0100 Subject: [PATCH 161/255] feat(event-handler): added compress middleware for the REST API event handler (#4495) Co-authored-by: Stefano Vozza --- packages/event-handler/package.json | 10 + packages/event-handler/src/rest/constants.ts | 12 ++ packages/event-handler/src/rest/converters.ts | 30 ++- .../src/rest/middleware/compress.ts | 117 ++++++++++++ .../src/rest/middleware/index.ts | 1 + packages/event-handler/src/types/rest.ts | 6 + .../tests/unit/rest/converters.test.ts | 140 +++++++++++++- .../event-handler/tests/unit/rest/helpers.ts | 16 +- .../unit/rest/middleware/compress.test.ts | 176 ++++++++++++++++++ 9 files changed, 502 insertions(+), 6 deletions(-) create mode 100644 packages/event-handler/src/rest/middleware/compress.ts create mode 100644 packages/event-handler/src/rest/middleware/index.ts create mode 100644 packages/event-handler/tests/unit/rest/middleware/compress.test.ts diff --git a/packages/event-handler/package.json b/packages/event-handler/package.json index 563e200734..49510b81c9 100644 --- a/packages/event-handler/package.json +++ b/packages/event-handler/package.json @@ -77,6 +77,16 @@ "types": "./lib/esm/rest/index.d.ts", "default": "./lib/esm/rest/index.js" } + }, + "./experimental-rest/middleware": { + "require": { + "types": "./lib/cjs/rest/middleware/index.d.ts", + "default": "./lib/cjs/rest/middleware/index.js" + }, + "import": { + "types": "./lib/esm/rest/middleware/index.d.ts", + "default": "./lib/esm/rest/middleware/index.js" + } } }, "typesVersions": { diff --git a/packages/event-handler/src/rest/constants.ts b/packages/event-handler/src/rest/constants.ts index 5267b5a2f4..b647b78fb9 100644 --- a/packages/event-handler/src/rest/constants.ts +++ b/packages/event-handler/src/rest/constants.ts @@ -87,3 +87,15 @@ export const PARAM_PATTERN = /:([a-zA-Z_]\w*)(?=\/|$)/g; export const SAFE_CHARS = "-._~()'!*:@,;=+&$"; export const UNSAFE_CHARS = '%<> \\[\\]{}|^'; + +export const DEFAULT_COMPRESSION_RESPONSE_THRESHOLD = 1024; + +export const CACHE_CONTROL_NO_TRANSFORM_REGEX = + /(?:^|,)\s*?no-transform\s*?(?:,|$)/i; + +export const COMPRESSION_ENCODING_TYPES = { + GZIP: 'gzip', + DEFLATE: 'deflate', + IDENTITY: 'identity', + ANY: '*', +} as const; diff --git a/packages/event-handler/src/rest/converters.ts b/packages/event-handler/src/rest/converters.ts index de12ad74df..0eed7f92e6 100644 --- a/packages/event-handler/src/rest/converters.ts +++ b/packages/event-handler/src/rest/converters.ts @@ -1,5 +1,6 @@ import type { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; -import type { HandlerResponse } from '../types/rest.js'; +import type { CompressionOptions, HandlerResponse } from '../types/rest.js'; +import { COMPRESSION_ENCODING_TYPES } from './constants.js'; import { isAPIGatewayProxyResult } from './utils.js'; /** @@ -89,11 +90,34 @@ export const webResponseToProxyResult = async ( } } + // Check if response contains compressed/binary content + const contentEncoding = response.headers.get( + 'content-encoding' + ) as CompressionOptions['encoding']; + let body: string; + let isBase64Encoded = false; + + if ( + contentEncoding && + [ + COMPRESSION_ENCODING_TYPES.GZIP, + COMPRESSION_ENCODING_TYPES.DEFLATE, + ].includes(contentEncoding) + ) { + // For compressed content, get as buffer and encode to base64 + const buffer = await response.arrayBuffer(); + body = Buffer.from(buffer).toString('base64'); + isBase64Encoded = true; + } else { + // For text content, use text() + body = await response.text(); + } + const result: APIGatewayProxyResult = { statusCode: response.status, headers, - body: await response.text(), - isBase64Encoded: false, + body, + isBase64Encoded, }; if (Object.keys(multiValueHeaders).length > 0) { diff --git a/packages/event-handler/src/rest/middleware/compress.ts b/packages/event-handler/src/rest/middleware/compress.ts new file mode 100644 index 0000000000..70bffebd30 --- /dev/null +++ b/packages/event-handler/src/rest/middleware/compress.ts @@ -0,0 +1,117 @@ +import type { Middleware } from '../../types/index.js'; +import type { CompressionOptions } from '../../types/rest.js'; +import { + CACHE_CONTROL_NO_TRANSFORM_REGEX, + COMPRESSION_ENCODING_TYPES, + DEFAULT_COMPRESSION_RESPONSE_THRESHOLD, +} from '../constants.js'; + +/** + * Compresses HTTP response bodies using standard compression algorithms. + * + * This middleware automatically compresses response bodies when they exceed + * a specified threshold and the client supports compression. It respects + * cache-control directives and only compresses appropriate content types. + * + * The middleware checks several conditions before compressing: + * - Response is not already encoded or chunked + * - Request method is not HEAD + * - Content length exceeds the threshold + * - Content type is compressible + * - Cache-Control header doesn't contain no-transform + * - Response has a body + * + * **Basic compression with default settings** + * + * @example + * ```typescript + * import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; + * import { compress } from '@aws-lambda-powertools/event-handler/experimental-rest/middleware'; + * + * const app = new Router(); + * + * app.use(compress()); + * + * app.get('/api/data', async () => { + * return { data: 'large response body...' }; + * }); + * ``` + * + * **Custom compression settings** + * + * @example + * ```typescript + * import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; + * import { compress } from '@aws-lambda-powertools/event-handler/experimental-rest/middleware'; + * + * const app = new Router(); + * + * app.use(compress({ + * threshold: 2048, + * encoding: 'deflate' + * })); + * + * app.get('/api/large-data', async () => { + * return { data: 'very large response...' }; + * }); + * ``` + * + * @param options - Configuration options for compression behavior + * @param options.threshold - Minimum response size in bytes to trigger compression (default: 1024) + * @param options.encoding - Preferred compression encoding to use when client supports multiple formats + */ + +const compress = (options?: CompressionOptions): Middleware => { + const preferredEncoding = + options?.encoding ?? COMPRESSION_ENCODING_TYPES.GZIP; + const threshold = + options?.threshold ?? DEFAULT_COMPRESSION_RESPONSE_THRESHOLD; + + return async (_, reqCtx, next) => { + await next(); + + if ( + !shouldCompress(reqCtx.request, reqCtx.res, preferredEncoding, threshold) + ) { + return; + } + + // Compress the response + const stream = new CompressionStream(preferredEncoding); + reqCtx.res = new Response(reqCtx.res.body.pipeThrough(stream), reqCtx.res); + reqCtx.res.headers.delete('content-length'); + reqCtx.res.headers.set('content-encoding', preferredEncoding); + }; +}; + +const shouldCompress = ( + request: Request, + response: Response, + preferredEncoding: NonNullable, + threshold: NonNullable +): response is Response & { body: NonNullable } => { + const acceptedEncoding = + request.headers.get('accept-encoding') ?? COMPRESSION_ENCODING_TYPES.ANY; + const contentLength = response.headers.get('content-length'); + const cacheControl = response.headers.get('cache-control'); + + const isEncodedOrChunked = + response.headers.has('content-encoding') || + response.headers.has('transfer-encoding'); + + const shouldEncode = + !acceptedEncoding.includes(COMPRESSION_ENCODING_TYPES.IDENTITY) && + (acceptedEncoding.includes(preferredEncoding) || + acceptedEncoding.includes(COMPRESSION_ENCODING_TYPES.ANY)); + + return ( + shouldEncode && + !isEncodedOrChunked && + request.method !== 'HEAD' && + (!contentLength || Number(contentLength) > threshold) && + (!cacheControl || !CACHE_CONTROL_NO_TRANSFORM_REGEX.test(cacheControl)) && + response.body !== null + ); +}; + +export { compress }; diff --git a/packages/event-handler/src/rest/middleware/index.ts b/packages/event-handler/src/rest/middleware/index.ts new file mode 100644 index 0000000000..2b65a8ee8e --- /dev/null +++ b/packages/event-handler/src/rest/middleware/index.ts @@ -0,0 +1 @@ +export { compress } from './compress.js'; diff --git a/packages/event-handler/src/types/rest.ts b/packages/event-handler/src/types/rest.ts index e2005d250d..0ba650c0dc 100644 --- a/packages/event-handler/src/types/rest.ts +++ b/packages/event-handler/src/types/rest.ts @@ -111,6 +111,11 @@ type ValidationResult = { issues: string[]; }; +type CompressionOptions = { + encoding?: 'gzip' | 'deflate'; + threshold?: number; +}; + export type { CompiledRoute, DynamicRoute, @@ -131,4 +136,5 @@ export type { RestRouteHandlerOptions, RouteRegistryOptions, ValidationResult, + CompressionOptions, }; diff --git a/packages/event-handler/tests/unit/rest/converters.test.ts b/packages/event-handler/tests/unit/rest/converters.test.ts index 435ac6d167..5bac1f13b9 100644 --- a/packages/event-handler/tests/unit/rest/converters.test.ts +++ b/packages/event-handler/tests/unit/rest/converters.test.ts @@ -38,8 +38,10 @@ describe('Converters', () => { }; it('converts basic GET request', () => { + // Prepare & Act const request = proxyEventToWebRequest(baseEvent); + // Assess expect(request).toBeInstanceOf(Request); expect(request.method).toBe('GET'); expect(request.url).toBe('https://api.example.com/test'); @@ -47,28 +49,37 @@ describe('Converters', () => { }); it('uses Host header over domainName', () => { + // Prepare const event = { ...baseEvent, headers: { Host: 'custom.example.com' }, }; + // Act const request = proxyEventToWebRequest(event); + + // Assess expect(request).toBeInstanceOf(Request); expect(request.url).toBe('https://custom.example.com/test'); }); it('uses X-Forwarded-Proto header for protocol', () => { + // Prepare const event = { ...baseEvent, headers: { 'X-Forwarded-Proto': 'https' }, }; + // Act const request = proxyEventToWebRequest(event); + + // Assess expect(request).toBeInstanceOf(Request); expect(request.url).toBe('https://api.example.com/test'); }); it('handles null values in multiValueHeaders arrays', () => { + // Prepare const event = { ...baseEvent, multiValueHeaders: { @@ -77,13 +88,17 @@ describe('Converters', () => { }, }; + // Act const request = proxyEventToWebRequest(event); + + // Assess expect(request).toBeInstanceOf(Request); expect(request.headers.get('Accept')).toBe(null); expect(request.headers.get('Custom-Header')).toBe('value1'); }); it('handles null values in multiValueQueryStringParameters arrays', () => { + // Prepare const event = { ...baseEvent, multiValueQueryStringParameters: { @@ -92,7 +107,10 @@ describe('Converters', () => { }, }; + // Act const request = proxyEventToWebRequest(event); + + // Assess expect(request).toBeInstanceOf(Request); const url = new URL(request.url); expect(url.searchParams.has('filter')).toBe(false); @@ -100,6 +118,7 @@ describe('Converters', () => { }); it('handles POST request with string body', async () => { + // Prepare const event = { ...baseEvent, httpMethod: 'POST', @@ -107,7 +126,10 @@ describe('Converters', () => { headers: { 'Content-Type': 'application/json' }, }; + // Act const request = proxyEventToWebRequest(event); + + // Assess expect(request).toBeInstanceOf(Request); expect(request.method).toBe('POST'); expect(request.text()).resolves.toBe('{"key":"value"}'); @@ -115,9 +137,9 @@ describe('Converters', () => { }); it('decodes base64 encoded body', async () => { + // Prepare const originalText = 'Hello World'; const base64Text = Buffer.from(originalText).toString('base64'); - const event = { ...baseEvent, httpMethod: 'POST', @@ -125,12 +147,16 @@ describe('Converters', () => { isBase64Encoded: true, }; + // Act const request = proxyEventToWebRequest(event); + + // Assess expect(request).toBeInstanceOf(Request); expect(request.text()).resolves.toBe(originalText); }); it('handles single-value headers', () => { + // Prepare const event = { ...baseEvent, headers: { @@ -139,13 +165,17 @@ describe('Converters', () => { }, }; + // Act const request = proxyEventToWebRequest(event); + + // Assess expect(request).toBeInstanceOf(Request); expect(request.headers.get('Authorization')).toBe('Bearer token123'); expect(request.headers.get('User-Agent')).toBe('test-agent'); }); it('handles multiValueHeaders', () => { + // Prepare const event = { ...baseEvent, multiValueHeaders: { @@ -154,13 +184,17 @@ describe('Converters', () => { }, }; + // Act const request = proxyEventToWebRequest(event); + + // Assess expect(request).toBeInstanceOf(Request); expect(request.headers.get('Accept')).toBe('application/json, text/html'); expect(request.headers.get('Custom-Header')).toBe('value1, value2'); }); it('handles both single and multi-value headers', () => { + // Prepare const event = { ...baseEvent, headers: { @@ -171,13 +205,17 @@ describe('Converters', () => { }, }; + // Act const request = proxyEventToWebRequest(event); + + // Assess expect(request).toBeInstanceOf(Request); expect(request.headers.get('Authorization')).toBe('Bearer token123'); expect(request.headers.get('Accept')).toBe('application/json, text/html'); }); it('deduplicates headers when same header exists in both headers and multiValueHeaders', () => { + // Prepare const event = { ...baseEvent, headers: { @@ -190,7 +228,10 @@ describe('Converters', () => { }, }; + // Act const request = proxyEventToWebRequest(event); + + // Assess expect(request).toBeInstanceOf(Request); expect(request.headers.get('Host')).toBe( 'abcd1234.execute-api.eu-west-1.amazonaws.com' @@ -199,6 +240,7 @@ describe('Converters', () => { }); it('appends unique values from multiValueHeaders when header already exists', () => { + // Prepare const event = { ...baseEvent, headers: { @@ -209,12 +251,16 @@ describe('Converters', () => { }, }; + // Act const request = proxyEventToWebRequest(event); + + // Assess expect(request).toBeInstanceOf(Request); expect(request.headers.get('Accept')).toBe('application/json, text/html'); }); it('handles queryStringParameters', () => { + // Prepare const event = { ...baseEvent, queryStringParameters: { @@ -223,7 +269,10 @@ describe('Converters', () => { }, }; + // Act const request = proxyEventToWebRequest(event); + + // Assess expect(request).toBeInstanceOf(Request); const url = new URL(request.url); expect(url.searchParams.get('name')).toBe('john'); @@ -231,6 +280,7 @@ describe('Converters', () => { }); it('handles multiValueQueryStringParameters', () => { + // Prepare const event = { ...baseEvent, multiValueQueryStringParameters: { @@ -239,7 +289,10 @@ describe('Converters', () => { }, }; + // Act const request = proxyEventToWebRequest(event); + + // Assess expect(request).toBeInstanceOf(Request); const url = new URL(request.url); expect(url.searchParams.getAll('filter')).toEqual(['name', 'age']); @@ -247,6 +300,7 @@ describe('Converters', () => { }); it('handles both queryStringParameters and multiValueQueryStringParameters', () => { + // Prepare const event = { ...baseEvent, queryStringParameters: { @@ -257,7 +311,10 @@ describe('Converters', () => { }, }; + // Act const request = proxyEventToWebRequest(event); + + // Assess expect(request).toBeInstanceOf(Request); const url = new URL(request.url); expect(url.searchParams.get('single')).toBe('value'); @@ -265,6 +322,7 @@ describe('Converters', () => { }); it('skips null queryStringParameter values', () => { + // Prepare const event = { ...baseEvent, queryStringParameters: { @@ -273,7 +331,10 @@ describe('Converters', () => { }, }; + // Act const request = proxyEventToWebRequest(event); + + // Assess expect(request).toBeInstanceOf(Request); const url = new URL(request.url); expect(url.searchParams.get('valid')).toBe('value'); @@ -281,6 +342,7 @@ describe('Converters', () => { }); it('skips null header values', () => { + // Prepare const event = { ...baseEvent, headers: { @@ -289,13 +351,17 @@ describe('Converters', () => { }, }; + // Act const request = proxyEventToWebRequest(event); + + // Assess expect(request).toBeInstanceOf(Request); expect(request.headers.get('Valid-Header')).toBe('value'); expect(request.headers.get('Null-Header')).toBe(null); }); it('handles null/undefined collections', () => { + // Prepare const event = { ...baseEvent, headers: null as any, @@ -304,7 +370,10 @@ describe('Converters', () => { multiValueQueryStringParameters: null as any, }; + // Act const request = proxyEventToWebRequest(event); + + // Assess expect(request).toBeInstanceOf(Request); expect(request.method).toBe('GET'); expect(request.url).toBe('https://api.example.com/test'); @@ -313,6 +382,7 @@ describe('Converters', () => { describe('responseToProxyResult', () => { it('converts basic Response to API Gateway result', async () => { + // Prepare const response = new Response('Hello World', { status: 200, headers: { @@ -320,8 +390,10 @@ describe('Converters', () => { }, }); + // Act const result = await webResponseToProxyResult(response); + // Assess expect(result.statusCode).toBe(200); expect(result.body).toBe('Hello World'); expect(result.isBase64Encoded).toBe(false); @@ -329,13 +401,16 @@ describe('Converters', () => { }); it('handles single-value headers', async () => { + // Prepare const response = new Response('Hello', { status: 201, headers: { 'content-type': 'text/plain', 'x-custom': 'value' }, }); + // Act const result = await webResponseToProxyResult(response); + // Assess expect(result.statusCode).toBe(201); expect(result.headers).toEqual({ 'content-type': 'text/plain', @@ -344,6 +419,7 @@ describe('Converters', () => { }); it('handles multi-value headers', async () => { + // Prepare const response = new Response('Hello', { status: 200, headers: { @@ -352,8 +428,10 @@ describe('Converters', () => { }, }); + // Act const result = await webResponseToProxyResult(response); + // Assess expect(result.headers).toEqual({ 'content-type': 'application/json' }); expect(result.multiValueHeaders).toEqual({ 'set-cookie': ['cookie1=value1', 'cookie2=value2'], @@ -361,6 +439,7 @@ describe('Converters', () => { }); it('handles mixed single and multi-value headers', async () => { + // Prepare const response = new Response('Hello', { status: 200, headers: { @@ -369,8 +448,10 @@ describe('Converters', () => { }, }); + // Act const result = await webResponseToProxyResult(response); + // Assess expect(result.headers).toEqual({ 'content-type': 'application/json', }); @@ -380,10 +461,13 @@ describe('Converters', () => { }); it('handles different status codes', async () => { + // Prepare const response = new Response('Not Found', { status: 404 }); + // Act const result = await webResponseToProxyResult(response); + // Assess expect(result.statusCode).toBe(404); expect(result.body).toBe('Not Found'); }); @@ -391,15 +475,37 @@ describe('Converters', () => { it('handles empty response body', async () => { const response = new Response(null, { status: 204 }); + // Act const result = await webResponseToProxyResult(response); + // Assess expect(result.statusCode).toBe(204); expect(result.body).toBe(''); }); + + it('handles compressed response body', async () => { + // Prepare + const response = new Response('Hello World', { + status: 200, + headers: { + 'content-encoding': 'gzip', + }, + }); + + // Act + const result = await webResponseToProxyResult(response); + + // Assess + expect(result.isBase64Encoded).toBe(true); + expect(result.body).toEqual( + Buffer.from('Hello World').toString('base64') + ); + }); }); describe('handlerResultToProxyResult', () => { it('returns APIGatewayProxyResult as-is', async () => { + // Prepare const proxyResult = { statusCode: 200, body: 'test', @@ -407,26 +513,34 @@ describe('Converters', () => { isBase64Encoded: false, }; + // Act const result = await handlerResultToProxyResult(proxyResult); + // Assess expect(result).toBe(proxyResult); }); it('converts Response object', async () => { + // Prepare const response = new Response('Hello', { status: 201 }); + // Act const result = await handlerResultToProxyResult(response); + // Assess expect(result.statusCode).toBe(201); expect(result.body).toBe('Hello'); expect(result.isBase64Encoded).toBe(false); }); it('converts plain object to JSON', async () => { + // Prepare const obj = { message: 'success', data: [1, 2, 3] }; + // Act const result = await handlerResultToProxyResult(obj); + // Assess expect(result.statusCode).toBe(200); expect(result.body).toBe(JSON.stringify(obj)); expect(result.headers).toEqual({ 'content-type': 'application/json' }); @@ -436,14 +550,18 @@ describe('Converters', () => { describe('handlerResultToResponse', () => { it('returns Response object as-is', () => { + // Prepare const response = new Response('Hello', { status: 201 }); + // Act const result = handlerResultToWebResponse(response); + // Assess expect(result).toBe(response); }); it('converts APIGatewayProxyResult to Response', async () => { + // Prepare const proxyResult = { statusCode: 201, body: 'Hello World', @@ -451,8 +569,10 @@ describe('Converters', () => { isBase64Encoded: false, }; + // Act const result = handlerResultToWebResponse(proxyResult); + // Assess expect(result).toBeInstanceOf(Response); expect(result.status).toBe(201); expect(await result.text()).toBe('Hello World'); @@ -460,6 +580,7 @@ describe('Converters', () => { }); it('converts APIGatewayProxyResult with multiValueHeaders', async () => { + // Prepare const proxyResult = { statusCode: 200, body: 'test', @@ -470,8 +591,10 @@ describe('Converters', () => { isBase64Encoded: false, }; + // Act const result = handlerResultToWebResponse(proxyResult); + // Assess expect(result.headers.get('content-type')).toBe('application/json'); expect(result.headers.get('Set-Cookie')).toBe( 'cookie1=value1, cookie2=value2' @@ -479,10 +602,13 @@ describe('Converters', () => { }); it('converts plain object to JSON Response with default headers', async () => { + // Prepare const obj = { message: 'success' }; + // Act const result = handlerResultToWebResponse(obj); + // Assess expect(result).toBeInstanceOf(Response); expect(result.status).toBe(200); expect(result.text()).resolves.toBe(JSON.stringify(obj)); @@ -490,16 +616,20 @@ describe('Converters', () => { }); it('uses provided headers for plain object', async () => { + // Prepare const obj = { message: 'success' }; const headers = new Headers({ 'x-custom': 'value' }); + // Act const result = handlerResultToWebResponse(obj, headers); + // Assess expect(result.headers.get('Content-Type')).toBe('application/json'); expect(result.headers.get('x-custom')).toBe('value'); }); it('handles APIGatewayProxyResult with undefined headers', async () => { + // Prepare const proxyResult = { statusCode: 200, body: 'test', @@ -507,13 +637,16 @@ describe('Converters', () => { isBase64Encoded: false, }; + // Act const result = handlerResultToWebResponse(proxyResult); + // Assess expect(result).toBeInstanceOf(Response); expect(result.status).toBe(200); }); it('handles APIGatewayProxyResult with undefined multiValueHeaders', async () => { + // Prepare const proxyResult = { statusCode: 200, body: 'test', @@ -522,12 +655,15 @@ describe('Converters', () => { isBase64Encoded: false, }; + // Act const result = handlerResultToWebResponse(proxyResult); + // Assess expect(result.headers.get('content-type')).toBe('text/plain'); }); it('handles APIGatewayProxyResult with undefined values in multiValueHeaders', async () => { + // Prepare const proxyResult = { statusCode: 200, body: 'test', @@ -536,8 +672,10 @@ describe('Converters', () => { isBase64Encoded: false, }; + // Act const result = handlerResultToWebResponse(proxyResult); + // Assess expect(result.headers.get('content-type')).toBe('text/plain'); }); }); diff --git a/packages/event-handler/tests/unit/rest/helpers.ts b/packages/event-handler/tests/unit/rest/helpers.ts index 4c846d3e81..93255f79c1 100644 --- a/packages/event-handler/tests/unit/rest/helpers.ts +++ b/packages/event-handler/tests/unit/rest/helpers.ts @@ -3,11 +3,12 @@ import type { Middleware } from '../../../src/types/rest.js'; export const createTestEvent = ( path: string, - httpMethod: string + httpMethod: string, + headers: Record = {} ): APIGatewayProxyEvent => ({ path, httpMethod, - headers: {}, + headers, body: null, multiValueHeaders: {}, isBase64Encoded: false, @@ -65,3 +66,14 @@ export const createNoNextMiddleware = ( // Intentionally doesn't call next() }; }; + +export const createSettingHeadersMiddleware = (headers: { + [key: string]: string; +}): Middleware => { + return async (_params, options, next) => { + await next(); + Object.entries(headers).forEach(([key, value]) => { + options.res.headers.set(key, value); + }); + }; +}; diff --git a/packages/event-handler/tests/unit/rest/middleware/compress.test.ts b/packages/event-handler/tests/unit/rest/middleware/compress.test.ts new file mode 100644 index 0000000000..056b04219a --- /dev/null +++ b/packages/event-handler/tests/unit/rest/middleware/compress.test.ts @@ -0,0 +1,176 @@ +import { gzipSync } from 'node:zlib'; +import context from '@aws-lambda-powertools/testing-utils/context'; +import { Router } from 'src/rest/Router.js'; +import { beforeEach, describe, expect, it } from 'vitest'; +import { compress } from '../../../../src/rest/middleware/index.js'; +import { createSettingHeadersMiddleware, createTestEvent } from '../helpers.js'; + +describe('Compress Middleware', () => { + const event = createTestEvent('/test', 'GET'); + let app: Router; + const body = { test: 'x'.repeat(2000) }; + + beforeEach(() => { + app = new Router(); + app.use(compress()); + app.use( + createSettingHeadersMiddleware({ + 'content-length': '2000', + }) + ); + }); + + it('compresses response when conditions are met', async () => { + // Prepare + app.get('/test', async () => { + return body; + }); + + // Act + const result = await app.resolve(event, context); + + // Assess + expect(result.headers?.['content-encoding']).toBe('gzip'); + expect(result.headers?.['content-length']).toBeUndefined(); + expect(result.isBase64Encoded).toBe(true); + expect(result.body).toEqual( + gzipSync(JSON.stringify(body)).toString('base64') + ); + }); + + it('skips compression when content is below threshold', async () => { + // Prepare + const application = new Router(); + application.get( + '/test', + [ + compress({ threshold: 1024 }), + createSettingHeadersMiddleware({ + 'content-length': '1', + }), + ], + async () => { + return { test: 'x' }; + } + ); + + // Act + const result = await application.resolve(event, context); + + // Assess + expect(result.headers?.['content-encoding']).toBeUndefined(); + expect(result.isBase64Encoded).toBe(false); + }); + + it('skips compression for HEAD requests', async () => { + // Prepare + const headEvent = createTestEvent('/test', 'HEAD'); + app.head('/test', async () => { + return body; + }); + + // Act + const result = await app.resolve(headEvent, context); + + // Assess + expect(result.headers?.['content-encoding']).toBeUndefined(); + expect(result.isBase64Encoded).toBe(false); + }); + + it('skips compression when already encoded', async () => { + // Prepare + const application = new Router(); + application.get( + '/test', + [ + compress({ + encoding: 'deflate', + }), + compress({ + encoding: 'gzip', + }), + createSettingHeadersMiddleware({ + 'content-length': '2000', + }), + ], + async () => { + return body; + } + ); + + // Act + const result = await application.resolve(event, context); + + // Assess + expect(result.headers?.['content-encoding']).toEqual('gzip'); + expect(result.isBase64Encoded).toBe(true); + }); + + it('skips compression when cache-control no-transform is set', async () => { + // Prepare + const application = new Router(); + application.get( + '/test', + [ + compress(), + createSettingHeadersMiddleware({ + 'content-length': '2000', + 'cache-control': 'no-transform', + }), + ], + async () => { + return body; + } + ); + + // Act + const result = await application.resolve(event, context); + + // Assess + expect(result.headers?.['content-encoding']).toBeUndefined(); + expect(result.isBase64Encoded).toBe(false); + }); + + it('uses specified encoding when provided', async () => { + // Prepare + const application = new Router(); + application.get( + '/test', + [ + compress({ + encoding: 'deflate', + }), + createSettingHeadersMiddleware({ + 'content-length': '2000', + }), + ], + async () => { + return body; + } + ); + + // Act + const result = await application.resolve(event, context); + + // Assess + expect(result.headers?.['content-encoding']).toBe('deflate'); + expect(result.isBase64Encoded).toBe(true); + }); + + it('does not compress if Accept-Encoding is set to identity', async () => { + // Prepare + const noCompressionEvent = createTestEvent('/test', 'GET', { + 'Accept-Encoding': 'identity', + }); + app.get('/test', async () => { + return body; + }); + + // Act + const result = await app.resolve(noCompressionEvent, context); + + // Assess + expect(result.headers?.['content-encoding']).toBeUndefined(); + expect(result.isBase64Encoded).toBe(false); + }); +}); From 972cd1f86b6ea01c93abef5e6cde7876360196f1 Mon Sep 17 00:00:00 2001 From: Daniel Abib Date: Thu, 18 Sep 2025 12:10:14 -0300 Subject: [PATCH 162/255] feat(event-handler): add CORS middleware support (#4477) Signed-off-by: Daniel ABIB Co-authored-by: Daniel ABIB Co-authored-by: Swopnil Dangol --- packages/event-handler/src/rest/constants.ts | 17 +++ .../event-handler/src/rest/middleware/cors.ts | 98 ++++++++++++++++ .../src/rest/middleware/index.ts | 1 + packages/event-handler/src/types/index.ts | 1 + packages/event-handler/src/types/rest.ts | 43 +++++++ .../event-handler/tests/unit/rest/helpers.ts | 11 ++ .../tests/unit/rest/middleware/cors.test.ts | 111 ++++++++++++++++++ 7 files changed, 282 insertions(+) create mode 100644 packages/event-handler/src/rest/middleware/cors.ts create mode 100644 packages/event-handler/tests/unit/rest/middleware/cors.test.ts diff --git a/packages/event-handler/src/rest/constants.ts b/packages/event-handler/src/rest/constants.ts index b647b78fb9..ae9a80103f 100644 --- a/packages/event-handler/src/rest/constants.ts +++ b/packages/event-handler/src/rest/constants.ts @@ -88,6 +88,23 @@ export const SAFE_CHARS = "-._~()'!*:@,;=+&$"; export const UNSAFE_CHARS = '%<> \\[\\]{}|^'; +/** + * Default CORS configuration + */ +export const DEFAULT_CORS_OPTIONS = { + origin: '*', + allowMethods: ['DELETE', 'GET', 'HEAD', 'PATCH', 'POST', 'PUT'], + allowHeaders: [ + 'Authorization', + 'Content-Type', + 'X-Amz-Date', + 'X-Api-Key', + 'X-Amz-Security-Token', + ], + exposeHeaders: [], + credentials: false +}; + export const DEFAULT_COMPRESSION_RESPONSE_THRESHOLD = 1024; export const CACHE_CONTROL_NO_TRANSFORM_REGEX = diff --git a/packages/event-handler/src/rest/middleware/cors.ts b/packages/event-handler/src/rest/middleware/cors.ts new file mode 100644 index 0000000000..6809a1d2d4 --- /dev/null +++ b/packages/event-handler/src/rest/middleware/cors.ts @@ -0,0 +1,98 @@ +import type { + CorsOptions, + Middleware, +} from '../../types/rest.js'; +import { + DEFAULT_CORS_OPTIONS, + HttpErrorCodes, + HttpVerbs, +} from '../constants.js'; + +/** + * Resolves the origin value based on the configuration + */ +const resolveOrigin = ( + originConfig: NonNullable, + requestOrigin: string | null, +): string => { + if (Array.isArray(originConfig)) { + return requestOrigin && originConfig.includes(requestOrigin) ? requestOrigin : ''; + } + return originConfig; +}; + +/** + * Creates a CORS middleware that adds appropriate CORS headers to responses + * and handles OPTIONS preflight requests. + * + * @example + * ```typescript + * import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; + * import { cors } from '@aws-lambda-powertools/event-handler/experimental-rest/middleware'; + * + * const app = new Router(); + * + * // Use default configuration + * app.use(cors()); + * + * // Custom configuration + * app.use(cors({ + * origin: 'https://example.com', + * allowMethods: ['GET', 'POST'], + * credentials: true, + * })); + * + * // Dynamic origin with function + * app.use(cors({ + * origin: (origin, reqCtx) => { + * const allowedOrigins = ['https://app.com', 'https://admin.app.com']; + * return origin && allowedOrigins.includes(origin); + * } + * })); + * ``` + * + * @param options.origin - The origin to allow requests from + * @param options.allowMethods - The HTTP methods to allow + * @param options.allowHeaders - The headers to allow + * @param options.exposeHeaders - The headers to expose + * @param options.credentials - Whether to allow credentials + * @param options.maxAge - The maximum age for the preflight response + */ +export const cors = (options?: CorsOptions): Middleware => { + const config = { + ...DEFAULT_CORS_OPTIONS, + ...options + }; + + return async (_params, reqCtx, next) => { + const requestOrigin = reqCtx.request.headers.get('Origin'); + const resolvedOrigin = resolveOrigin(config.origin, requestOrigin); + + reqCtx.res.headers.set('access-control-allow-origin', resolvedOrigin); + if (resolvedOrigin !== '*') { + reqCtx.res.headers.set('Vary', 'Origin'); + } + config.allowMethods.forEach(method => { + reqCtx.res.headers.append('access-control-allow-methods', method); + }); + config.allowHeaders.forEach(header => { + reqCtx.res.headers.append('access-control-allow-headers', header); + }); + config.exposeHeaders.forEach(header => { + reqCtx.res.headers.append('access-control-expose-headers', header); + }); + reqCtx.res.headers.set('access-control-allow-credentials', config.credentials.toString()); + if (config.maxAge !== undefined) { + reqCtx.res.headers.set('access-control-max-age', config.maxAge.toString()); + } + + // Handle preflight OPTIONS request + if (reqCtx.request.method === HttpVerbs.OPTIONS && reqCtx.request.headers.has('Access-Control-Request-Method')) { + return new Response(null, { + status: HttpErrorCodes.NO_CONTENT, + headers: reqCtx.res.headers, + }); + } + await next(); + }; +}; diff --git a/packages/event-handler/src/rest/middleware/index.ts b/packages/event-handler/src/rest/middleware/index.ts index 2b65a8ee8e..96686c578b 100644 --- a/packages/event-handler/src/rest/middleware/index.ts +++ b/packages/event-handler/src/rest/middleware/index.ts @@ -1 +1,2 @@ export { compress } from './compress.js'; +export { cors } from './cors.js'; diff --git a/packages/event-handler/src/types/index.ts b/packages/event-handler/src/types/index.ts index 4625fcf1fe..56e017c563 100644 --- a/packages/event-handler/src/types/index.ts +++ b/packages/event-handler/src/types/index.ts @@ -32,6 +32,7 @@ export type { } from './common.js'; export type { + CorsOptions, ErrorHandler, ErrorResolveOptions, ErrorResponse, diff --git a/packages/event-handler/src/types/rest.ts b/packages/event-handler/src/types/rest.ts index 0ba650c0dc..e4924d1d2c 100644 --- a/packages/event-handler/src/types/rest.ts +++ b/packages/event-handler/src/types/rest.ts @@ -111,6 +111,48 @@ type ValidationResult = { issues: string[]; }; +/** + * Configuration options for CORS middleware + */ +type CorsOptions = { + /** + * The Access-Control-Allow-Origin header value. + * Can be a string, array of strings. + * @default '*' + */ + origin?: string | string[]; + + /** + * The Access-Control-Allow-Methods header value. + * @default ['DELETE', 'GET', 'HEAD', 'PATCH', 'POST', 'PUT'] + */ + allowMethods?: string[]; + + /** + * The Access-Control-Allow-Headers header value. + * @default ['Authorization', 'Content-Type', 'X-Amz-Date', 'X-Api-Key', 'X-Amz-Security-Token'] + */ + allowHeaders?: string[]; + + /** + * The Access-Control-Expose-Headers header value. + * @default [] + */ + exposeHeaders?: string[]; + + /** + * The Access-Control-Allow-Credentials header value. + * @default false + */ + credentials?: boolean; + + /** + * The Access-Control-Max-Age header value in seconds. + * Only applicable for preflight requests. + */ + maxAge?: number; +}; + type CompressionOptions = { encoding?: 'gzip' | 'deflate'; threshold?: number; @@ -118,6 +160,7 @@ type CompressionOptions = { export type { CompiledRoute, + CorsOptions, DynamicRoute, ErrorResponse, ErrorConstructor, diff --git a/packages/event-handler/tests/unit/rest/helpers.ts b/packages/event-handler/tests/unit/rest/helpers.ts index 93255f79c1..6edd2c4678 100644 --- a/packages/event-handler/tests/unit/rest/helpers.ts +++ b/packages/event-handler/tests/unit/rest/helpers.ts @@ -77,3 +77,14 @@ export const createSettingHeadersMiddleware = (headers: { }); }; }; + +export const createHeaderCheckMiddleware = (headers: { + [key: string]: string; +}): Middleware => { + return async (_params, options, next) => { + options.res.headers.forEach((value, key) => { + headers[key] = value; + }); + await next(); + }; +}; \ No newline at end of file diff --git a/packages/event-handler/tests/unit/rest/middleware/cors.test.ts b/packages/event-handler/tests/unit/rest/middleware/cors.test.ts new file mode 100644 index 0000000000..989e875d31 --- /dev/null +++ b/packages/event-handler/tests/unit/rest/middleware/cors.test.ts @@ -0,0 +1,111 @@ +import { beforeEach, describe, expect, it } from 'vitest'; +import context from '@aws-lambda-powertools/testing-utils/context'; +import { cors } from '../../../../src/rest/middleware/cors.js'; +import { createTestEvent, createHeaderCheckMiddleware } from '../helpers.js'; +import { Router } from '../../../../src/rest/Router.js'; +import { DEFAULT_CORS_OPTIONS } from 'src/rest/constants.js'; + +describe('CORS Middleware', () => { + const getRequestEvent = createTestEvent('/test', 'GET'); + const optionsRequestEvent = createTestEvent('/test', 'OPTIONS'); + let app: Router; + + const customCorsOptions = { + origin: 'https://example.com', + allowMethods: ['GET', 'POST'], + allowHeaders: ['Authorization', 'Content-Type'], + credentials: true, + exposeHeaders: ['Authorization', 'X-Custom-Header'], + maxAge: 86400, + }; + + const expectedDefaultHeaders = { + "access-control-allow-credentials": "false", + "access-control-allow-headers": "Authorization, Content-Type, X-Amz-Date, X-Api-Key, X-Amz-Security-Token", + "access-control-allow-methods": "DELETE, GET, HEAD, PATCH, POST, PUT", + "access-control-allow-origin": "*", + }; + + beforeEach(() => { + app = new Router(); + app.use(cors()); + }); + + it('uses default configuration when no options are provided', async () => { + // Prepare + const corsHeaders: { [key: string]: string } = {}; + app.get('/test', [createHeaderCheckMiddleware(corsHeaders)], async () => ({ success: true })); + + // Act + const result = await app.resolve(getRequestEvent, context); + + // Assess + expect(result.headers?.['access-control-allow-origin']).toEqual(DEFAULT_CORS_OPTIONS.origin); + expect(result.multiValueHeaders?.['access-control-allow-methods']).toEqual(DEFAULT_CORS_OPTIONS.allowMethods); + expect(result.multiValueHeaders?.['access-control-allow-headers']).toEqual(DEFAULT_CORS_OPTIONS.allowHeaders); + expect(result.headers?.['access-control-allow-credentials']).toEqual(DEFAULT_CORS_OPTIONS.credentials.toString()); + expect(corsHeaders).toMatchObject(expectedDefaultHeaders); + }); + + it('merges user options with defaults', async () => { + // Prepare + const corsHeaders: { [key: string]: string } = {}; + const app = new Router(); + app.get('/test', [cors(customCorsOptions), createHeaderCheckMiddleware(corsHeaders)], async () => ({ success: true })); + + // Act + const result = await app.resolve(getRequestEvent, context); + + // Assess + expect(result.headers?.['access-control-allow-origin']).toEqual('https://example.com'); + expect(result.multiValueHeaders?.['access-control-allow-methods']).toEqual(['GET', 'POST']); + expect(result.multiValueHeaders?.['access-control-allow-headers']).toEqual(['Authorization', 'Content-Type']); + expect(result.headers?.['access-control-allow-credentials']).toEqual('true'); + expect(result.multiValueHeaders?.['access-control-expose-headers']).toEqual(['Authorization', 'X-Custom-Header']); + expect(result.headers?.['access-control-max-age']).toEqual('86400'); + expect(corsHeaders).toMatchObject({ + "access-control-allow-credentials": "true", + "access-control-allow-headers": "Authorization, Content-Type", + "access-control-allow-methods": "GET, POST", + "access-control-allow-origin": "https://example.com", + }); + }); + + it.each([ + ['matching', 'https://app.com', 'https://app.com'], + ['non-matching', 'https://non-matching.com', ''] + ])('handles array origin with %s request', async (_, origin, expected) => { + // Prepare + const app = new Router(); + app.get('/test', [cors({ origin: ['https://app.com', 'https://admin.app.com'] })], async () => ({ success: true })); + + // Act + const result = await app.resolve(createTestEvent('/test', 'GET', { 'Origin': origin }), context); + + // Assess + expect(result.headers?.['access-control-allow-origin']).toEqual(expected); + }); + + it('handles OPTIONS preflight requests', async () => { + // Prepare + app.options('/test', async () => ({ foo: 'bar' })); + + // Act + const result = await app.resolve(createTestEvent('/test', 'OPTIONS', { 'Access-Control-Request-Method': 'GET' }), context); + + // Assess + expect(result.statusCode).toBe(204); + }); + + it('calls the next middleware if the Access-Control-Request-Method is not present', async () => { + // Prepare + const corsHeaders: { [key: string]: string } = {}; + app.options('/test', [createHeaderCheckMiddleware(corsHeaders)], async () => ({ success: true })); + + // Act + await app.resolve(optionsRequestEvent, context); + + // Assess + expect(corsHeaders).toMatchObject(expectedDefaultHeaders); + }); +}); From 49d5f8a4f36a5af26c573f7706347f34ec70689e Mon Sep 17 00:00:00 2001 From: Stefano Vozza Date: Fri, 19 Sep 2025 11:53:24 +0100 Subject: [PATCH 163/255] fix(event-handler): run global middleware on all requests for REST API (#4507) --- packages/event-handler/src/rest/Router.ts | 39 +++++++++------- packages/event-handler/src/rest/converters.ts | 9 +++- .../tests/unit/rest/Router/decorators.test.ts | 13 +++--- .../tests/unit/rest/Router/middleware.test.ts | 45 +++++++++++++++++++ .../tests/unit/rest/converters.test.ts | 31 ++++++++----- 5 files changed, 104 insertions(+), 33 deletions(-) diff --git a/packages/event-handler/src/rest/Router.ts b/packages/event-handler/src/rest/Router.ts index a8cd9b37a4..d54cec4a02 100644 --- a/packages/event-handler/src/rest/Router.ts +++ b/packages/event-handler/src/rest/Router.ts @@ -226,33 +226,40 @@ class Router { const route = this.routeRegistry.resolve(method, path); - if (route === null) { - throw new NotFoundError(`Route ${path} for method ${method} not found`); - } - - const handler = - options?.scope != null - ? route.handler.bind(options.scope) - : route.handler; - const handlerMiddleware: Middleware = async (params, reqCtx, next) => { - const handlerResult = await handler(params, reqCtx); - reqCtx.res = handlerResultToWebResponse( - handlerResult, - reqCtx.res.headers - ); + if (route === null) { + const notFoundRes = await this.handleError( + new NotFoundError(`Route ${path} for method ${method} not found`), + { ...reqCtx, scope: options?.scope } + ); + reqCtx.res = handlerResultToWebResponse( + notFoundRes, + reqCtx.res.headers + ); + } else { + const handler = + options?.scope != null + ? route.handler.bind(options.scope) + : route.handler; + + const handlerResult = await handler(params, reqCtx); + reqCtx.res = handlerResultToWebResponse( + handlerResult, + reqCtx.res.headers + ); + } await next(); }; const middleware = composeMiddleware([ ...this.middleware, - ...route.middleware, + ...(route?.middleware ?? []), handlerMiddleware, ]); const middlewareResult = await middleware( - route.params, + route?.params ?? {}, requestContext, () => Promise.resolve() ); diff --git a/packages/event-handler/src/rest/converters.ts b/packages/event-handler/src/rest/converters.ts index 0eed7f92e6..d82f2ada5c 100644 --- a/packages/event-handler/src/rest/converters.ts +++ b/packages/event-handler/src/rest/converters.ts @@ -140,7 +140,14 @@ export const handlerResultToWebResponse = ( resHeaders?: Headers ): Response => { if (response instanceof Response) { - return response; + const headers = new Headers(resHeaders); + for (const [key, value] of response.headers.entries()) { + headers.set(key, value); + } + return new Response(response.body, { + status: response.status, + headers, + }); } const headers = new Headers(resHeaders); diff --git a/packages/event-handler/tests/unit/rest/Router/decorators.test.ts b/packages/event-handler/tests/unit/rest/Router/decorators.test.ts index 246093cc05..07cae4b0f2 100644 --- a/packages/event-handler/tests/unit/rest/Router/decorators.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/decorators.test.ts @@ -256,29 +256,32 @@ describe('Class: Router - Decorators', () => { }); }); - it('works with notFound decorator', async () => { + it('works with notFound decorator and preserves scope', async () => { // Prepare const app = new Router(); class Lambda { + public scope = 'scoped'; + @app.notFound() public async handleNotFound(error: NotFoundError) { return { statusCode: HttpErrorCodes.NOT_FOUND, error: 'Not Found', - message: `Decorated: ${error.message}`, + message: `${this.scope}: ${error.message}`, }; } public async handler(event: unknown, _context: Context) { - return app.resolve(event, _context); + return app.resolve(event, _context, { scope: this }); } } const lambda = new Lambda(); + const handler = lambda.handler.bind(lambda); // Act - const result = await lambda.handler( + const result = await handler( createTestEvent('/nonexistent', 'GET'), context ); @@ -289,7 +292,7 @@ describe('Class: Router - Decorators', () => { body: JSON.stringify({ statusCode: HttpErrorCodes.NOT_FOUND, error: 'Not Found', - message: 'Decorated: Route /nonexistent for method GET not found', + message: 'scoped: Route /nonexistent for method GET not found', }), headers: { 'content-type': 'application/json' }, isBase64Encoded: false, diff --git a/packages/event-handler/tests/unit/rest/Router/middleware.test.ts b/packages/event-handler/tests/unit/rest/Router/middleware.test.ts index cf1a169be3..6c239c80d6 100644 --- a/packages/event-handler/tests/unit/rest/Router/middleware.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/middleware.test.ts @@ -421,6 +421,33 @@ describe('Class: Router - Middleware', () => { }); }); + it('headers set by handler before next() take precedence', async () => { + // Prepare + const app = new Router(); + + app.use(async (_params, reqCtx, next) => { + reqCtx.res.headers.set('x-before-handler', 'middleware-value'); + await next(); + }); + + app.get('/handler-precedence', async () => { + const response = Response.json({ success: true }); + response.headers.set('x-before-handler', 'handler-value'); + return response; + }); + + // Act + const result = await app.resolve( + createTestEvent('/handler-precedence', 'GET'), + context + ); + + // Assess + expect(result.statusCode).toBe(200); + expect(result.headers?.['content-type']).toBe('application/json'); + expect(result.headers?.['x-before-handler']).toBe('handler-value'); + }); + it('overwrites headers when set later in the middleware stack', async () => { // Prepare const app = new Router(); @@ -455,6 +482,24 @@ describe('Class: Router - Middleware', () => { }); }); + it('executes global middleware even when route is not found', async () => { + // Prepare + const app = new Router(); + const executionOrder: string[] = []; + + const globalMiddleware = createTrackingMiddleware( + 'global', + executionOrder + ); + app.use(globalMiddleware); + + // Act + await app.resolve(createTestEvent('/nonexistent', 'GET'), context); + + // Assess + expect(executionOrder).toEqual(['global-start', 'global-end']); + }); + it('works with class decorators and preserves scope access', async () => { // Prepare const app = new Router(); diff --git a/packages/event-handler/tests/unit/rest/converters.test.ts b/packages/event-handler/tests/unit/rest/converters.test.ts index 5bac1f13b9..e33c6136e6 100644 --- a/packages/event-handler/tests/unit/rest/converters.test.ts +++ b/packages/event-handler/tests/unit/rest/converters.test.ts @@ -549,17 +549,6 @@ describe('Converters', () => { }); describe('handlerResultToResponse', () => { - it('returns Response object as-is', () => { - // Prepare - const response = new Response('Hello', { status: 201 }); - - // Act - const result = handlerResultToWebResponse(response); - - // Assess - expect(result).toBe(response); - }); - it('converts APIGatewayProxyResult to Response', async () => { // Prepare const proxyResult = { @@ -678,5 +667,25 @@ describe('Converters', () => { // Assess expect(result.headers.get('content-type')).toBe('text/plain'); }); + + it('merges headers from resHeaders with Response object, headers from Response take precedence', () => { + // Prepare + const response = new Response('Hello', { + headers: { 'content-type': 'text/plain' }, + }); + const resHeaders = new Headers({ + 'x-custom': 'value', + 'content-type': 'application/json', // should not override existing + }); + + // Act + const result = handlerResultToWebResponse(response, resHeaders); + + // Assess + expect(result.headers.get('content-type')).toBe('text/plain'); + expect(result.headers.get('x-custom')).toBe('value'); + expect(result.status).toBe(200); + expect(result.text()).resolves.toBe('Hello'); + }); }); }); From 227ce0059691dcde0877f9b1b65f05d5c22fa7e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 20 Sep 2025 09:16:43 +0100 Subject: [PATCH 164/255] chore(deps): bump mkdocs-llmstxt from 0.3.1 to 0.3.2 in /docs (#4508) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/requirements.in | 2 +- docs/requirements.txt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/requirements.in b/docs/requirements.in index f8adff9be7..2ac3e7ab0a 100644 --- a/docs/requirements.in +++ b/docs/requirements.in @@ -3,4 +3,4 @@ mkdocs-material==9.6.20 mkdocs-git-revision-date-plugin==0.3.2 mkdocs-exclude==1.0.2 mkdocs-typedoc==1.0.4 -mkdocs-llmstxt==0.3.1 +mkdocs-llmstxt==0.3.2 diff --git a/docs/requirements.txt b/docs/requirements.txt index e53921473e..3198d019a1 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -274,9 +274,9 @@ mkdocs-get-deps==0.2.0 \ mkdocs-git-revision-date-plugin==0.3.2 \ --hash=sha256:2e67956cb01823dd2418e2833f3623dee8604cdf223bddd005fe36226a56f6ef # via -r requirements.in -mkdocs-llmstxt==0.3.1 \ - --hash=sha256:123119d9b984c1d1224ed5af250bfbc49879ad83decdaff59d8b0ebb459ddc54 \ - --hash=sha256:31f5b6aaae6123c09a2b1c32912c3eb21ccb356b5db7abb867f105e8cc392653 +mkdocs-llmstxt==0.3.2 \ + --hash=sha256:dd63acb8257fca3244058fd820acd4700c1626dbe48ad3a1a2cc9c599f8e4b7f \ + --hash=sha256:fb363205d6f1452411dc5069f62012cb6b29e1788f6db9cc17793bdca7eabea8 # via -r requirements.in mkdocs-material==9.6.20 \ --hash=sha256:b8d8c8b0444c7c06dd984b55ba456ce731f0035c5a1533cc86793618eb1e6c82 \ From 7d93038e16cdbf93c757622ea7de8fefe359252b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 20 Sep 2025 09:18:58 +0100 Subject: [PATCH 165/255] chore(deps): bump @types/node from 24.5.1 to 24.5.2 (#4505) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- examples/app/package.json | 4 ++-- package-lock.json | 12 ++++++------ package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 031f7dbee3..53a7bfeac9 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -29,7 +29,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.152", - "@types/node": "24.5.1", + "@types/node": "24.5.2", "aws-cdk-lib": "^2.214.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -48,7 +48,7 @@ "@aws-sdk/lib-dynamodb": "^3.888.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", - "@types/node": "24.5.1", + "@types/node": "24.5.2", "aws-cdk": "^2.1029.1", "constructs": "^10.4.2", "esbuild": "^0.25.9", diff --git a/package-lock.json b/package-lock.json index 3ffde5872b..d12b0a2842 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.4", "@types/aws-lambda": "^8.10.152", - "@types/node": "^24.5.1", + "@types/node": "^24.5.2", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.1.6", @@ -60,7 +60,7 @@ "@aws-sdk/lib-dynamodb": "^3.888.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", - "@types/node": "24.5.1", + "@types/node": "24.5.2", "aws-cdk": "^2.1029.1", "constructs": "^10.4.2", "esbuild": "^0.25.9", @@ -68,7 +68,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.152", - "@types/node": "24.5.1", + "@types/node": "24.5.2", "aws-cdk-lib": "^2.214.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -5096,9 +5096,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.5.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.1.tgz", - "integrity": "sha512-/SQdmUP2xa+1rdx7VwB9yPq8PaKej8TD5cQ+XfKDPWWC+VDJU4rvVVagXqKUzhKjtFoNA8rXDJAkCxQPAe00+Q==", + "version": "24.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz", + "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==", "license": "MIT", "dependencies": { "undici-types": "~7.12.0" diff --git a/package.json b/package.json index 5ca711e48b..d6c59d5158 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.4", "@types/aws-lambda": "^8.10.152", - "@types/node": "^24.5.1", + "@types/node": "^24.5.2", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.1.6", From 94334ee5fa02e293f6b564570ec98582fcae9145 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 20 Sep 2025 09:24:09 +0100 Subject: [PATCH 166/255] chore(deps): bump esbuild from 0.25.9 to 0.25.10 (#4503) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- examples/app/package.json | 2 +- layers/package.json | 2 +- package-lock.json | 220 +++++++++++++++++----------------- packages/testing/package.json | 2 +- 4 files changed, 113 insertions(+), 113 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 53a7bfeac9..b8784a9eaf 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -51,7 +51,7 @@ "@types/node": "24.5.2", "aws-cdk": "^2.1029.1", "constructs": "^10.4.2", - "esbuild": "^0.25.9", + "esbuild": "^0.25.10", "typescript": "^5.9.2" } } diff --git a/layers/package.json b/layers/package.json index 1bda881101..9c157e0cda 100644 --- a/layers/package.json +++ b/layers/package.json @@ -42,7 +42,7 @@ "dependencies": { "aws-cdk": "^2.1029.1", "aws-cdk-lib": "^2.214.0", - "esbuild": "^0.25.9", + "esbuild": "^0.25.10", "tsx": "^4.20.5" } } diff --git a/package-lock.json b/package-lock.json index d12b0a2842..3528edf5e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,7 +63,7 @@ "@types/node": "24.5.2", "aws-cdk": "^2.1029.1", "constructs": "^10.4.2", - "esbuild": "^0.25.9", + "esbuild": "^0.25.10", "typescript": "^5.9.2" }, "devDependencies": { @@ -136,7 +136,7 @@ "dependencies": { "aws-cdk": "^2.1029.1", "aws-cdk-lib": "^2.214.0", - "esbuild": "^0.25.9", + "esbuild": "^0.25.10", "tsx": "^4.20.5" }, "bin": { @@ -3130,9 +3130,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", - "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", "cpu": [ "ppc64" ], @@ -3146,9 +3146,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", - "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", "cpu": [ "arm" ], @@ -3162,9 +3162,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", - "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", "cpu": [ "arm64" ], @@ -3178,9 +3178,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", - "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", "cpu": [ "x64" ], @@ -3194,9 +3194,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", - "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", "cpu": [ "arm64" ], @@ -3210,9 +3210,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", - "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", "cpu": [ "x64" ], @@ -3226,9 +3226,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", - "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", "cpu": [ "arm64" ], @@ -3242,9 +3242,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", - "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", "cpu": [ "x64" ], @@ -3258,9 +3258,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", - "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", "cpu": [ "arm" ], @@ -3274,9 +3274,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", - "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", "cpu": [ "arm64" ], @@ -3290,9 +3290,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", - "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", "cpu": [ "ia32" ], @@ -3306,9 +3306,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", - "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", "cpu": [ "loong64" ], @@ -3322,9 +3322,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", - "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", "cpu": [ "mips64el" ], @@ -3338,9 +3338,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", - "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", "cpu": [ "ppc64" ], @@ -3354,9 +3354,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", - "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", "cpu": [ "riscv64" ], @@ -3370,9 +3370,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", - "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", "cpu": [ "s390x" ], @@ -3386,9 +3386,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", - "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", "cpu": [ "x64" ], @@ -3402,9 +3402,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", - "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", "cpu": [ "arm64" ], @@ -3418,9 +3418,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", - "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", "cpu": [ "x64" ], @@ -3434,9 +3434,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", - "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", "cpu": [ "arm64" ], @@ -3450,9 +3450,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", - "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", "cpu": [ "x64" ], @@ -3466,9 +3466,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", - "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", "cpu": [ "arm64" ], @@ -3482,9 +3482,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", - "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", "cpu": [ "x64" ], @@ -3498,9 +3498,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", - "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", "cpu": [ "arm64" ], @@ -3514,9 +3514,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", - "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", "cpu": [ "ia32" ], @@ -3530,9 +3530,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", "cpu": [ "x64" ], @@ -7255,9 +7255,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", - "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -7267,32 +7267,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.9", - "@esbuild/android-arm": "0.25.9", - "@esbuild/android-arm64": "0.25.9", - "@esbuild/android-x64": "0.25.9", - "@esbuild/darwin-arm64": "0.25.9", - "@esbuild/darwin-x64": "0.25.9", - "@esbuild/freebsd-arm64": "0.25.9", - "@esbuild/freebsd-x64": "0.25.9", - "@esbuild/linux-arm": "0.25.9", - "@esbuild/linux-arm64": "0.25.9", - "@esbuild/linux-ia32": "0.25.9", - "@esbuild/linux-loong64": "0.25.9", - "@esbuild/linux-mips64el": "0.25.9", - "@esbuild/linux-ppc64": "0.25.9", - "@esbuild/linux-riscv64": "0.25.9", - "@esbuild/linux-s390x": "0.25.9", - "@esbuild/linux-x64": "0.25.9", - "@esbuild/netbsd-arm64": "0.25.9", - "@esbuild/netbsd-x64": "0.25.9", - "@esbuild/openbsd-arm64": "0.25.9", - "@esbuild/openbsd-x64": "0.25.9", - "@esbuild/openharmony-arm64": "0.25.9", - "@esbuild/sunos-x64": "0.25.9", - "@esbuild/win32-arm64": "0.25.9", - "@esbuild/win32-ia32": "0.25.9", - "@esbuild/win32-x64": "0.25.9" + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" } }, "node_modules/estree-walker": { @@ -10988,7 +10988,7 @@ "@aws-sdk/client-lambda": "^3.888.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.214.0", - "esbuild": "^0.25.9", + "esbuild": "^0.25.10", "promise-retry": "^2.0.1" }, "devDependencies": { diff --git a/packages/testing/package.json b/packages/testing/package.json index b90656d5db..f177f562c7 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -101,7 +101,7 @@ "@aws-sdk/client-lambda": "^3.888.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.214.0", - "esbuild": "^0.25.9", + "esbuild": "^0.25.10", "promise-retry": "^2.0.1" }, "devDependencies": { From 1e72e57cabe410020f1df014a465cbfd0562cbd8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 20 Sep 2025 09:26:29 +0100 Subject: [PATCH 167/255] chore(deps-dev): bump @valkey/valkey-glide from 2.0.1 to 2.1.0 (#4504) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi Co-authored-by: Stefano Vozza --- examples/snippets/package.json | 2 +- package-lock.json | 62 +++++++++++++++++----------------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/examples/snippets/package.json b/examples/snippets/package.json index 7e29e8d069..dbd1ece0e7 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -40,7 +40,7 @@ "@aws-sdk/util-dynamodb": "^3.888.0", "@middy/core": "^4.7.0", "@redis/client": "^5.8.2", - "@valkey/valkey-glide": "^2.0.1", + "@valkey/valkey-glide": "^2.1.0", "aws-sdk": "^2.1692.0", "aws-sdk-client-mock": "^4.1.0", "zod": "^4.1.9" diff --git a/package-lock.json b/package-lock.json index 3528edf5e2..12e3e756d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -102,16 +102,16 @@ "@aws-sdk/util-dynamodb": "^3.888.0", "@middy/core": "^4.7.0", "@redis/client": "^5.8.2", - "@valkey/valkey-glide": "^2.0.1", + "@valkey/valkey-glide": "^2.1.0", "aws-sdk": "^2.1692.0", "aws-sdk-client-mock": "^4.1.0", "zod": "^4.1.9" } }, "examples/snippets/node_modules/@valkey/valkey-glide": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@valkey/valkey-glide/-/valkey-glide-2.0.1.tgz", - "integrity": "sha512-qJwyjgNnwGYObYLkFmsM1MvWmiCvYUqBvhe8YzM7bBd22o1CqO0IWnd2INVdCHLA4mQtRbL2JWRWaRKfxVWtTA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@valkey/valkey-glide/-/valkey-glide-2.1.0.tgz", + "integrity": "sha512-iBvkF9KpKrIbuqa91DI47v5yCgqdQ7yxuHMbZmetmXWcUP/skhIsX6luhz333YSbVmKT5mfGAjbo24+9smVwrA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -122,12 +122,12 @@ "node": ">=16" }, "optionalDependencies": { - "@valkey/valkey-glide-darwin-arm64": "2.0.1", - "@valkey/valkey-glide-darwin-x64": "2.0.1", - "@valkey/valkey-glide-linux-arm64-gnu": "2.0.1", - "@valkey/valkey-glide-linux-arm64-musl": "2.0.1", - "@valkey/valkey-glide-linux-x64-gnu": "2.0.1", - "@valkey/valkey-glide-linux-x64-musl": "2.0.1" + "@valkey/valkey-glide-darwin-arm64": "2.1.0", + "@valkey/valkey-glide-darwin-x64": "2.1.0", + "@valkey/valkey-glide-linux-arm64-gnu": "2.1.0", + "@valkey/valkey-glide-linux-arm64-musl": "2.1.0", + "@valkey/valkey-glide-linux-x64-gnu": "2.1.0", + "@valkey/valkey-glide-linux-x64-musl": "2.1.0" } }, "layers": { @@ -5166,9 +5166,9 @@ } }, "node_modules/@valkey/valkey-glide-darwin-arm64": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-darwin-arm64/-/valkey-glide-darwin-arm64-2.0.1.tgz", - "integrity": "sha512-IN6hh+2ZKEeYDmiVtNjNRWk3fwFV7nW2CXQBZfxbOakTITRcd7huYSYWTkUAFhu+1nVTQez7VnLArU+BSKFokw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-darwin-arm64/-/valkey-glide-darwin-arm64-2.1.0.tgz", + "integrity": "sha512-2tey4RLhnZcna0ny0KfON8jhPb+i8D6cSN84AQEzX/YnXjn+c4mia0g625xnf0qYc8Qhb/v4QwehDIziOuy+dA==", "cpu": [ "arm64" ], @@ -5180,9 +5180,9 @@ ] }, "node_modules/@valkey/valkey-glide-darwin-x64": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-darwin-x64/-/valkey-glide-darwin-x64-2.0.1.tgz", - "integrity": "sha512-9dBsnhD3ZZ9dFJwrPYmRWv01mzGygkMpGyvIHSPRPmcDc5G0hZkO/rbP6mYwM5GgA/MT9kLOmUiN1MR5jch5fA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-darwin-x64/-/valkey-glide-darwin-x64-2.1.0.tgz", + "integrity": "sha512-DmSJNZKYeAE9O/ety1Gs2hx12Ay5YJrJ2Ryr77ZytuNSYP3G9XRTMTEHfqStoid3B0xRA30rYtaksIDDeJMkow==", "cpu": [ "x64" ], @@ -5220,9 +5220,9 @@ } }, "node_modules/@valkey/valkey-glide-linux-arm64-gnu": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-linux-arm64-gnu/-/valkey-glide-linux-arm64-gnu-2.0.1.tgz", - "integrity": "sha512-/WstihgF2d2frBmcWOP9v5DlRfco5uzhXAdba+mB5x25kd575Yy/3k+ygKqA2e/rfF0KQz1e1SQ679CqpK6lVQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-linux-arm64-gnu/-/valkey-glide-linux-arm64-gnu-2.1.0.tgz", + "integrity": "sha512-3nl43vPgZiswxtKglCSV9RXF03EU0Pe2d5+pU1hLh9w8MzvjgYWXwdLNzwSdVqm5DXHm06u4UhpXIVYrH8MW5A==", "cpu": [ "arm64" ], @@ -5234,9 +5234,9 @@ ] }, "node_modules/@valkey/valkey-glide-linux-arm64-musl": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-linux-arm64-musl/-/valkey-glide-linux-arm64-musl-2.0.1.tgz", - "integrity": "sha512-pccPAMH4Q7ev0zd/BJBBYQTXOa3MSPYxLzjXAefOJ3OdtyMqYpA7MZ2LgpolJ5TqLAXknkRvSIqNpr28EWBa+g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-linux-arm64-musl/-/valkey-glide-linux-arm64-musl-2.1.0.tgz", + "integrity": "sha512-v7T3XLl8U+U6z+0Ys1vLmvOXWZ/ykHYQ98XgyxT9Th7WGx8K4gA+veh+7GyTDMtQ7d5kwUV+AKLRTywh7xPxEQ==", "cpu": [ "arm64" ], @@ -5356,9 +5356,9 @@ } }, "node_modules/@valkey/valkey-glide-linux-x64-gnu": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-linux-x64-gnu/-/valkey-glide-linux-x64-gnu-2.0.1.tgz", - "integrity": "sha512-wEaxa2oGFxYcNzWl9xEHbTQ/Rng4Q2T93UensUyxY5I6qzBi5ZWrFVIxneyu0uM/bG98SduWBcCyMa9wOcrAQg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-linux-x64-gnu/-/valkey-glide-linux-x64-gnu-2.1.0.tgz", + "integrity": "sha512-rTjyQeu6EdIxHq/gurUWJAFfAimxqpxVnYJ+E8d4yfdswZQyFvDkAUNSusgq3b3v5FZAVff4ij7UX1eXosL45Q==", "cpu": [ "x64" ], @@ -5370,9 +5370,9 @@ ] }, "node_modules/@valkey/valkey-glide-linux-x64-musl": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-linux-x64-musl/-/valkey-glide-linux-x64-musl-2.0.1.tgz", - "integrity": "sha512-S9WUSDZ8mCH3ZIRvpiJhkknjUOalmH13PqetzMigvUhVoLT3+WBHK3kUvQU78Q1fE1ogoPDdx1Pwp4PAg2bcaQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-linux-x64-musl/-/valkey-glide-linux-x64-musl-2.1.0.tgz", + "integrity": "sha512-5NNTR6kSQd2MvVYILj8pR/1yfyRQixhE+ir9mpzSRbsaGvLGZCMASmlMhrJpC0kwR3yTSy5J+x5PTJTmnKULpg==", "cpu": [ "x64" ], @@ -7144,9 +7144,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.0.tgz", + "integrity": "sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==", "license": "Apache-2.0", "optional": true, "peer": true, From 85ae53c94ba0d4975f37b29e1391035861c06ecc Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Mon, 22 Sep 2025 11:33:13 +0200 Subject: [PATCH 168/255] docs(event-handler): general improvements (#4517) Co-authored-by: Stefano Vozza --- docs/features/event-handler/rest.md | 444 +++++++++++------- .../rest/advanced_binary_responses.ts | 21 + .../event-handler/rest/advanced_compress.ts | 17 + .../rest/advanced_cors_per_route.ts | 26 + .../rest/advanced_cors_simple.ts | 22 + .../rest/advanced_fine_grained_responses.ts | 7 +- .../rest/advanced_mw_compose_middleware.ts | 57 --- .../advanced_mw_compose_middleware_index.ts | 24 + .../advanced_mw_compose_middleware_shared.ts | 23 + .../rest/advanced_mw_custom_middleware.ts | 77 +-- .../rest/advanced_mw_destructuring_problem.ts | 9 +- .../rest/advanced_mw_early_return.ts | 9 +- .../rest/advanced_mw_middleware_order.ts | 6 +- .../rest/advanced_testing_helper.ts | 26 + .../rest/advanced_testing_main.ts | 39 ++ .../diagrams/middleware_early_return.mermaid | 20 + .../middleware_error_handling.mermaid | 19 + .../middleware_execution_order.mermaid | 20 + .../diagrams/middleware_handled_error.mermaid | 21 + .../middleware_throwing_error.mermaid | 19 + .../rest/gettingStarted_error_handling.ts | 30 ++ .../rest/gettingStarted_handle_not_found.ts | 24 + .../gettingStarted_throwing_http_errors.ts | 23 + .../rest/samples/advanced_binary_req.json | 9 + .../rest/samples/advanced_binary_res.json | 13 + .../rest/samples/advanced_compress_req.json | 8 + .../rest/samples/advanced_compress_res.json | 13 + .../rest/samples/advanced_cors_per_route.json | 9 + .../rest/samples/advanced_cors_simple.json | 27 ++ .../rest/samples/advanced_error_debug.json | 9 + .../rest/samples/advanced_error_prod.json | 5 + 31 files changed, 794 insertions(+), 282 deletions(-) create mode 100644 examples/snippets/event-handler/rest/advanced_binary_responses.ts create mode 100644 examples/snippets/event-handler/rest/advanced_compress.ts create mode 100644 examples/snippets/event-handler/rest/advanced_cors_per_route.ts create mode 100644 examples/snippets/event-handler/rest/advanced_cors_simple.ts delete mode 100644 examples/snippets/event-handler/rest/advanced_mw_compose_middleware.ts create mode 100644 examples/snippets/event-handler/rest/advanced_mw_compose_middleware_index.ts create mode 100644 examples/snippets/event-handler/rest/advanced_mw_compose_middleware_shared.ts create mode 100644 examples/snippets/event-handler/rest/advanced_testing_helper.ts create mode 100644 examples/snippets/event-handler/rest/advanced_testing_main.ts create mode 100644 examples/snippets/event-handler/rest/diagrams/middleware_early_return.mermaid create mode 100644 examples/snippets/event-handler/rest/diagrams/middleware_error_handling.mermaid create mode 100644 examples/snippets/event-handler/rest/diagrams/middleware_execution_order.mermaid create mode 100644 examples/snippets/event-handler/rest/diagrams/middleware_handled_error.mermaid create mode 100644 examples/snippets/event-handler/rest/diagrams/middleware_throwing_error.mermaid create mode 100644 examples/snippets/event-handler/rest/gettingStarted_error_handling.ts create mode 100644 examples/snippets/event-handler/rest/gettingStarted_handle_not_found.ts create mode 100644 examples/snippets/event-handler/rest/gettingStarted_throwing_http_errors.ts create mode 100644 examples/snippets/event-handler/rest/samples/advanced_binary_req.json create mode 100644 examples/snippets/event-handler/rest/samples/advanced_binary_res.json create mode 100644 examples/snippets/event-handler/rest/samples/advanced_compress_req.json create mode 100644 examples/snippets/event-handler/rest/samples/advanced_compress_res.json create mode 100644 examples/snippets/event-handler/rest/samples/advanced_cors_per_route.json create mode 100644 examples/snippets/event-handler/rest/samples/advanced_cors_simple.json create mode 100644 examples/snippets/event-handler/rest/samples/advanced_error_debug.json create mode 100644 examples/snippets/event-handler/rest/samples/advanced_error_prod.json diff --git a/docs/features/event-handler/rest.md b/docs/features/event-handler/rest.md index 8de6d6d108..18ec89cad4 100644 --- a/docs/features/event-handler/rest.md +++ b/docs/features/event-handler/rest.md @@ -1,25 +1,25 @@ --- -title: REST API -description: Event handler for building REST APIs in AWS Lambda +title: HTTP API +description: Event handler for building HTTP APIs in AWS Lambda status: new --- !!! warning "Feature status" This feature is under active development and may undergo significant changes. We recommend using it in non-critical workloads and [providing feedback](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose){target="_blank"} to help us improve it. -Event handler for Amazon API Gateway REST and HTTP APIs, Application Loader Balancer (ALB), Lambda Function URLs, and VPC Lattice. +Event handler for Amazon API Gateway REST . ## Key Features -* Lightweight routing to reduce boilerplate for API Gateway REST/HTTP API, ALB and Lambda Function URLs. -* Built-in middleware engine for request/response transformation and validation. -* Works with micro function (one or a few routes) and monolithic functions (all routes) +* Lightweight routing to reduce boilerplate for API Gateway REST (HTTP API, ALB and Lambda Function URLs coming soon) +* Built-in middleware engine for request/response transformation (validation coming soon). +* Works with micro function (one or a few routes) and monolithic functions (see [Considerations](#considerations)). ## Getting started ### Install -!!! info "This is not necessary if you're installing Powertools for AWS Lambda (TypeScript) via [Lambda layer](../../getting-started/lambda-layers.md)." + ```shell npm install @aws-lambda-powertools/event-handler @@ -27,11 +27,11 @@ npm install @aws-lambda-powertools/event-handler ### Required resources -If you're using any API Gateway integration, you must have an existing [API Gateway Proxy integration](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html){target="_blank"} or [ALB](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html){target="_blank"} configured to invoke your Lambda function. +If you're using any API Gateway integration, you must have an existing [API Gateway Proxy integration](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html){target="_blank"} configured to invoke your Lambda function. -In case of using [VPC Lattice](https://docs.aws.amazon.com/lambda/latest/dg/services-vpc-lattice.html){target="_blank"}, you must have a service network configured to invoke your Lambda function. + -This is the sample infrastructure for API Gateway and Lambda Function URLs we are using for the examples in this documentation. There is no additional permissions or dependencies required to use this utility. +This is the sample infrastructure for API Gateway we are using for the examples in this documentation. There is no additional permissions or dependencies required to use this utility. ??? "See Infrastructure as Code (IaC) examples" === "API Gateway SAM Template" @@ -48,11 +48,11 @@ When a request is received, the event handler will automatically convert the eve #### Response auto-serialization -!!! tip "Want full control over the response, headers, and status code? Read about it in the [Fine grained responses](#fine-grained-responses) section." +!!! tip "Want full control over the response, headers, and status code? Read how to [return `Response` objects](#returning-response-objects) directly." For your convenience, when you return a JavaScript object from your route handler, we automatically perform these actions: -* Auto-serialize the response to JSON and trim whitespace +* Auto-serialize the response to JSON * Include the response under the appropriate equivalent of a `body` * Set the `Content-Type` header to `application/json` * Set the HTTP status code to 200 (OK) @@ -63,7 +63,7 @@ For your convenience, when you return a JavaScript object from your route handle --8<-- "examples/snippets/event-handler/rest/gettingStarted_serialization.ts" ``` - 1. This object will be serialized, trimmed, and included under the `body` key + 1. This object will be serialized and included under the `body` key === "JSON response" @@ -93,7 +93,7 @@ You can also nest dynamic paths, for example `/todos/:todoId/comments/:commentId ### HTTP Methods -You can use dedicated methods to specify the HTTP method that should be handled in each resolver. That is, `app.`, where the HTTP method could be `delete`, `get`, `head`, `patch`, `post`, `put`, `options`. +You can use dedicated methods to specify the HTTP method that should be handled in each resolver. That is, `app.()`, where the HTTP method could be `delete`, `get`, `head`, `patch`, `post`, `put`, `options`. === "index.ts" @@ -107,7 +107,7 @@ You can use dedicated methods to specify the HTTP method that should be handled --8<-- "examples/snippets/event-handler/rest/samples/gettingStarted_methods.json" ``` -If you need to accept multiple HTTP methods in a single function, or support an HTTP method for which no dedicated method exists (i.e. [`TRACE`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods/TRACE){target="_blank"}), you can use the `route` method and pass a list of HTTP methods. +If you need to accept multiple HTTP methods in a single function, or support an HTTP method for which no dedicated method exists (i.e. [`TRACE`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods/TRACE){target="_blank"}), you can use the `route()` method and pass a list of HTTP methods. === "index.ts" @@ -116,50 +116,96 @@ If you need to accept multiple HTTP methods in a single function, or support an ``` !!! tip - We generally recommend to have separate functions for each HTTP method, as the functionality tends to differ depending on which method is used. + We recommend defining separate route handlers for each HTTP method within your Lambda function, as the functionality typically differs between operations such as `GET`, `POST`, `PUT`, `DELETE` etc ### Data validation !!! note "Coming soon" - Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose) if you would like us to prioritize this feature. + +We plan to add built-in support for request and response validation using [Standard Schema](https://standardschema.dev){target="_blank"} in a future release. For the time being, you can use any validation library of your choice in your route handlers or middleware. + +Please [check this issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4516) for more details and examples, and add 👍 if you would like us to prioritize it. ### Accessing request details -You can access request details such as headers, query parameters, and body using the `Request` object provided to your route handlers. +You can access request details such as headers, query parameters, and body using the `Request` object provided to your route handlers and middleware functions via `reqCtx.request`. ### Handling not found routes -!!! note "Coming soon" - Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose){target="_blank"} if you would like us to prioritize this feature. +By default, we return a `404 Not Found` response for any unmatched routes. + +You can use the `notFound()` method as a higher-order function or class method decorator to override this behavior, and return a custom response. + +=== "index.ts" + + ```ts hl_lines="11" + --8<-- "examples/snippets/event-handler/rest/gettingStarted_handle_not_found.ts" + ``` ### Error handling -!!! note "Coming soon" - Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose){target="_blank"} if you would like us to prioritize this feature. +You can use the `errorHandler()` method as a higher-order function or class method decorator to define a custom error handler for errors thrown in your route handlers or middleware. + +This allows you to catch and return custom error responses, or perform any other error handling logic you need. + +!!! tip "You can also pass a list of error classes to the `errorHandler()` method." + +=== "index.ts" + + ```ts hl_lines="11" + --8<-- "examples/snippets/event-handler/rest/gettingStarted_error_handling.ts:4" + ``` ### Throwing HTTP errors -!!! note "Coming soon" - Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose){target="_blank"} if you would like us to prioritize this feature. +You can throw HTTP errors in your route handlers to return specific HTTP status codes and messages. Event Handler provides a set of built-in HTTP error classes that you can use to throw common HTTP errors. -### Enabling SwaggerUI +This ensures that your Lambda function doesn't fail but returns a well-defined HTTP error response to the client. -!!! note "Coming soon" - Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose){target="_blank"} if you would like us to prioritize this feature. +If you need to send custom headers or a different response structure/code, you can use the [Response](#returning-response-objects) object instead. -### Custom domains +=== "index.ts" -!!! note "Coming soon" - Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose){target="_blank"} if you would like us to prioritize this feature. + ```ts hl_lines="3 10" + --8<-- "examples/snippets/event-handler/rest/gettingStarted_throwing_http_errors.ts:3" + ``` -## Advanced +#### Available HTTP error classes -### CORS +The following HTTP error classes are available for use in your route handlers: + +| Error Class | HTTP Status Code | Description | +|------------------------------|------------------|----------------------------------------------------------------------------------------| +| `BadRequestError` | 400 | Bad Request - The request cannot be fulfilled due to bad syntax | +| `UnauthorizedError` | 401 | Unauthorized - Authentication is required and has failed or not been provided | +| `ForbiddenError` | 403 | Forbidden - The request is valid but the server is refusing action | +| `NotFoundError` | 404 | Not Found - The requested resource could not be found | +| `MethodNotAllowedError` | 405 | Method Not Allowed - The request method is not supported for the requested resource | +| `RequestTimeoutError` | 408 | Request Timeout - The server timed out waiting for the request | +| `RequestEntityTooLargeError` | 413 | Request Entity Too Large - The request is larger than the server is willing to process | +| `InternalServerError` | 500 | Internal Server Error - A generic error message for unexpected server conditions | +| `ServiceUnavailableError` | 503 | Service Unavailable - The server is currently unavailable | + +All error classes accept optional parameters for custom messages and additional details: + +* `message` - Custom error message +* `options` - Standard JavaScript `ErrorOptions` +* `details` - Additional structured data to include in the error response -You can configure CORS at the router level via the `cors` middleware. +### Route prefixes !!! note "Coming soon" +When defining multiple routes related to a specific resource, it's common to have a shared prefix. For example, you might have several routes that all start with `/todos`. + +For example, if you have a custom domain `api.example.com` and you want to map it to the `/v1` base path of your API. In this case, all the requests will contain `/v1/` in the path, requiring you to repeat the `/v1` prefix in all your route definitions. + +At the moment, you have to manually include the prefix in each route definition, however we are planning to add support for route prefixes in a future release. + +Please [check this issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4513) for more details and examples, and add 👍 if you would like us to prioritize it. + +## Advanced + ### Middleware Middleware are functions that execute during the request-response cycle, sitting between the @@ -169,9 +215,9 @@ cluttering your route handlers. Each middleware function receives the following arguments: -* **params** Route parameters extracted from the URL path -* **reqCtx** Request context containing the event, Lambda context, request, and response objects -* **next** A function to pass control to the next middleware in the chain +* **params** - Route parameters extracted from the URL path +* **reqCtx** - Request context containing the event, Lambda context, request, and response objects +* **next** - A function to pass control to the next middleware in the chain Middleware can be applied on specific routes, globally on all routes, or a combination of both. @@ -181,32 +227,13 @@ for post-processing. When middleware modify the same response properties, the mi executes last in post-processing wins. ```mermaid -sequenceDiagram - participant Request - participant Router - participant GM as Global Middleware - participant RM as Route Middleware - participant Handler as Route Handler - - Request->>Router: Incoming Request - Router->>GM: Execute (params, reqCtx, next) - Note over GM: Pre-processing - GM->>RM: Call next() - Note over RM: Pre-processing - RM->>Handler: Call next() - Note over Handler: Execute handler - Handler-->>RM: Return - Note over RM: Post-processing - RM-->>GM: Return - Note over GM: Post-processing - GM-->>Router: Return - Router-->>Request: Response +--8<-- "examples/snippets/event-handler/rest/diagrams/middleware_execution_order.mermaid" ``` #### Registering middleware -You can use `app.use` to register middleware that should always run regardless of the route +You can use `app.use()` to register middleware that should always run regardless of the route and you can apply middleware to specific routes by passing them as arguments before the route handler. @@ -216,7 +243,7 @@ handler. --8<-- "examples/snippets/event-handler/rest/advanced_mw_middleware_order.ts:3" ``` -=== "JSON Response" +=== "Response" ```json hl_lines="6-7" --8<-- "examples/snippets/event-handler/rest/samples/advanced_mw_middleware_order.json" @@ -226,31 +253,13 @@ handler. There are cases where you may want to terminate the execution of the middleware chain early. To do so, middleware can short-circuit processing by returning a `Response` or JSON object -instead of calling `next()`. Neither the handler nor any subsequent middleware will run +instead of calling `await next()`. + +Neither the handler nor any subsequent middleware will run but the post-processing of already executed middleware will. ```mermaid -sequenceDiagram - participant Request - participant Router - participant M1 as Middleware 1 - participant M2 as Middleware 2 - participant M3 as Middleware 3 - participant Handler as Route Handler - - Request->>Router: Incoming Request - Router->>M1: Execute (params, reqCtx, next) - Note over M1: Pre-processing - M1->>M2: Call next() - Note over M2: Pre-processing - M2->>M2: Return Response (early return) - Note over M2: Post-processing - M2-->>M1: Return Response - Note over M1: Post-processing - M1-->>Router: Return Response - Router-->>Request: Response - Note over M3,Handler: Never executed - +--8<-- "examples/snippets/event-handler/rest/diagrams/middleware_early_return.mermaid" ``` === "index.ts" @@ -259,7 +268,7 @@ sequenceDiagram --8<-- "examples/snippets/event-handler/rest/advanced_mw_early_return.ts:3" ``` -=== "JSON Response" +=== "Response" ```json hl_lines="2" --8<-- "examples/snippets/event-handler/rest/samples/advanced_mw_early_return.json" @@ -272,26 +281,7 @@ By default, any unhandled error in the middleware chain will be propagated as a chain entirely and no post-processing steps for any previously executed middleware will occur. ```mermaid -sequenceDiagram - participant Request - participant Router - participant EH as Error Handler - participant M1 as Middleware 1 - participant M2 as Middleware 2 - participant Handler as Route Handler - - Request->>Router: Incoming Request - Router->>M1: Execute (params, reqCtx, next) - Note over M1: Pre-processing - M1->>M2: Call next() - Note over M2: Throws Error - M2-->>M1: Error propagated - M1-->>Router: Error propagated - Router->>EH: Handle error - EH-->>Router: HTTP 500 Response - Router-->>Request: HTTP 500 Error - Note over Handler: Never executed - +--8<-- "examples/snippets/event-handler/rest/diagrams/middleware_error_handling.mermaid" ```
*Unhandled errors*
@@ -300,28 +290,7 @@ You can handle errors in middleware as you would anywhere else, simply surround a `try`/`catch` block and processing will occur as usual. ```mermaid -sequenceDiagram - participant Request - participant Router - participant M1 as Middleware 1 - participant M2 as Middleware 2 - participant Handler as Route Handler - - Request->>Router: Incoming Request - Router->>M1: Execute (params, reqCtx, next) - Note over M1: Pre-processing - M1->>M2: Call next() - Note over M2: Error thrown & caught - Note over M2: Handle error gracefully - M2->>Handler: Call next() - Note over Handler: Execute handler - Handler-->>M2: Return - Note over M2: Post-processing - M2-->>M1: Return - Note over M1: Post-processing - M1-->>Router: Return - Router-->>Request: Response - +--8<-- "examples/snippets/event-handler/rest/diagrams/middleware_handled_error.mermaid" ```
*Handled errors*
@@ -332,25 +301,7 @@ you can use or you can throw a custom error of your own. As noted above, this me that no post-processing of your request will occur. ```mermaid -sequenceDiagram - participant Request - participant Router - participant EH as Error Handler - participant M1 as Middleware 1 - participant M2 as Middleware 2 - participant Handler as Route Handler - - Request->>Router: Incoming Request - Router->>M1: Execute (params, reqCtx, next) - Note over M1: Pre-processing - M1->>M2: Call next() - Note over M2: Intentionally throws error - M2-->>M1: Error propagated - M1-->>Router: Error propagated - Router->>EH: Handle error - EH-->>Router: HTTP Error Response - Router-->>Request: HTTP Error Response - Note over Handler: Never executed +--8<-- "examples/snippets/event-handler/rest/diagrams/middleware_throwing_error.mermaid" ``` @@ -363,8 +314,8 @@ accepts configuration options and returns a middleware function. === "index.ts" - ```ts hl_lines="5-26 31" - --8<-- "examples/snippets/event-handler/rest/advanced_mw_custom_middleware.ts:3" + ```ts hl_lines="20-21 36 41" + --8<-- "examples/snippets/event-handler/rest/advanced_mw_custom_middleware.ts:8" ``` In this example we have a middleware that acts only in the post-processing stage as all @@ -373,7 +324,7 @@ the handler has run and we have access to request body. #### Avoiding destructuring pitfalls -!!! warning "Critical: Never destructure the response object" +!!! warning "Never destructure the response object" When writing middleware, always access the response through `reqCtx.res` rather than destructuring `{ res }` from the request context. Destructuring captures a reference to the original response object, which becomes stale when middleware replaces the response. === "index.ts" @@ -392,10 +343,16 @@ You can create reusable middleware stacks by using the `composeMiddleware` funct multiple middleware into a single middleware function. This is useful for creating standardized middleware combinations that can be shared across different routes or applications. +=== "middleware.ts" + + ```ts hl_lines="1 21" + --8<-- "examples/snippets/event-handler/rest/advanced_mw_compose_middleware_shared.ts" + ``` + === "index.ts" - ```ts hl_lines="33-34 39" - --8<-- "examples/snippets/event-handler/rest/advanced_mw_compose_middleware.ts:3" + ```ts hl_lines="3 7" + --8<-- "examples/snippets/event-handler/rest/advanced_mw_compose_middleware_index.ts:3" ``` The `composeMiddleware` function maintains the same execution order as if you had applied the @@ -417,74 +374,192 @@ Keep the following in mind when authoring middleware for Event Handler: * **Catch your own errors.** Catch and handle known errors to your logic, unless you want to raise HTTP Errors, or propagate specific errors to the client. * **Avoid destructuring the response object.** As mentioned in the [destructuring pitfalls](#avoiding-destructuring-pitfalls) section, always access the response through `reqCtx.res` rather than destructuring to avoid stale references. -### Fine grained responses +### Returning `Response` objects You can use the Web API's `Response` object to have full control over the response. For example, you might want to add additional headers, cookies, or set a custom content type. === "index.ts" - ```ts hl_lines="11-19 25-32" + ```ts hl_lines="11-18 25-31" --8<-- "examples/snippets/event-handler/rest/advanced_fine_grained_responses.ts:6" ``` -=== "JSON Response" +=== "Response" ```json hl_lines="4-6" --8<-- "examples/snippets/event-handler/rest/samples/advanced_fine_grained_responses.json" ``` -### Response streaming +### CORS -!!! note "Coming soon" - Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose) if you would like us to prioritize this feature. +You can configure CORS (Cross-Origin Resource Sharing) by using the `cors` middleware. + +This will ensure that CORS headers are returned as part of the response when your functions match the path invoked and the Origin matches one of the allowed values. + +=== "index.ts" + + ```ts hl_lines="2 8-11" + --8<-- "examples/snippets/event-handler/rest/advanced_cors_simple.ts:3" + ``` + +=== "Response" + + ```json + --8<-- "examples/snippets/event-handler/rest/samples/advanced_cors_simple.json" + ``` + +#### Pre-flight + +Pre-flight (`OPTIONS`) requests are typically handled at the API Gateway or Lambda Function URL as per our [sample infrastructure](#required-resources), no Lambda integration is necessary. However, ALB expects you to handle pre-flight requests in your function. + +For convenience, when you register the `cors` middleware, we automatically handle these requests for you as long as the path matches and the `Origin` header is present and valid. + +#### Defaults + +For convenience, these are the default CORS settings applied when you register the `cors` middleware without any options: + +!!! warning "Security consideration" + Always set the `origin` option to a specific domain or list of domains in production environments to avoid security risks associated with allowing all origins. + +| Key | Default Value | Description | +|------------------|------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `origin` | `*` | Specifies the allowed origin(s) that can access the resource. Use `*` to allow all origins. | +| `methods` | `GET,HEAD,PUT,PATCH,POST,DELETE` | Specifies the allowed HTTP methods. | +| `allowHeaders` | `[Authorization, Content-Type, X-Amz-Date, X-Api-Key, X-Amz-Security-Token]` | Specifies the allowed headers that can be used in the actual request. | +| `exposeHeaders` | `[]` | Any additional header beyond the [safe listed by CORS specification](https://developer.mozilla.org/en-US/docs/Glossary/CORS-safelisted_response_header){target="_blank"}. | +| `credentials` | `false` | Only necessary when you need to expose cookies, authorization headers or TLS client certificates. | +| `maxAge` | `0` | Indicates how long the results of a preflight request can be cached. Value is in seconds. | + +#### Per-route overrides + +You can override the global CORS settings on a per-route basis by passing options to the `cors` middleware when applying it to a specific route. + +=== "index.ts" + + ```ts hl_lines="2 19" + --8<-- "examples/snippets/event-handler/rest/advanced_cors_per_route.ts:3" + ``` + +=== "Response" + + ```json + --8<-- "examples/snippets/event-handler/rest/samples/advanced_cors_per_route.json" + ``` ### Compress -You can compress with gzip and base64 encode your responses via the `compress` parameter. You have the option to pass the `compress` parameter when working with a specific route or setting the correct `Accept-Encoding` header in the `Response` object. +You can enable response compression by using the `compress` middleware. This will automatically compress responses using gzip and base64 encode them when the client indicates support via the `Accept-Encoding` header. -!!! note "Coming soon" - Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose) if you would like us to prioritize this feature. +=== "index.ts" + + ```ts hl_lines="2 7" + --8<-- "examples/snippets/event-handler/rest/advanced_compress.ts:3" + ``` + +=== "Request" + + ```json hl_lines="3" + --8<-- "examples/snippets/event-handler/rest/samples/advanced_compress_req.json" + ``` + +=== "Response" + + ```json hl_lines="7-9 11 12" + --8<-- "examples/snippets/event-handler/rest/samples/advanced_compress_res.json" + ``` ### Binary responses -!!! warning "Using API Gateway?" - Amazon API Gateway does not support `*/*` binary media type when [CORS](#cors) is also configured. This feature requires API Gateway to configure binary media types, see our [sample infrastructure](#required-resources) for reference. +!!! note "Coming soon" + +As described in the [response auto serialization](#response-auto-serialization) section, when you return a JavaScript object from your route handler, we automatically serialize it to JSON and set the `Content-Type` header to `application/json`. -For convenience, we automatically base64 encode binary responses. You can also use it in combination with the `compress` parameter if your client supports gzip. +If you need to return binary data (e.g. images, PDFs, etc), you will need to return an API Gateway Proxy result directly, setting the `isBase64Encoded` flag to `true` and base64 encoding the binary data, as well as setting the appropriate `Content-Type` header. -Like the `compress` feature, the client must send the `Accept` header with the correct media type. +=== "index.ts" -!!! tip - Lambda Function URLs handle binary media types automatically. + ```ts hl_lines="10-17" + --8<-- "examples/snippets/event-handler/rest/advanced_binary_responses.ts" + ``` + +=== "Request" + + ```json + --8<-- "examples/snippets/event-handler/rest/samples/advanced_binary_req.json" + ``` + +=== "Response" + + ```json + --8<-- "examples/snippets/event-handler/rest/samples/advanced_binary_res.json" + ``` + +You can use binary responses together with the [`compress`](#compress) feature, and the client must send the `Accept` header with the correct media type. + +We plan to add first-class support for binary responses in a future release. Please [check this issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4514) for more details and examples, and add 👍 if you would like us to prioritize it. + +### Response streaming !!! note "Coming soon" - Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose) if you would like us to prioritize this feature. + +At the moment, Event Handler does not support streaming responses. This means that the entire response must be generated and returned by the route handler before it can be sent to the client. + +Please [check this issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4476) for more details and add 👍 if you would like us to prioritize it. ### Debug mode You can enable debug mode via the `POWERTOOLS_DEV` environment variable. -This will enable full stack traces errors in the response, log request and responses, and set CORS in development mode. +When set to `true`, debug mode enhances error responses with detailed information to aid in debugging and testing. + +!!! danger "Security consideration" + Never enable debug mode in production environments as it exposes sensitive error details that could be exploited by attackers. + + Only use it during development and testing. + +#### Enhanced error responses + +When an unhandled error occurs in your route handler or middleware, Event Handler will return a HTTP 500 response by default. + +=== "Production mode (default)" + + ```json + --8<-- "examples/snippets/event-handler/rest/samples/advanced_error_prod.json" + ``` + +=== "Debug mode" + + ```json + --8<-- "examples/snippets/event-handler/rest/samples/advanced_error_debug.json" + ``` + +#### Logging requests and responses !!! note "Coming soon" - Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose) if you would like us to prioritize this feature. + Please [check this issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4482) and add 👍 if you would like us to prioritize this feature. ### OpenAPI -When you enable [Data Validation](#data-validation), we use a combination of Zod and JSON Schemas to add constraints to your API's parameters. +!!! note "Coming soon" + +Currently, Event Handler does not support automatic generation of OpenAPI documentation from your route definitions. -In OpenAPI documentation tools like [SwaggerUI](#enabling-swaggerui), these annotations become readable descriptions, offering a self-explanatory API interface. This reduces boilerplate code while improving functionality and enabling auto-documentation. +We plan to add this feature in a future release with an experience similar to what described in the [utility's RFC](https://github.com/aws-powertools/powertools-lambda-typescript/discussions/3500){target="_blank"} and to what available in [Powertools for AWS Lambda (Python)](https://docs.powertools.aws.dev/lambda/python/latest/core/event_handler/api_gateway/#openapi){target="_blank"}. -!!! note "Coming soon" - Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose) if you would like us to prioritize this feature. +Please [check this issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4515) for more details, and add 👍 if you would like us to prioritize it. ### Split routers -As you grow the number of routes a given Lambda function should handle, it is natural to either break into smaller Lambda functions, or split routes into separate files to ease maintenance - that's where the split `Router` feature is useful. - !!! note "Coming soon" - Please [open an issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose) if you would like us to prioritize this feature. + +As applications grow and the number of routes a Lambda function handles increases, it becomes natural to either break it into smaller Lambda functions or split routes into separate files to ease maintenance. + +Currently, the TypeScript event-handler's Router class doesn't provide a way to compose multiple router instances, forcing developers to define all routes in a single file or manually merge route definitions. + +Once this feature is available, you will be able to define routes in separate files and import them into a main router file, improving code organization and maintainability. + +Please [check this issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4481) for more details and examples, and add 👍 if you would like us to prioritize it. ### Considerations @@ -537,5 +612,26 @@ Automated testing, operational and security reviews are essential to stability i ## Testing your code -!!! note "Coming soon" - Please open an issue if you would like us to prioritize this section. +You can use any testing framework of your choice to test Lambda functions using Event Handler. + +Since Event Handler doesn't require any server or socket to run, you can test your code as you would any other JavaScript/TypeScript function. + +Below is an example using [Vitest](https://vitest.dev){target="_blank"}, including a helper function to create mock API Gateway events that you can copy and adapt to your needs. + +=== "index.test.ts" + + ```ts + --8<-- "examples/snippets/event-handler/rest/advanced_testing_main.ts" + ``` + +=== "event_helper.ts" + + ```ts + --8<-- "examples/snippets/event-handler/rest/advanced_testing_helper.ts" + ``` + +=== "index.ts" + + ```ts + --8<-- "examples/snippets/event-handler/rest/advanced_cors_simple.ts:3" + ``` diff --git a/examples/snippets/event-handler/rest/advanced_binary_responses.ts b/examples/snippets/event-handler/rest/advanced_binary_responses.ts new file mode 100644 index 0000000000..a691c3900e --- /dev/null +++ b/examples/snippets/event-handler/rest/advanced_binary_responses.ts @@ -0,0 +1,21 @@ +import { readFile } from 'node:fs/promises'; +import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; +import { compress } from '@aws-lambda-powertools/event-handler/experimental-rest/middleware'; +import type { Context } from 'aws-lambda'; + +const app = new Router(); + +app.get('/logo', [compress()], async () => { + const logoFile = await readFile(`${process.env.LAMBDA_TASK_ROOT}/logo.png`); + return { + body: logoFile.toString('base64'), + isBase64Encoded: true, + headers: { + 'Content-Type': 'image/png', + }, + statusCode: 200, + }; +}); + +export const handler = async (event: unknown, context: Context) => + app.resolve(event, context); diff --git a/examples/snippets/event-handler/rest/advanced_compress.ts b/examples/snippets/event-handler/rest/advanced_compress.ts new file mode 100644 index 0000000000..44756a1e14 --- /dev/null +++ b/examples/snippets/event-handler/rest/advanced_compress.ts @@ -0,0 +1,17 @@ +declare function getTodoById(todoId: unknown): Promise<{ id: string } & T>; + +import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; +import { compress } from '@aws-lambda-powertools/event-handler/experimental-rest/middleware'; +import type { Context } from 'aws-lambda'; + +const app = new Router(); + +app.use(compress()); + +app.get('/todos/:todoId', async ({ todoId }) => { + const todo = await getTodoById(todoId); + return { todo }; +}); + +export const handler = async (event: unknown, context: Context) => + app.resolve(event, context); diff --git a/examples/snippets/event-handler/rest/advanced_cors_per_route.ts b/examples/snippets/event-handler/rest/advanced_cors_per_route.ts new file mode 100644 index 0000000000..89a49f942f --- /dev/null +++ b/examples/snippets/event-handler/rest/advanced_cors_per_route.ts @@ -0,0 +1,26 @@ +declare function getTodoById(todoId: unknown): Promise<{ id: string } & T>; + +import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; +import { cors } from '@aws-lambda-powertools/event-handler/experimental-rest/middleware'; +import type { Context } from 'aws-lambda'; + +const app = new Router(); + +app.use( + cors({ + origin: 'https://example.com', + maxAge: 300, + }) +); + +app.get('/todos/:todoId', async ({ todoId }) => { + const todo = await getTodoById(todoId); + return { todo }; +}); + +app.get('/health', [cors({ origin: '*' })], async () => { + return { status: 'ok' }; +}); + +export const handler = async (event: unknown, context: Context) => + app.resolve(event, context); diff --git a/examples/snippets/event-handler/rest/advanced_cors_simple.ts b/examples/snippets/event-handler/rest/advanced_cors_simple.ts new file mode 100644 index 0000000000..b080185ce1 --- /dev/null +++ b/examples/snippets/event-handler/rest/advanced_cors_simple.ts @@ -0,0 +1,22 @@ +declare function getTodoById(todoId: unknown): Promise<{ id: string } & T>; + +import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; +import { cors } from '@aws-lambda-powertools/event-handler/experimental-rest/middleware'; +import type { Context } from 'aws-lambda'; + +const app = new Router(); + +app.use( + cors({ + origin: 'https://example.com', + maxAge: 300, + }) +); + +app.get('/todos/:todoId', async ({ todoId }) => { + const todo = await getTodoById(todoId); + return { todo }; +}); + +export const handler = async (event: unknown, context: Context) => + app.resolve(event, context); diff --git a/examples/snippets/event-handler/rest/advanced_fine_grained_responses.ts b/examples/snippets/event-handler/rest/advanced_fine_grained_responses.ts index 2d989f2bdb..26cd5d204c 100644 --- a/examples/snippets/event-handler/rest/advanced_fine_grained_responses.ts +++ b/examples/snippets/event-handler/rest/advanced_fine_grained_responses.ts @@ -23,7 +23,7 @@ app.get('/todos', async () => { }); }); -app.post('/todos', async (params, reqCtx) => { +app.post('/todos', async (_, reqCtx) => { const body = await reqCtx.request.json(); const todo = await createTodo(body.title); @@ -36,6 +36,5 @@ app.post('/todos', async (params, reqCtx) => { }); }); -export const handler = async (event: unknown, context: Context) => { - return app.resolve(event, context); -}; +export const handler = async (event: unknown, context: Context) => + app.resolve(event, context); diff --git a/examples/snippets/event-handler/rest/advanced_mw_compose_middleware.ts b/examples/snippets/event-handler/rest/advanced_mw_compose_middleware.ts deleted file mode 100644 index 0263371543..0000000000 --- a/examples/snippets/event-handler/rest/advanced_mw_compose_middleware.ts +++ /dev/null @@ -1,57 +0,0 @@ -declare const getAllTodos: () => Promise; -declare const putTodo: (body: any) => Promise; - -import { - composeMiddleware, - Router, -} from '@aws-lambda-powertools/event-handler/experimental-rest'; -import type { Middleware } from '@aws-lambda-powertools/event-handler/types'; -import { Logger } from '@aws-lambda-powertools/logger'; -import type { Context } from 'aws-lambda'; - -const logger = new Logger(); - -// Individual middleware functions -const logging: Middleware = async (params, reqCtx, next) => { - logger.info(`Request: ${reqCtx.request.method} ${reqCtx.request.url}`); - await next(); - logger.info(`Response: ${reqCtx.res.status}`); -}; - -const cors: Middleware = async (params, reqCtx, next) => { - await next(); - reqCtx.res.headers.set('Access-Control-Allow-Origin', '*'); - reqCtx.res.headers.set( - 'Access-Control-Allow-Methods', - 'GET, POST, PUT, DELETE' - ); -}; - -const rateLimit: Middleware = async (params, reqCtx, next) => { - // Rate limiting logic would go here - reqCtx.res.headers.set('X-RateLimit-Limit', '100'); - await next(); -}; - -// Compose middleware stack for all requests -const apiMiddleware = composeMiddleware([logging, cors, rateLimit]); - -const app = new Router(); - -// Use composed middleware globally -app.use(apiMiddleware); - -app.get('/todos', async () => { - const todos = await getAllTodos(); - return { todos }; -}); - -app.post('/todos', async (params, { request }) => { - const body = await request.json(); - const todo = await putTodo(body); - return todo; -}); - -export const handler = async (event: unknown, context: Context) => { - return await app.resolve(event, context); -}; diff --git a/examples/snippets/event-handler/rest/advanced_mw_compose_middleware_index.ts b/examples/snippets/event-handler/rest/advanced_mw_compose_middleware_index.ts new file mode 100644 index 0000000000..e1a26356b3 --- /dev/null +++ b/examples/snippets/event-handler/rest/advanced_mw_compose_middleware_index.ts @@ -0,0 +1,24 @@ +declare const getAllTodos: () => Promise[]>; +declare const putTodo: (body: unknown) => Promise>; + +import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; +import type { Context } from 'aws-lambda'; +import { apiMiddleware } from './advanced_mw_compose_middleware_shared.js'; + +const app = new Router(); + +app.use(apiMiddleware); + +app.get('/todos', async () => { + const todos = await getAllTodos(); + return { todos }; +}); + +app.post('/todos', async (_, { request }) => { + const body = await request.json(); + const todo = await putTodo(body); + return todo; +}); + +export const handler = async (event: unknown, context: Context) => + app.resolve(event, context); diff --git a/examples/snippets/event-handler/rest/advanced_mw_compose_middleware_shared.ts b/examples/snippets/event-handler/rest/advanced_mw_compose_middleware_shared.ts new file mode 100644 index 0000000000..1a475aa13b --- /dev/null +++ b/examples/snippets/event-handler/rest/advanced_mw_compose_middleware_shared.ts @@ -0,0 +1,23 @@ +import { composeMiddleware } from '@aws-lambda-powertools/event-handler/experimental-rest'; +import { cors } from '@aws-lambda-powertools/event-handler/experimental-rest/middleware'; +import type { Middleware } from '@aws-lambda-powertools/event-handler/types'; +import { Logger } from '@aws-lambda-powertools/logger'; + +const logger = new Logger(); + +const logging: Middleware = async (_, reqCtx, next) => { + logger.info(`Request: ${reqCtx.request.method} ${reqCtx.request.url}`); + await next(); + logger.info(`Response: ${reqCtx.res.status}`); +}; + +const rateLimit: Middleware = async (_, reqCtx, next) => { + // Rate limiting logic would go here + reqCtx.res.headers.set('X-RateLimit-Limit', '100'); + await next(); +}; + +// Reusable composed middleware +const apiMiddleware = composeMiddleware([logging, cors(), rateLimit]); + +export { apiMiddleware }; diff --git a/examples/snippets/event-handler/rest/advanced_mw_custom_middleware.ts b/examples/snippets/event-handler/rest/advanced_mw_custom_middleware.ts index cf9238c48a..05f560c325 100644 --- a/examples/snippets/event-handler/rest/advanced_mw_custom_middleware.ts +++ b/examples/snippets/event-handler/rest/advanced_mw_custom_middleware.ts @@ -1,48 +1,57 @@ -declare const compresssBody: (body: string) => Promise; +declare const getUserTodos: ( + userId: string +) => Promise[]>; +declare const jwt: { + verify(token: string, secret: string): { sub: string; roles: string[] }; +}; -import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; +import { getStringFromEnv } from '@aws-lambda-powertools/commons/utils/env'; +import { + Router, + UnauthorizedError, +} from '@aws-lambda-powertools/event-handler/experimental-rest'; import type { Middleware } from '@aws-lambda-powertools/event-handler/types'; +import { Logger } from '@aws-lambda-powertools/logger'; import type { Context } from 'aws-lambda'; -interface CompressOptions { - threshold?: number; - level?: number; -} - -// Factory function that returns middleware -const compress = (options: CompressOptions = {}): Middleware => { - return async (params, reqCtx, next) => { - await next(); +const jwtSecret = getStringFromEnv({ + key: 'JWT_SECRET', + errorMessage: 'JWT_SECRET is not set', +}); - // Check if response should be compressed - const body = await reqCtx.res.text(); - const threshold = options.threshold || 1024; +const logger = new Logger({}); +const app = new Router(); +const store: { userId: string; roles: string[] } = { userId: '', roles: [] }; - if (body.length > threshold) { - const compressedBody = await compresssBody(body); - const compressedRes = new Response(compressedBody, reqCtx.res); - compressedRes.headers.set('Content-Encoding', 'gzip'); - reqCtx.res = compressedRes; +// Factory function that returns middleware +const verifyToken = (options: { jwtSecret: string }): Middleware => { + return async (_, { request }, next) => { + const auth = request.headers.get('Authorization'); + if (!auth || !auth.startsWith('Bearer ')) + return new UnauthorizedError('Missing or invalid Authorization header'); + + const token = auth.slice(7); + try { + const payload = jwt.verify(token, options.jwtSecret); + store.userId = payload.sub; + store.roles = payload.roles; + } catch (error) { + logger.error('Token verification failed', { error }); + return new UnauthorizedError('Invalid token'); } + + await next(); }; }; -const app = new Router(); - // Use custom middleware globally -app.use(compress({ threshold: 500 })); +app.use(verifyToken({ jwtSecret })); -app.get('/data', async () => { - return { - message: 'Large response data', - data: new Array(100).fill('content'), - }; +app.post('/todos', async (_) => { + const { userId } = store; + const todos = await getUserTodos(userId); + return { todos }; }); -app.get('/small', async () => { - return { message: 'Small response' }; -}); - -export const handler = async (event: unknown, context: Context) => { - return await app.resolve(event, context); -}; +export const handler = async (event: unknown, context: Context) => + app.resolve(event, context); diff --git a/examples/snippets/event-handler/rest/advanced_mw_destructuring_problem.ts b/examples/snippets/event-handler/rest/advanced_mw_destructuring_problem.ts index cc268fac6b..eaaca2bc2b 100644 --- a/examples/snippets/event-handler/rest/advanced_mw_destructuring_problem.ts +++ b/examples/snippets/event-handler/rest/advanced_mw_destructuring_problem.ts @@ -5,7 +5,7 @@ import type { Context } from 'aws-lambda'; const app = new Router(); // ❌ WRONG: Using destructuring captures a reference to the original response -const badMiddleware: Middleware = async (params, { res }, next) => { +const _badMiddleware: Middleware = async (_, { res }, next) => { res.headers.set('X-Before', 'Before'); await next(); // This header will NOT be added because 'res' is a stale reference @@ -13,7 +13,7 @@ const badMiddleware: Middleware = async (params, { res }, next) => { }; // ✅ CORRECT: Always access response through reqCtx -const goodMiddleware: Middleware = async (params, reqCtx, next) => { +const goodMiddleware: Middleware = async (_, reqCtx, next) => { reqCtx.res.headers.set('X-Before', 'Before'); await next(); // This header WILL be added because we get the current response @@ -26,6 +26,5 @@ app.get('/test', async () => { return { message: 'Hello World!' }; }); -export const handler = async (event: unknown, context: Context) => { - return await app.resolve(event, context); -}; +export const handler = async (event: unknown, context: Context) => + app.resolve(event, context); diff --git a/examples/snippets/event-handler/rest/advanced_mw_early_return.ts b/examples/snippets/event-handler/rest/advanced_mw_early_return.ts index a08e90e3cf..4a1d26df9e 100644 --- a/examples/snippets/event-handler/rest/advanced_mw_early_return.ts +++ b/examples/snippets/event-handler/rest/advanced_mw_early_return.ts @@ -9,7 +9,7 @@ const logger = new Logger(); const app = new Router({ logger }); // Authentication middleware - returns early if no auth header -const authMiddleware: Middleware = async (params, reqCtx, next) => { +const authMiddleware: Middleware = async (_, reqCtx, next) => { const authHeader = reqCtx.request.headers.get('authorization'); if (!authHeader) { @@ -23,7 +23,7 @@ const authMiddleware: Middleware = async (params, reqCtx, next) => { }; // Logging middleware - never executes when auth fails -const loggingMiddleware: Middleware = async (params, reqCtx, next) => { +const loggingMiddleware: Middleware = async (_, __, next) => { logger.info('Request processed'); await next(); }; @@ -36,6 +36,5 @@ app.get('/todos', async () => { return { todos }; }); -export const handler = async (event: unknown, context: Context) => { - return app.resolve(event, context); -}; +export const handler = async (event: unknown, context: Context) => + app.resolve(event, context); diff --git a/examples/snippets/event-handler/rest/advanced_mw_middleware_order.ts b/examples/snippets/event-handler/rest/advanced_mw_middleware_order.ts index dad875582b..fc86013b5e 100644 --- a/examples/snippets/event-handler/rest/advanced_mw_middleware_order.ts +++ b/examples/snippets/event-handler/rest/advanced_mw_middleware_order.ts @@ -10,14 +10,14 @@ const logger = new Logger(); const app = new Router({ logger }); // Global middleware - executes first in pre-processing, last in post-processing -app.use(async (params, reqCtx, next) => { +app.use(async (_, reqCtx, next) => { reqCtx.res.headers.set('x-pre-processed-by', 'global-middleware'); await next(); reqCtx.res.headers.set('x-post-processed-by', 'global-middleware'); }); // Route-specific middleware - executes second in pre-processing, first in post-processing -const routeMiddleware: Middleware = async (params, reqCtx, next) => { +const routeMiddleware: Middleware = async (_, reqCtx, next) => { reqCtx.res.headers.set('x-pre-processed-by', 'route-middleware'); await next(); reqCtx.res.headers.set('x-post-processed-by', 'route-middleware'); @@ -31,7 +31,7 @@ app.get('/todos', async () => { // This route will have: // x-pre-processed-by: route-middleware (route middleware overwrites global) // x-post-processed-by: global-middleware (global middleware executes last) -app.post('/todos', [routeMiddleware], async (params, reqCtx) => { +app.post('/todos', [routeMiddleware], async (_, reqCtx) => { const body = await reqCtx.request.json(); const todo = await putTodo(body); return todo; diff --git a/examples/snippets/event-handler/rest/advanced_testing_helper.ts b/examples/snippets/event-handler/rest/advanced_testing_helper.ts new file mode 100644 index 0000000000..bce078e7c2 --- /dev/null +++ b/examples/snippets/event-handler/rest/advanced_testing_helper.ts @@ -0,0 +1,26 @@ +import type { APIGatewayProxyEvent } from 'aws-lambda'; + +const createTestEvent = (options: { + path: string; + httpMethod: string; + headers?: Record; +}): APIGatewayProxyEvent => ({ + path: options.path, + httpMethod: options.httpMethod, + headers: options.headers ?? {}, + body: null, + multiValueHeaders: {}, + isBase64Encoded: false, + pathParameters: null, + queryStringParameters: null, + multiValueQueryStringParameters: null, + stageVariables: null, + requestContext: { + httpMethod: options.httpMethod, + path: options.path, + domainName: 'localhost', + } as APIGatewayProxyEvent['requestContext'], + resource: '', +}); + +export { createTestEvent }; diff --git a/examples/snippets/event-handler/rest/advanced_testing_main.ts b/examples/snippets/event-handler/rest/advanced_testing_main.ts new file mode 100644 index 0000000000..4fbc32d553 --- /dev/null +++ b/examples/snippets/event-handler/rest/advanced_testing_main.ts @@ -0,0 +1,39 @@ +import type { Context } from 'aws-lambda'; +import { expect, test } from 'vitest'; +import { handler } from './advanced_cors_simple.js'; +import { createTestEvent } from './advanced_testing_helper.js'; + +test('returns CORS headers', async () => { + // Preapare + const event = createTestEvent({ + httpMethod: 'GET', + headers: { + Origin: 'https://example.com', + }, + path: '/todos/123', + }); + + // Act + const result = await handler(event, {} as Context); + + // Assess + expect(result.statusCode).toEqual(200); + expect(result.body).toEqual(JSON.stringify({ todo: { id: '123' } })); + expect(result.headers?.['access-control-allow-origin']).toEqual( + 'https://example.com' + ); + expect( + result.multiValueHeaders?.['access-control-allow-methods'].sort() + ).toEqual(['DELETE', 'GET', 'HEAD', 'PATCH', 'POST', 'PUT'].sort()); + expect( + result.multiValueHeaders?.['access-control-allow-headers'].sort() + ).toEqual( + [ + 'Authorization', + 'Content-Type', + 'X-Amz-Date', + 'X-Amz-Security-Token', + 'X-Api-Key', + ].sort() + ); +}); diff --git a/examples/snippets/event-handler/rest/diagrams/middleware_early_return.mermaid b/examples/snippets/event-handler/rest/diagrams/middleware_early_return.mermaid new file mode 100644 index 0000000000..ca7e189db5 --- /dev/null +++ b/examples/snippets/event-handler/rest/diagrams/middleware_early_return.mermaid @@ -0,0 +1,20 @@ +sequenceDiagram + participant Request + participant Router + participant M1 as Middleware 1 + participant M2 as Middleware 2 + participant M3 as Middleware 3 + participant Handler as Route Handler + + Request->>Router: Incoming Request + Router->>M1: Execute (params, reqCtx, next) + Note over M1: Pre-processing + M1->>M2: Call next() + Note over M2: Pre-processing + M2->>M2: Return Response (early return) + Note over M2: Post-processing + M2-->>M1: Return Response + Note over M1: Post-processing + M1-->>Router: Return Response + Router-->>Request: Response + Note over M3,Handler: Never executed \ No newline at end of file diff --git a/examples/snippets/event-handler/rest/diagrams/middleware_error_handling.mermaid b/examples/snippets/event-handler/rest/diagrams/middleware_error_handling.mermaid new file mode 100644 index 0000000000..5c5aafa569 --- /dev/null +++ b/examples/snippets/event-handler/rest/diagrams/middleware_error_handling.mermaid @@ -0,0 +1,19 @@ +sequenceDiagram + participant Request + participant Router + participant EH as Error Handler + participant M1 as Middleware 1 + participant M2 as Middleware 2 + participant Handler as Route Handler + + Request->>Router: Incoming Request + Router->>M1: Execute (params, reqCtx, next) + Note over M1: Pre-processing + M1->>M2: Call next() + Note over M2: Throws Error + M2-->>M1: Error propagated + M1-->>Router: Error propagated + Router->>EH: Handle error + EH-->>Router: HTTP 500 Response + Router-->>Request: HTTP 500 Error + Note over Handler: Never executed \ No newline at end of file diff --git a/examples/snippets/event-handler/rest/diagrams/middleware_execution_order.mermaid b/examples/snippets/event-handler/rest/diagrams/middleware_execution_order.mermaid new file mode 100644 index 0000000000..696be1264d --- /dev/null +++ b/examples/snippets/event-handler/rest/diagrams/middleware_execution_order.mermaid @@ -0,0 +1,20 @@ +sequenceDiagram + participant Request + participant Router + participant GM as Global Middleware + participant RM as Route Middleware + participant Handler as Route Handler + + Request->>Router: Incoming Request + Router->>GM: Execute (params, reqCtx, next) + Note over GM: Pre-processing + GM->>RM: Call next() + Note over RM: Pre-processing + RM->>Handler: Call next() + Note over Handler: Execute handler + Handler-->>RM: Return + Note over RM: Post-processing + RM-->>GM: Return + Note over GM: Post-processing + GM-->>Router: Return + Router-->>Request: Response \ No newline at end of file diff --git a/examples/snippets/event-handler/rest/diagrams/middleware_handled_error.mermaid b/examples/snippets/event-handler/rest/diagrams/middleware_handled_error.mermaid new file mode 100644 index 0000000000..5d0da29a88 --- /dev/null +++ b/examples/snippets/event-handler/rest/diagrams/middleware_handled_error.mermaid @@ -0,0 +1,21 @@ +sequenceDiagram + participant Request + participant Router + participant M1 as Middleware 1 + participant M2 as Middleware 2 + participant Handler as Route Handler + + Request->>Router: Incoming Request + Router->>M1: Execute (params, reqCtx, next) + Note over M1: Pre-processing + M1->>M2: Call next() + Note over M2: Error thrown & caught + Note over M2: Handle error gracefully + M2->>Handler: Call next() + Note over Handler: Execute handler + Handler-->>M2: Return + Note over M2: Post-processing + M2-->>M1: Return + Note over M1: Post-processing + M1-->>Router: Return + Router-->>Request: Response \ No newline at end of file diff --git a/examples/snippets/event-handler/rest/diagrams/middleware_throwing_error.mermaid b/examples/snippets/event-handler/rest/diagrams/middleware_throwing_error.mermaid new file mode 100644 index 0000000000..25ed59d74d --- /dev/null +++ b/examples/snippets/event-handler/rest/diagrams/middleware_throwing_error.mermaid @@ -0,0 +1,19 @@ +sequenceDiagram + participant Request + participant Router + participant EH as Error Handler + participant M1 as Middleware 1 + participant M2 as Middleware 2 + participant Handler as Route Handler + + Request->>Router: Incoming Request + Router->>M1: Execute (params, reqCtx, next) + Note over M1: Pre-processing + M1->>M2: Call next() + Note over M2: Intentionally throws error + M2-->>M1: Error propagated + M1-->>Router: Error propagated + Router->>EH: Handle error + EH-->>Router: HTTP Error Response + Router-->>Request: HTTP Error Response + Note over Handler: Never executed \ No newline at end of file diff --git a/examples/snippets/event-handler/rest/gettingStarted_error_handling.ts b/examples/snippets/event-handler/rest/gettingStarted_error_handling.ts new file mode 100644 index 0000000000..9465fa6d02 --- /dev/null +++ b/examples/snippets/event-handler/rest/gettingStarted_error_handling.ts @@ -0,0 +1,30 @@ +declare function getTodoById(todoId: unknown): Promise<{ id: string } & T>; +declare class GetTodoError extends Error {} + +import { + HttpErrorCodes, + Router, +} from '@aws-lambda-powertools/event-handler/experimental-rest'; +import { Logger } from '@aws-lambda-powertools/logger'; +import type { Context } from 'aws-lambda/handler'; + +const logger = new Logger(); +const app = new Router({ logger }); + +app.errorHandler(GetTodoError, async (error, reqCtx) => { + logger.error('Unable to get todo', { error }); + + return { + statusCode: HttpErrorCodes.BAD_REQUEST, + message: `Bad request: ${error.message} - ${reqCtx.request.headers.get('x-correlation-id')}`, + error: 'BadRequest', + }; +}); + +app.get('/todos/:todoId', async ({ todoId }) => { + const todo = await getTodoById(todoId); // May throw GetTodoError + return { todo }; +}); + +export const handler = async (event: unknown, context: Context) => + app.resolve(event, context); diff --git a/examples/snippets/event-handler/rest/gettingStarted_handle_not_found.ts b/examples/snippets/event-handler/rest/gettingStarted_handle_not_found.ts new file mode 100644 index 0000000000..970fc7b294 --- /dev/null +++ b/examples/snippets/event-handler/rest/gettingStarted_handle_not_found.ts @@ -0,0 +1,24 @@ +import { + HttpErrorCodes, + Router, +} from '@aws-lambda-powertools/event-handler/experimental-rest'; +import { Logger } from '@aws-lambda-powertools/logger'; +import type { Context } from 'aws-lambda/handler'; + +const logger = new Logger(); +const app = new Router({ logger }); + +app.notFound(async (error, reqCtx) => { + logger.error('Unable to get todo', { error }); + + return { + statusCode: HttpErrorCodes.IM_A_TEAPOT, + body: "I'm a teapot!", + headers: { + 'x-correlation-id': reqCtx.request.headers.get('x-correlation-id'), + }, + }; +}); + +export const handler = async (event: unknown, context: Context) => + app.resolve(event, context); diff --git a/examples/snippets/event-handler/rest/gettingStarted_throwing_http_errors.ts b/examples/snippets/event-handler/rest/gettingStarted_throwing_http_errors.ts new file mode 100644 index 0000000000..417a9a2e8b --- /dev/null +++ b/examples/snippets/event-handler/rest/gettingStarted_throwing_http_errors.ts @@ -0,0 +1,23 @@ +declare function isAuthenticated(token: string): boolean; + +import { + Router, + UnauthorizedError, +} from '@aws-lambda-powertools/event-handler/experimental-rest'; +import type { Context } from 'aws-lambda'; + +const app = new Router(); + +app.use(async (_, reqCtx, next) => { + if (!isAuthenticated(reqCtx.request.headers.get('Authorization') ?? '')) { + throw new UnauthorizedError(); // This will return a 401 Unauthorized response + } + await next(); +}); + +app.get('/secure', async () => { + return { message: 'super important data' }; +}); + +export const handler = async (event: unknown, context: Context) => + app.resolve(event, context); diff --git a/examples/snippets/event-handler/rest/samples/advanced_binary_req.json b/examples/snippets/event-handler/rest/samples/advanced_binary_req.json new file mode 100644 index 0000000000..021832523b --- /dev/null +++ b/examples/snippets/event-handler/rest/samples/advanced_binary_req.json @@ -0,0 +1,9 @@ +{ + "headers": { + "Accept": "image/png", + "Accept-Encoding": "gzip" + }, + "resource": "/logo", + "path": "/logo", + "httpMethod": "GET" +} \ No newline at end of file diff --git a/examples/snippets/event-handler/rest/samples/advanced_binary_res.json b/examples/snippets/event-handler/rest/samples/advanced_binary_res.json new file mode 100644 index 0000000000..371248a1a8 --- /dev/null +++ b/examples/snippets/event-handler/rest/samples/advanced_binary_res.json @@ -0,0 +1,13 @@ +{ + "body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjU2cHgiIGhlaWdodD0iMjU2cHgiIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIj4KICAgIDx0aXRsZT5BV1MgTGFtYmRhPC90aXRsZT4KICAgIDxkZWZzPgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMCUiIHkxPSIxMDAlIiB4Mj0iMTAwJSIgeTI9IjAlIiBpZD0ibGluZWFyR3JhZGllbnQtMSI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNDODUxMUIiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGOTkwMCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDwvZGVmcz4KICAgIDxnPgogICAgICAgIDxyZWN0IGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQtMSkiIHg9IjAiIHk9IjAiIHdpZHRoPSIyNTYiIGhlaWdodD0iMjU2Ij48L3JlY3Q+CiAgICAgICAgPHBhdGggZD0iTTg5LjYyNDExMjYsMjExLjIgTDQ5Ljg5MDMyNzcsMjExLjIgTDkzLjgzNTQ4MzIsMTE5LjM0NzIgTDExMy43NDcyOCwxNjAuMzM5MiBMODkuNjI0MTEyNiwyMTEuMiBaIE05Ni43MDI5MzU3LDExMC41Njk2IEM5Ni4xNjQwODU4LDEwOS40NjU2IDk1LjA0MTQ4MTMsMTA4Ljc2NDggOTMuODE2MjM4NCwxMDguNzY0OCBMOTMuODA2NjE2MywxMDguNzY0OCBDOTIuNTcxNzUxNCwxMDguNzY4IDkxLjQ0OTE0NjYsMTA5LjQ3NTIgOTAuOTE5OTE4NywxMTAuNTg1NiBMNDEuOTEzNDIwOCwyMTMuMDIwOCBDNDEuNDM4NzE5NywyMTQuMDEyOCA0MS41MDYwNzU4LDIxNS4xNzc2IDQyLjA5NjI0NTEsMjE2LjEwODggQzQyLjY3OTk5OTQsMjE3LjAzNjggNDMuNzA2MzgwNSwyMTcuNiA0NC44MDY1MzMxLDIxNy42IEw5MS42NTQ0MjMsMjE3LjYgQzkyLjg5NTcwMjcsMjE3LjYgOTQuMDIxNTE0OSwyMTYuODg2NCA5NC41NTM5NTAxLDIxNS43Njk2IEwxMjAuMjAzODU5LDE2MS42ODk2IEMxMjAuNjE3NjE5LDE2MC44MTI4IDEyMC42MTQ0MTIsMTU5Ljc5ODQgMTIwLjE4NzgyMiwxNTguOTI4IEw5Ni43MDI5MzU3LDExMC41Njk2IFogTTIwNy45ODUxMTcsMjExLjIgTDE2OC41MDc5MjgsMjExLjIgTDEwNS4xNzM3ODksNzguNjI0IEMxMDQuNjQ0NTYxLDc3LjUxMDQgMTAzLjUxNTU0MSw3Ni44IDEwMi4yNzc0NjksNzYuOCBMNzYuNDQ3OTQzLDc2LjggTDc2LjQ3NjgwOTksNDQuOCBMMTI3LjEwMzA2Niw0NC44IEwxOTAuMTQ1MzI4LDE3Ny4zNzI4IEMxOTAuNjc0NTU2LDE3OC40ODY0IDE5MS44MDM1NzUsMTc5LjIgMTkzLjA0MTY0NywxNzkuMiBMMjA3Ljk4NTExNywxNzkuMiBMMjA3Ljk4NTExNywyMTEuMiBaIE0yMTEuMTkyNTU4LDE3Mi44IEwxOTUuMDcxOTU4LDE3Mi44IEwxMzIuMDI5Njk2LDQwLjIyNzIgQzEzMS41MDA0NjgsMzkuMTEzNiAxMzAuMzcxNDQ5LDM4LjQgMTI5LjEzMDE2OSwzOC40IEw3My4yNzI1NzYsMzguNCBDNzEuNTA1Mjc1OCwzOC40IDcwLjA2ODM0MjEsMzkuODMwNCA3MC4wNjUxMzQ0LDQxLjU5NjggTDcwLjAyOTg1MjgsNzkuOTk2OCBDNzAuMDI5ODUyOCw4MC44NDggNzAuMzYzNDI2Niw4MS42NjA4IDcwLjk2OTYzMyw4Mi4yNjI0IEM3MS41Njk0MjQ2LDgyLjg2NCA3Mi4zODQxMTQ2LDgzLjIgNzMuMjM3Mjk0MSw4My4yIEwxMDAuMjUzNTczLDgzLjIgTDE2My41OTA5MiwyMTUuNzc2IEMxNjQuMTIzMzU1LDIxNi44ODk2IDE2NS4yNDU5NiwyMTcuNiAxNjYuNDg0MDMyLDIxNy42IEwyMTEuMTkyNTU4LDIxNy42IEMyMTIuOTY2Mjc0LDIxNy42IDIxNC40LDIxNi4xNjY0IDIxNC40LDIxNC40IEwyMTQuNCwxNzYgQzIxNC40LDE3NC4yMzM2IDIxMi45NjYyNzQsMTcyLjggMjExLjE5MjU1OCwxNzIuOCBMMjExLjE5MjU1OCwxNzIuOCBaIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg==", + "multiValueHeaders": { + "Content-Type": [ + "image/png" + ], + "Content-Encoding": [ + "gzip" + ] + }, + "isBase64Encoded": true, + "statusCode": 200 +} \ No newline at end of file diff --git a/examples/snippets/event-handler/rest/samples/advanced_compress_req.json b/examples/snippets/event-handler/rest/samples/advanced_compress_req.json new file mode 100644 index 0000000000..ed7979c17f --- /dev/null +++ b/examples/snippets/event-handler/rest/samples/advanced_compress_req.json @@ -0,0 +1,8 @@ +{ + "headers": { + "Accept-Encoding": "gzip" + }, + "resource": "/todos/1", + "path": "/todos/1", + "httpMethod": "GET" +} \ No newline at end of file diff --git a/examples/snippets/event-handler/rest/samples/advanced_compress_res.json b/examples/snippets/event-handler/rest/samples/advanced_compress_res.json new file mode 100644 index 0000000000..c05f566de1 --- /dev/null +++ b/examples/snippets/event-handler/rest/samples/advanced_compress_res.json @@ -0,0 +1,13 @@ +{ + "statusCode": 200, + "multiValueHeaders": { + "Content-Type": [ + "application/json" + ], + "Content-Encoding": [ + "gzip" + ] + }, + "body": "H4sIAAAAAAACE42STU4DMQyFrxJl3QXln96AMyAW7sSDLCVxiJ0Kqerd8TCCUOgii1EmP/783pOPXjmw+N3L0TfB+hz8brvxtC5KGtHvfMCIkzZx0HT5MPmNnziViIr2dIYoeNr8Q1x3xHsjcVadIbkZJoq2RXU8zzQROLseQ9505NzeCNQdMJNBE+UmY4zbzjAJhWtlZ57sB84BWtul+rteH2HPlVgWARwjqXkxpklK5gmEHAQqJBMtFsGVygcKmNVRjG0wxvuzGF2L0dpVUOKMC3bfJNjJgWMrCuZk7cUp02AiD72D6WKHHwUDKbiJs6AZ0VZXKOUx4uNvzdxT+E4mLcMA+6G8nzrLQkaxkNEVrFKW2VGbJCoCY7q2V3+tiv5kGThyxfTecDWbgGz/NfYXhL6ePgF9PnFdPgMAAA==", + "isBase64Encoded": true +} \ No newline at end of file diff --git a/examples/snippets/event-handler/rest/samples/advanced_cors_per_route.json b/examples/snippets/event-handler/rest/samples/advanced_cors_per_route.json new file mode 100644 index 0000000000..12570fedfe --- /dev/null +++ b/examples/snippets/event-handler/rest/samples/advanced_cors_per_route.json @@ -0,0 +1,9 @@ +{ + "statusCode": 200, + "headers": { + "access-control-allow-origin": "*", + "content-type": "application/json" + }, + "body": "{\"status\":\"ok\"}", + "isBase64Encoded": false +} \ No newline at end of file diff --git a/examples/snippets/event-handler/rest/samples/advanced_cors_simple.json b/examples/snippets/event-handler/rest/samples/advanced_cors_simple.json new file mode 100644 index 0000000000..6980c59567 --- /dev/null +++ b/examples/snippets/event-handler/rest/samples/advanced_cors_simple.json @@ -0,0 +1,27 @@ +{ + "statusCode": 200, + "headers": { + "access-control-allow-credentials": "false", + "access-control-allow-origin": "https://example.com", + "content-type": "application/json" + }, + "multiValueHeaders": { + "access-control-allow-headers": [ + "Authorization", + "Content-Type", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token" + ], + "access-control-allow-methods": [ + "DELETE", + "GET", + "HEAD", + "PATCH", + "POST", + "PUT" + ] + }, + "body": "{\"todoId\":\"123\",\"task\":\"Example task\",\"completed\":false}", + "isBase64Encoded": false +} \ No newline at end of file diff --git a/examples/snippets/event-handler/rest/samples/advanced_error_debug.json b/examples/snippets/event-handler/rest/samples/advanced_error_debug.json new file mode 100644 index 0000000000..a7b6ccaf54 --- /dev/null +++ b/examples/snippets/event-handler/rest/samples/advanced_error_debug.json @@ -0,0 +1,9 @@ +{ + "statusCode": 500, + "error": "Internal Server Error", + "message": "Actual error message from the exception", + "stack": "Full stack trace of the error", + "details": { + "errorName": "Name of the error class" + } +} \ No newline at end of file diff --git a/examples/snippets/event-handler/rest/samples/advanced_error_prod.json b/examples/snippets/event-handler/rest/samples/advanced_error_prod.json new file mode 100644 index 0000000000..7a3a12425d --- /dev/null +++ b/examples/snippets/event-handler/rest/samples/advanced_error_prod.json @@ -0,0 +1,5 @@ +{ + "statusCode": 500, + "error": "Internal Server Error", + "message": "Internal Server Error" +} \ No newline at end of file From c45206b047c5db1b4e0ce19d436e310a2fa34442 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Mon, 22 Sep 2025 11:38:00 +0200 Subject: [PATCH 169/255] chore: always append `PTEnv` to UA string (#4522) --- packages/commons/src/index.ts | 5 +++-- packages/commons/tests/unit/awsSdkUtils.test.ts | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/commons/src/index.ts b/packages/commons/src/index.ts index 44cbb30afd..f4eb6ce10b 100644 --- a/packages/commons/src/index.ts +++ b/packages/commons/src/index.ts @@ -1,9 +1,10 @@ import { PT_VERSION } from './version.js'; +const env = process.env.AWS_EXECUTION_ENV || 'NA'; if (!process.env.AWS_SDK_UA_APP_ID) { - process.env.AWS_SDK_UA_APP_ID = `PT/TEST/${PT_VERSION}`; + process.env.AWS_SDK_UA_APP_ID = `PT/NO-OP/${PT_VERSION}/PTEnv/${env}`; } else { - process.env.AWS_SDK_UA_APP_ID = `${process.env.AWS_SDK_UA_APP_ID}/PT/TEST/${PT_VERSION}`; + process.env.AWS_SDK_UA_APP_ID = `${process.env.AWS_SDK_UA_APP_ID}/PT/NO-OP/${PT_VERSION}/PTEnv/${env}`; } export { addUserAgentMiddleware, isSdkClient } from './awsSdkUtils.js'; diff --git a/packages/commons/tests/unit/awsSdkUtils.test.ts b/packages/commons/tests/unit/awsSdkUtils.test.ts index ac6ce9f7ae..2029c2ecc7 100644 --- a/packages/commons/tests/unit/awsSdkUtils.test.ts +++ b/packages/commons/tests/unit/awsSdkUtils.test.ts @@ -84,7 +84,9 @@ describe('Helpers: awsSdk', () => { it('concatenates the PT AWS_SDK_UA_APP_ID when one is already set', () => { // Assess - expect(process.env.AWS_SDK_UA_APP_ID).toEqual(`test/PT/TEST/${version}`); + expect(process.env.AWS_SDK_UA_APP_ID).toEqual( + `test/PT/NO-OP/${version}/PTEnv/NA` + ); }); describe('Function: customUserAgentMiddleware', () => { From b0b43e862fb189941fe9db220580884e7707d541 Mon Sep 17 00:00:00 2001 From: Stefano Vozza Date: Mon, 22 Sep 2025 10:41:28 +0100 Subject: [PATCH 170/255] feat(event-handler): throw error when middleware does not await next() (#4511) Co-authored-by: Andrea Amorosi --- packages/event-handler/src/rest/utils.ts | 19 +++++++++++--- .../tests/unit/rest/Router/middleware.test.ts | 26 +++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/packages/event-handler/src/rest/utils.ts b/packages/event-handler/src/rest/utils.ts index 652b41b17c..1fb3d5df96 100644 --- a/packages/event-handler/src/rest/utils.ts +++ b/packages/event-handler/src/rest/utils.ts @@ -172,9 +172,22 @@ export const composeMiddleware = (middleware: Middleware[]): Middleware => { } const middlewareFn = middleware[i]; - const middlewareResult = await middlewareFn(params, reqCtx, () => - dispatch(i + 1) - ); + let nextPromise: Promise | null = null; + let nextAwaited = false; + const nextFn = async () => { + nextPromise = dispatch(i + 1); + const result = await nextPromise; + nextAwaited = true; + return result; + }; + + const middlewareResult = await middlewareFn(params, reqCtx, nextFn); + + if (nextPromise && !nextAwaited && i < middleware.length - 1) { + throw new Error( + 'Middleware called next() without awaiting. This may lead to unexpected behavior.' + ); + } if (middlewareResult !== undefined) { result = middlewareResult; diff --git a/packages/event-handler/tests/unit/rest/Router/middleware.test.ts b/packages/event-handler/tests/unit/rest/Router/middleware.test.ts index 6c239c80d6..9561e1eb18 100644 --- a/packages/event-handler/tests/unit/rest/Router/middleware.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/middleware.test.ts @@ -180,6 +180,32 @@ describe('Class: Router - Middleware', () => { expect(body.message).toContain('next() called multiple times'); }); + it('should throw error if middleware does not await next()', async () => { + // Prepare + vi.stubEnv('POWERTOOLS_DEV', 'true'); + const app = new Router(); + + app.use(async (_params, _reqCtx, next) => { + await next(); + }); + + app.use(async (_params, _reqCtx, next) => { + next(); + }); + + // Act + const result = await app.resolve( + createTestEvent('/test', 'OPTIONS'), + context + ); + + // Assess + const body = JSON.parse(result.body); + expect(body.message).toEqual( + 'Middleware called next() without awaiting. This may lead to unexpected behavior.' + ); + }); + it('handles errors thrown in middleware before next()', async () => { // Prepare const app = new Router(); From 89138542cd9e195555299f401646ae94d0bb50ee Mon Sep 17 00:00:00 2001 From: Swopnil Dangol Date: Mon, 22 Sep 2025 13:19:57 +0100 Subject: [PATCH 171/255] feat(event-handler): implemented route prefixes in HTTP event handler (#4523) Co-authored-by: Andrea Amorosi --- packages/event-handler/src/rest/Router.ts | 19 ++++++++++--- packages/event-handler/src/types/rest.ts | 4 +++ .../unit/rest/Router/basic-routing.test.ts | 27 +++++++++++++++++++ 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/packages/event-handler/src/rest/Router.ts b/packages/event-handler/src/rest/Router.ts index d54cec4a02..0dfeeecadf 100644 --- a/packages/event-handler/src/rest/Router.ts +++ b/packages/event-handler/src/rest/Router.ts @@ -56,6 +56,10 @@ class Router { * Whether the router is running in development mode. */ protected readonly isDev: boolean = false; + /** + * The base prefix to be used for all routes registered using this Router. + */ + protected readonly prefix?: Path; public constructor(options?: RestRouterOptions) { this.context = {}; @@ -73,6 +77,7 @@ class Router { logger: this.logger, }); this.isDev = isDevMode(); + this.prefix = options?.prefix; } /** @@ -238,9 +243,9 @@ class Router { ); } else { const handler = - options?.scope != null - ? route.handler.bind(options.scope) - : route.handler; + options?.scope == null + ? route.handler + : route.handler.bind(options.scope); const handlerResult = await handler(params, reqCtx); reqCtx.res = handlerResultToWebResponse( @@ -281,9 +286,15 @@ class Router { public route(handler: RouteHandler, options: RestRouteOptions): void { const { method, path, middleware = [] } = options; const methods = Array.isArray(method) ? method : [method]; + let resolvedPath = path; + if (this.prefix) { + resolvedPath = path === '/' ? this.prefix : `${this.prefix}${path}`; + } for (const method of methods) { - this.routeRegistry.register(new Route(method, path, handler, middleware)); + this.routeRegistry.register( + new Route(method, resolvedPath, handler, middleware) + ); } } diff --git a/packages/event-handler/src/types/rest.ts b/packages/event-handler/src/types/rest.ts index e4924d1d2c..0b660330bd 100644 --- a/packages/event-handler/src/types/rest.ts +++ b/packages/event-handler/src/types/rest.ts @@ -43,6 +43,10 @@ type RestRouterOptions = { * When no logger is provided, we'll only log warnings and errors using the global `console` object. */ logger?: GenericLogger; + /** + * The base prefix to be used for all routes registered using this Router. + */ + prefix?: Path; }; interface CompiledRoute { diff --git a/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts b/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts index 0fe0d4182d..b983b4ed2b 100644 --- a/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts @@ -117,4 +117,31 @@ describe('Class: Router - Basic Routing', () => { InternalServerError ); }); + + it('routes to the prefixed path when having a shared prefix defined', async () => { + // Prepare + const app = new Router({ + prefix: '/todos', + }); + app.post('/', async () => { + return { actualPath: '/todos' }; + }); + app.get('/:todoId', async ({ todoId }) => { + return { actualPath: `/todos/${todoId}` }; + }); + + // Act + const createResult = await app.resolve( + createTestEvent('/todos', 'POST'), + context + ); + const getResult = await app.resolve( + createTestEvent('/todos/1', 'GET'), + context + ); + + // Assess + expect(JSON.parse(createResult.body).actualPath).toBe('/todos'); + expect(JSON.parse(getResult.body).actualPath).toBe('/todos/1'); + }); }); From b542da558f16dd542dd6542cbf80be1f56014f49 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Sep 2025 14:40:09 +0100 Subject: [PATCH 172/255] chore(deps-dev): bump zod from 4.1.9 to 4.1.11 (#4524) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/snippets/package.json | 2 +- package-lock.json | 14 +++++++------- packages/batch/package.json | 2 +- packages/kafka/package.json | 2 +- packages/parser/package.json | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/examples/snippets/package.json b/examples/snippets/package.json index dbd1ece0e7..78c6dc8b22 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -43,7 +43,7 @@ "@valkey/valkey-glide": "^2.1.0", "aws-sdk": "^2.1692.0", "aws-sdk-client-mock": "^4.1.0", - "zod": "^4.1.9" + "zod": "^4.1.11" }, "dependencies": { "arktype": "^2.1.22", diff --git a/package-lock.json b/package-lock.json index 12e3e756d9..9e90702086 100644 --- a/package-lock.json +++ b/package-lock.json @@ -105,7 +105,7 @@ "@valkey/valkey-glide": "^2.1.0", "aws-sdk": "^2.1692.0", "aws-sdk-client-mock": "^4.1.0", - "zod": "^4.1.9" + "zod": "^4.1.11" } }, "examples/snippets/node_modules/@valkey/valkey-glide": { @@ -10746,9 +10746,9 @@ } }, "node_modules/zod": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.9.tgz", - "integrity": "sha512-HI32jTq0AUAC125z30E8bQNz0RQ+9Uc+4J7V97gLYjZVKRjeydPgGt6dvQzFrav7MYOUGFqqOGiHpA/fdbd0cQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz", + "integrity": "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==", "dev": true, "license": "MIT", "funding": { @@ -10766,7 +10766,7 @@ "devDependencies": { "@aws-lambda-powertools/parser": "2.26.1", "@aws-lambda-powertools/testing-utils": "file:../testing", - "zod": "^4.1.9" + "zod": "^4.1.11" } }, "packages/commons": { @@ -10843,7 +10843,7 @@ "devDependencies": { "avro-js": "^1.12.0", "protobufjs": "^7.5.4", - "zod": "^4.1.9" + "zod": "^4.1.11" }, "peerDependencies": { "arktype": ">=2.0.0", @@ -10964,7 +10964,7 @@ "@standard-schema/spec": "^1.0.0" }, "devDependencies": { - "zod": "^4.1.9" + "zod": "^4.1.11" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x", diff --git a/packages/batch/package.json b/packages/batch/package.json index f5faf875f9..f4876b47fb 100644 --- a/packages/batch/package.json +++ b/packages/batch/package.json @@ -87,6 +87,6 @@ "devDependencies": { "@aws-lambda-powertools/parser": "2.26.1", "@aws-lambda-powertools/testing-utils": "file:../testing", - "zod": "^4.1.9" + "zod": "^4.1.11" } } \ No newline at end of file diff --git a/packages/kafka/package.json b/packages/kafka/package.json index daf47fd320..ed6b2b9c84 100644 --- a/packages/kafka/package.json +++ b/packages/kafka/package.json @@ -116,6 +116,6 @@ "devDependencies": { "avro-js": "^1.12.0", "protobufjs": "^7.5.4", - "zod": "^4.1.9" + "zod": "^4.1.11" } } diff --git a/packages/parser/package.json b/packages/parser/package.json index f9f6453779..af7daed5db 100644 --- a/packages/parser/package.json +++ b/packages/parser/package.json @@ -215,6 +215,6 @@ } }, "devDependencies": { - "zod": "^4.1.9" + "zod": "^4.1.11" } } From dd368fa3eb08a86c2d5aad3cf9b832d7a8288486 Mon Sep 17 00:00:00 2001 From: Swopnil Dangol Date: Mon, 22 Sep 2025 15:24:28 +0100 Subject: [PATCH 173/255] fix(event-handler): fixed CORS behaviour not aligned with CORS spec (#4512) Co-authored-by: Stefano Vozza Co-authored-by: Andrea Amorosi --- .../event-handler/src/rest/middleware/cors.ts | 119 ++++++---- .../tests/unit/rest/middleware/cors.test.ts | 211 +++++++++++++----- 2 files changed, 232 insertions(+), 98 deletions(-) diff --git a/packages/event-handler/src/rest/middleware/cors.ts b/packages/event-handler/src/rest/middleware/cors.ts index 6809a1d2d4..983f805530 100644 --- a/packages/event-handler/src/rest/middleware/cors.ts +++ b/packages/event-handler/src/rest/middleware/cors.ts @@ -1,26 +1,10 @@ -import type { - CorsOptions, - Middleware, -} from '../../types/rest.js'; +import type { CorsOptions, Middleware } from '../../types/rest.js'; import { DEFAULT_CORS_OPTIONS, HttpErrorCodes, HttpVerbs, } from '../constants.js'; -/** - * Resolves the origin value based on the configuration - */ -const resolveOrigin = ( - originConfig: NonNullable, - requestOrigin: string | null, -): string => { - if (Array.isArray(originConfig)) { - return requestOrigin && originConfig.includes(requestOrigin) ? requestOrigin : ''; - } - return originConfig; -}; - /** * Creates a CORS middleware that adds appropriate CORS headers to responses * and handles OPTIONS preflight requests. @@ -29,9 +13,9 @@ const resolveOrigin = ( * ```typescript * import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; * import { cors } from '@aws-lambda-powertools/event-handler/experimental-rest/middleware'; - * + * * const app = new Router(); - * + * * // Use default configuration * app.use(cors()); * @@ -50,7 +34,7 @@ const resolveOrigin = ( * } * })); * ``` - * + * * @param options.origin - The origin to allow requests from * @param options.allowMethods - The HTTP methods to allow * @param options.allowHeaders - The headers to allow @@ -61,38 +45,93 @@ const resolveOrigin = ( export const cors = (options?: CorsOptions): Middleware => { const config = { ...DEFAULT_CORS_OPTIONS, - ...options + ...options, }; + const allowedOrigins = + typeof config.origin === 'string' ? [config.origin] : config.origin; + const allowsWildcard = allowedOrigins.includes('*'); + const allowedMethods = config.allowMethods.map((method) => + method.toUpperCase() + ); + const allowedHeaders = config.allowHeaders.map((header) => + header.toLowerCase() + ); - return async (_params, reqCtx, next) => { - const requestOrigin = reqCtx.request.headers.get('Origin'); - const resolvedOrigin = resolveOrigin(config.origin, requestOrigin); + const isOriginAllowed = ( + requestOrigin: string | null + ): requestOrigin is string => { + return ( + requestOrigin !== null && + (allowsWildcard || allowedOrigins.includes(requestOrigin)) + ); + }; - reqCtx.res.headers.set('access-control-allow-origin', resolvedOrigin); - if (resolvedOrigin !== '*') { - reqCtx.res.headers.set('Vary', 'Origin'); + const isValidPreflightRequest = (requestHeaders: Headers) => { + const accessControlRequestMethod = requestHeaders + .get('Access-Control-Request-Method') + ?.toUpperCase(); + const accessControlRequestHeaders = requestHeaders + .get('Access-Control-Request-Headers') + ?.toLowerCase(); + return ( + accessControlRequestMethod && + allowedMethods.includes(accessControlRequestMethod) && + accessControlRequestHeaders + ?.split(',') + .every((header) => allowedHeaders.includes(header.trim())) + ); + }; + + const setCORSBaseHeaders = ( + requestOrigin: string, + responseHeaders: Headers + ) => { + const resolvedOrigin = allowsWildcard ? '*' : requestOrigin; + responseHeaders.set('access-control-allow-origin', resolvedOrigin); + if (!allowsWildcard && Array.isArray(config.origin)) { + responseHeaders.set('vary', 'Origin'); } - config.allowMethods.forEach(method => { - reqCtx.res.headers.append('access-control-allow-methods', method); - }); - config.allowHeaders.forEach(header => { - reqCtx.res.headers.append('access-control-allow-headers', header); - }); - config.exposeHeaders.forEach(header => { - reqCtx.res.headers.append('access-control-expose-headers', header); - }); - reqCtx.res.headers.set('access-control-allow-credentials', config.credentials.toString()); - if (config.maxAge !== undefined) { - reqCtx.res.headers.set('access-control-max-age', config.maxAge.toString()); + if (config.credentials) { + responseHeaders.set('access-control-allow-credentials', 'true'); + } + }; + + return async (_params, reqCtx, next) => { + const requestOrigin = reqCtx.request.headers.get('Origin'); + if (!isOriginAllowed(requestOrigin)) { + await next(); + return; } // Handle preflight OPTIONS request - if (reqCtx.request.method === HttpVerbs.OPTIONS && reqCtx.request.headers.has('Access-Control-Request-Method')) { + if (reqCtx.request.method === HttpVerbs.OPTIONS) { + if (!isValidPreflightRequest(reqCtx.request.headers)) { + await next(); + return; + } + setCORSBaseHeaders(requestOrigin, reqCtx.res.headers); + if (config.maxAge !== undefined) { + reqCtx.res.headers.set( + 'access-control-max-age', + config.maxAge.toString() + ); + } + for (const method of allowedMethods) { + reqCtx.res.headers.append('access-control-allow-methods', method); + } + for (const header of allowedHeaders) { + reqCtx.res.headers.append('access-control-allow-headers', header); + } return new Response(null, { status: HttpErrorCodes.NO_CONTENT, headers: reqCtx.res.headers, }); } + + setCORSBaseHeaders(requestOrigin, reqCtx.res.headers); + for (const header of config.exposeHeaders) { + reqCtx.res.headers.append('access-control-expose-headers', header); + } await next(); }; }; diff --git a/packages/event-handler/tests/unit/rest/middleware/cors.test.ts b/packages/event-handler/tests/unit/rest/middleware/cors.test.ts index 989e875d31..e907eef410 100644 --- a/packages/event-handler/tests/unit/rest/middleware/cors.test.ts +++ b/packages/event-handler/tests/unit/rest/middleware/cors.test.ts @@ -1,111 +1,206 @@ -import { beforeEach, describe, expect, it } from 'vitest'; import context from '@aws-lambda-powertools/testing-utils/context'; +import { beforeEach, describe, expect, it } from 'vitest'; +import { DEFAULT_CORS_OPTIONS } from '../../../../src/rest/constants.js'; import { cors } from '../../../../src/rest/middleware/cors.js'; -import { createTestEvent, createHeaderCheckMiddleware } from '../helpers.js'; import { Router } from '../../../../src/rest/Router.js'; -import { DEFAULT_CORS_OPTIONS } from 'src/rest/constants.js'; +import { createHeaderCheckMiddleware, createTestEvent } from '../helpers.js'; describe('CORS Middleware', () => { - const getRequestEvent = createTestEvent('/test', 'GET'); - const optionsRequestEvent = createTestEvent('/test', 'OPTIONS'); + const origin = 'https://example.com'; + const getRequestEvent = createTestEvent('/test', 'GET', { + Origin: origin, + }); let app: Router; - const customCorsOptions = { - origin: 'https://example.com', - allowMethods: ['GET', 'POST'], - allowHeaders: ['Authorization', 'Content-Type'], - credentials: true, - exposeHeaders: ['Authorization', 'X-Custom-Header'], - maxAge: 86400, - }; - - const expectedDefaultHeaders = { - "access-control-allow-credentials": "false", - "access-control-allow-headers": "Authorization, Content-Type, X-Amz-Date, X-Api-Key, X-Amz-Security-Token", - "access-control-allow-methods": "DELETE, GET, HEAD, PATCH, POST, PUT", - "access-control-allow-origin": "*", - }; - beforeEach(() => { app = new Router(); app.use(cors()); }); - it('uses default configuration when no options are provided', async () => { + it('does not set CORS headers when request has no origin header', async () => { + // Prepare + app.get('/test', async () => ({ success: true })); + + // Act + const result = await app.resolve(createTestEvent('/test', 'GET'), context); + + // Assess + expect(result.headers?.['access-control-allow-origin']).toBeUndefined(); + }); + + it('does not set CORS headers when request origin does not match with allowed origin', async () => { + // Prepare + const app = new Router(); + app.get( + '/test', + [ + cors({ + origin: 'https://another-origin.com', + }), + ], + async () => ({ success: true }) + ); + + // Act + const result = await app.resolve(getRequestEvent, context); + + // Assess + expect(result.headers?.['access-control-allow-origin']).toBeUndefined(); + }); + + it('uses default CORS configuration when no options are provided', async () => { // Prepare const corsHeaders: { [key: string]: string } = {}; - app.get('/test', [createHeaderCheckMiddleware(corsHeaders)], async () => ({ success: true })); + app.get('/test', [createHeaderCheckMiddleware(corsHeaders)], async () => ({ + success: true, + })); // Act const result = await app.resolve(getRequestEvent, context); // Assess - expect(result.headers?.['access-control-allow-origin']).toEqual(DEFAULT_CORS_OPTIONS.origin); - expect(result.multiValueHeaders?.['access-control-allow-methods']).toEqual(DEFAULT_CORS_OPTIONS.allowMethods); - expect(result.multiValueHeaders?.['access-control-allow-headers']).toEqual(DEFAULT_CORS_OPTIONS.allowHeaders); - expect(result.headers?.['access-control-allow-credentials']).toEqual(DEFAULT_CORS_OPTIONS.credentials.toString()); - expect(corsHeaders).toMatchObject(expectedDefaultHeaders); + expect(result.headers?.['access-control-allow-origin']).toEqual( + DEFAULT_CORS_OPTIONS.origin + ); + expect(corsHeaders['access-control-allow-origin']).toEqual( + DEFAULT_CORS_OPTIONS.origin + ); }); - it('merges user options with defaults', async () => { + it('uses custom CORS configuration when provided', async () => { // Prepare const corsHeaders: { [key: string]: string } = {}; const app = new Router(); - app.get('/test', [cors(customCorsOptions), createHeaderCheckMiddleware(corsHeaders)], async () => ({ success: true })); + const customConfig = { + origin, + credentials: true, + exposeHeaders: ['Authorization', 'X-Custom-Header'], + }; + app.get( + '/test', + [cors(customConfig), createHeaderCheckMiddleware(corsHeaders)], + async () => ({ success: true }) + ); // Act const result = await app.resolve(getRequestEvent, context); // Assess - expect(result.headers?.['access-control-allow-origin']).toEqual('https://example.com'); - expect(result.multiValueHeaders?.['access-control-allow-methods']).toEqual(['GET', 'POST']); - expect(result.multiValueHeaders?.['access-control-allow-headers']).toEqual(['Authorization', 'Content-Type']); - expect(result.headers?.['access-control-allow-credentials']).toEqual('true'); - expect(result.multiValueHeaders?.['access-control-expose-headers']).toEqual(['Authorization', 'X-Custom-Header']); - expect(result.headers?.['access-control-max-age']).toEqual('86400'); - expect(corsHeaders).toMatchObject({ - "access-control-allow-credentials": "true", - "access-control-allow-headers": "Authorization, Content-Type", - "access-control-allow-methods": "GET, POST", - "access-control-allow-origin": "https://example.com", - }); + expect(result.headers?.['access-control-allow-origin']).toEqual(origin); + expect(result.headers?.['access-control-allow-credentials']).toEqual( + customConfig.credentials.toString() + ); + expect(result.multiValueHeaders?.['access-control-expose-headers']).toEqual( + customConfig.exposeHeaders + ); + expect(corsHeaders['access-control-allow-origin']).toEqual(origin); + expect(corsHeaders['access-control-allow-credentials']).toEqual( + customConfig.credentials.toString() + ); + expect(corsHeaders['access-control-expose-headers']).toEqual( + customConfig.exposeHeaders.join(', ') + ); }); - it.each([ - ['matching', 'https://app.com', 'https://app.com'], - ['non-matching', 'https://non-matching.com', ''] - ])('handles array origin with %s request', async (_, origin, expected) => { + it('sets the vary header if the response is dynamic based on origin', async () => { // Prepare const app = new Router(); - app.get('/test', [cors({ origin: ['https://app.com', 'https://admin.app.com'] })], async () => ({ success: true })); + app.get( + '/test', + [ + cors({ + origin: ['https://example.com', 'https://another-example.com'], + }), + ], + async () => ({ success: true }) + ); // Act - const result = await app.resolve(createTestEvent('/test', 'GET', { 'Origin': origin }), context); + const result = await app.resolve(getRequestEvent, context); // Assess - expect(result.headers?.['access-control-allow-origin']).toEqual(expected); + expect(result.headers?.['access-control-allow-origin']).toEqual(origin); + expect(result.headers?.vary).toEqual('Origin'); }); - it('handles OPTIONS preflight requests', async () => { + it('does not set CORS headers when preflight request method does not match allowed method', async () => { // Prepare - app.options('/test', async () => ({ foo: 'bar' })); + const app = new Router(); + app.use( + cors({ + allowMethods: ['POST'], + }) + ); // Act - const result = await app.resolve(createTestEvent('/test', 'OPTIONS', { 'Access-Control-Request-Method': 'GET' }), context); + const result = await app.resolve( + createTestEvent('/test', 'OPTIONS', { + Origin: origin, + 'Access-Control-Request-Method': 'GET', + }), + context + ); // Assess - expect(result.statusCode).toBe(204); + expect(result.headers?.['access-control-allow-origin']).toBeUndefined(); }); - it('calls the next middleware if the Access-Control-Request-Method is not present', async () => { + it('does not set CORS headers when preflight request header does not match allowed header', async () => { // Prepare - const corsHeaders: { [key: string]: string } = {}; - app.options('/test', [createHeaderCheckMiddleware(corsHeaders)], async () => ({ success: true })); + const app = new Router(); + app.use( + cors({ + allowHeaders: ['Content-Type'], + }) + ); + + // Act + const result = await app.resolve( + createTestEvent('/test', 'OPTIONS', { + Origin: origin, + 'Access-Control-Request-Header': 'x-test-header', + }), + context + ); + + // Assess + expect(result.headers?.['access-control-allow-origin']).toBeUndefined(); + }); + + it('handles OPTIONS preflight requests', async () => { + // Prepare + const app = new Router(); + const corsConfig = { + origin, + allowMethods: ['GET', 'POST'], + allowHeaders: ['Authorization', 'Content-Type'], + maxAge: 3600, + }; + app.use(cors(corsConfig)); // Act - await app.resolve(optionsRequestEvent, context); + const result = await app.resolve( + createTestEvent('/test', 'OPTIONS', { + Origin: origin, + 'Access-Control-Request-Method': 'GET', + 'Access-Control-Request-Headers': 'Authorization', + }), + context + ); // Assess - expect(corsHeaders).toMatchObject(expectedDefaultHeaders); + expect(result.statusCode).toBe(204); + expect(result.headers?.['access-control-allow-origin']).toEqual( + corsConfig.origin + ); + expect(result.multiValueHeaders?.['access-control-allow-methods']).toEqual( + corsConfig.allowMethods + ); + expect(result.multiValueHeaders?.['access-control-allow-headers']).toEqual( + corsConfig.allowHeaders.map((header) => header.toLowerCase()) + ); + expect(result.headers?.['access-control-max-age']).toEqual( + corsConfig.maxAge.toString() + ); }); }); From 0a16f5eff107685d7135d10629bb2b9bf2573013 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Sep 2025 15:29:48 +0100 Subject: [PATCH 174/255] chore(deps-dev): bump lint-staged from 16.1.6 to 16.2.0 (#4525) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- package-lock.json | 235 +++++++++++++++------------------------------- package.json | 2 +- 2 files changed, 79 insertions(+), 158 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9e90702086..dd8f9b3164 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "@types/node": "^24.5.2", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", - "lint-staged": "^16.1.6", + "lint-staged": "^16.2.0", "markdownlint-cli2": "^0.18.1", "middy5": "npm:@middy/core@^5.4.3", "middy6": "npm:@middy/core@^6.0.0", @@ -5683,9 +5683,9 @@ } }, "node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.0.tgz", + "integrity": "sha512-YdhtCd19sKRKfAAUsrcC1wzm4JuzJoiX4pOJqIoW2qmKj5WzG/dL8uUJ0361zaXtHqK7gEhOwtAtz7t3Yq3X5g==", "dev": true, "license": "MIT", "dependencies": { @@ -6713,26 +6713,26 @@ } }, "node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.0.tgz", + "integrity": "sha512-7JDGG+4Zp0CsknDCedl0DYdaeOhc46QNpXi3NLQblkZpXXgA6LncLDUUyvrjSvZeF3VRQa+KiMGomazQrC1V8g==", "dev": true, "license": "MIT", "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" + "slice-ansi": "^7.1.0", + "string-width": "^8.0.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -6742,35 +6742,27 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", - "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", - "dev": true, - "license": "MIT" - }, "node_modules/cli-truncate/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", + "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -6901,9 +6893,9 @@ "license": "MIT" }, "node_modules/commander": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", - "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.1.tgz", + "integrity": "sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==", "dev": true, "license": "MIT", "engines": { @@ -7476,9 +7468,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.1.tgz", - "integrity": "sha512-R1QfovbPsKmosqTnPoRFiJ7CF9MLRgb53ChvMZm+r4p76/+8yKDy17qLL2PKInORy2RkZZekuK0efYgmzTkXyQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "dev": true, "license": "MIT", "engines": { @@ -7784,13 +7776,16 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8038,18 +8033,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, "node_modules/linkify-it": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", @@ -8060,22 +8043,19 @@ } }, "node_modules/lint-staged": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.1.6.tgz", - "integrity": "sha512-U4kuulU3CKIytlkLlaHcGgKscNfJPNTiDF2avIUGFCv7K95/DCYQ7Ra62ydeRWmgQGg9zJYw2dzdbztwJlqrow==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.0.tgz", + "integrity": "sha512-spdYSOCQ2MdZ9CM1/bu/kDmaYGsrpNOeu1InFFV8uhv14x6YIubGxbCpSmGILFoxkiheNQPDXSg5Sbb5ZuVnug==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^5.6.0", - "commander": "^14.0.0", - "debug": "^4.4.1", - "lilconfig": "^3.1.3", - "listr2": "^9.0.3", - "micromatch": "^4.0.8", - "nano-spawn": "^1.0.2", - "pidtree": "^0.6.0", - "string-argv": "^0.3.2", - "yaml": "^2.8.1" + "commander": "14.0.1", + "listr2": "9.0.4", + "micromatch": "4.0.8", + "nano-spawn": "1.0.3", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.8.1" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -8087,27 +8067,14 @@ "url": "https://opencollective.com/lint-staged" } }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz", - "integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/listr2": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.3.tgz", - "integrity": "sha512-0aeh5HHHgmq1KRdMMDHfhMWQmIT/m7nRDTlxlFqni2Sp0had9baqsjJRvDGdlvgd6NmPE0nPloOipiQJGFtTHQ==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.4.tgz", + "integrity": "sha512-1wd/kpAdKRLwv7/3OKC8zZ5U8e/fajCfWMxacUvB79S5nLrYGPtUI/8chMQhn3LQjsRVErTb9i1ECAwW0ZIHnQ==", "dev": true, "license": "MIT", "dependencies": { - "cli-truncate": "^4.0.0", + "cli-truncate": "^5.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", @@ -8161,9 +8128,9 @@ } }, "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -8173,56 +8140,10 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.3.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -9075,9 +8996,9 @@ "dev": true }, "node_modules/nano-spawn": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-1.0.2.tgz", - "integrity": "sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-1.0.3.tgz", + "integrity": "sha512-jtpsQDetTnvS2Ts1fiRdci5rx0VYws5jGyC+4IYOTnIQ/wwdf6JdomlHBwqC3bJYOvaKu0C2GSZ1A60anrYpaA==", "dev": true, "license": "MIT", "engines": { @@ -9681,26 +9602,26 @@ } }, "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -10538,9 +10459,9 @@ } }, "node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { @@ -10573,9 +10494,9 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -10586,9 +10507,9 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -10624,9 +10545,9 @@ } }, "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index d6c59d5158..732b0b4f5b 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "@types/node": "^24.5.2", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", - "lint-staged": "^16.1.6", + "lint-staged": "^16.2.0", "markdownlint-cli2": "^0.18.1", "middy5": "npm:@middy/core@^5.4.3", "middy6": "npm:@middy/core@^6.0.0", From a05c07411629d1e23a9cb3fec8a78cf23bd8dd0c Mon Sep 17 00:00:00 2001 From: Swopnil Dangol Date: Mon, 22 Sep 2025 18:18:58 +0100 Subject: [PATCH 175/255] improv(event-handler): change the Middleware and RequestContext signatures (#4530) --- packages/event-handler/src/rest/Router.ts | 26 ++++---- .../src/rest/middleware/compress.ts | 6 +- .../event-handler/src/rest/middleware/cors.ts | 8 +-- packages/event-handler/src/rest/utils.ts | 17 +++--- packages/event-handler/src/types/rest.ts | 12 ++-- .../unit/rest/Router/basic-routing.test.ts | 2 +- .../tests/unit/rest/Router/decorators.test.ts | 4 +- .../unit/rest/Router/error-handling.test.ts | 2 +- .../tests/unit/rest/Router/middleware.test.ts | 37 ++++++------ .../event-handler/tests/unit/rest/helpers.ts | 18 +++--- .../tests/unit/rest/utils.test.ts | 60 ++++++++++++------- 11 files changed, 107 insertions(+), 85 deletions(-) diff --git a/packages/event-handler/src/rest/Router.ts b/packages/event-handler/src/rest/Router.ts index 0dfeeecadf..03bb209523 100644 --- a/packages/event-handler/src/rest/Router.ts +++ b/packages/event-handler/src/rest/Router.ts @@ -164,9 +164,9 @@ class Router { * * @example * ```typescript - * const authMiddleware: Middleware = async (params, reqCtx, next) => { + * const authMiddleware: Middleware = async ({ params, reqCtx, next }) => { * // Authentication logic - * if (!isAuthenticated(reqCtx.request)) { + * if (!isAuthenticated(reqCtx.req)) { * return new Response('Unauthorized', { status: 401 }); * } * await next(); @@ -215,23 +215,27 @@ class Router { }; } - const request = proxyEventToWebRequest(event); + const req = proxyEventToWebRequest(event); const requestContext: RequestContext = { event, context, - request, + req, // this response should be overwritten by the handler, if it isn't // it means something went wrong with the middleware chain res: new Response('', { status: 500 }), }; try { - const path = new URL(request.url).pathname as Path; + const path = new URL(req.url).pathname as Path; const route = this.routeRegistry.resolve(method, path); - const handlerMiddleware: Middleware = async (params, reqCtx, next) => { + const handlerMiddleware: Middleware = async ({ + params, + reqCtx, + next, + }) => { if (route === null) { const notFoundRes = await this.handleError( new NotFoundError(`Route ${path} for method ${method} not found`), @@ -263,11 +267,11 @@ class Router { handlerMiddleware, ]); - const middlewareResult = await middleware( - route?.params ?? {}, - requestContext, - () => Promise.resolve() - ); + const middlewareResult = await middleware({ + params: route?.params ?? {}, + reqCtx: requestContext, + next: () => Promise.resolve(), + }); // middleware result takes precedence to allow short-circuiting const result = middlewareResult ?? requestContext.res; diff --git a/packages/event-handler/src/rest/middleware/compress.ts b/packages/event-handler/src/rest/middleware/compress.ts index 70bffebd30..bb11c02685 100644 --- a/packages/event-handler/src/rest/middleware/compress.ts +++ b/packages/event-handler/src/rest/middleware/compress.ts @@ -67,12 +67,10 @@ const compress = (options?: CompressionOptions): Middleware => { const threshold = options?.threshold ?? DEFAULT_COMPRESSION_RESPONSE_THRESHOLD; - return async (_, reqCtx, next) => { + return async ({ reqCtx, next }) => { await next(); - if ( - !shouldCompress(reqCtx.request, reqCtx.res, preferredEncoding, threshold) - ) { + if (!shouldCompress(reqCtx.req, reqCtx.res, preferredEncoding, threshold)) { return; } diff --git a/packages/event-handler/src/rest/middleware/cors.ts b/packages/event-handler/src/rest/middleware/cors.ts index 983f805530..a1ac697bfb 100644 --- a/packages/event-handler/src/rest/middleware/cors.ts +++ b/packages/event-handler/src/rest/middleware/cors.ts @@ -96,16 +96,16 @@ export const cors = (options?: CorsOptions): Middleware => { } }; - return async (_params, reqCtx, next) => { - const requestOrigin = reqCtx.request.headers.get('Origin'); + return async ({ reqCtx, next }) => { + const requestOrigin = reqCtx.req.headers.get('Origin'); if (!isOriginAllowed(requestOrigin)) { await next(); return; } // Handle preflight OPTIONS request - if (reqCtx.request.method === HttpVerbs.OPTIONS) { - if (!isValidPreflightRequest(reqCtx.request.headers)) { + if (reqCtx.req.method === HttpVerbs.OPTIONS) { + if (!isValidPreflightRequest(reqCtx.req.headers)) { await next(); return; } diff --git a/packages/event-handler/src/rest/utils.ts b/packages/event-handler/src/rest/utils.ts index 1fb3d5df96..792b85854b 100644 --- a/packages/event-handler/src/rest/utils.ts +++ b/packages/event-handler/src/rest/utils.ts @@ -6,7 +6,6 @@ import type { HttpMethod, Middleware, Path, - RequestContext, ValidationResult, } from '../types/rest.js'; import { @@ -129,13 +128,13 @@ export const isAPIGatewayProxyResult = ( * * @example * ```typescript - * const middleware1: Middleware = async (params, options, next) => { + * const middleware1: Middleware = async ({params, options, next}) => { * console.log('middleware1 start'); * await next(); * console.log('middleware1 end'); * }; * - * const middleware2: Middleware = async (params, options, next) => { + * const middleware2: Middleware = async ({params, options, next}) => { * console.log('middleware2 start'); * await next(); * console.log('middleware2 end'); @@ -151,11 +150,7 @@ export const isAPIGatewayProxyResult = ( * ``` */ export const composeMiddleware = (middleware: Middleware[]): Middleware => { - return async ( - params: Record, - reqCtx: RequestContext, - next: () => Promise - ): Promise => { + return async ({ params, reqCtx, next }): Promise => { let index = -1; let result: HandlerResponse | undefined; @@ -181,7 +176,11 @@ export const composeMiddleware = (middleware: Middleware[]): Middleware => { return result; }; - const middlewareResult = await middlewareFn(params, reqCtx, nextFn); + const middlewareResult = await middlewareFn({ + params, + reqCtx, + next: nextFn, + }); if (nextPromise && !nextAwaited && i < middleware.length - 1) { throw new Error( diff --git a/packages/event-handler/src/types/rest.ts b/packages/event-handler/src/types/rest.ts index 0b660330bd..d59b174a80 100644 --- a/packages/event-handler/src/types/rest.ts +++ b/packages/event-handler/src/types/rest.ts @@ -15,7 +15,7 @@ type ErrorResponse = { }; type RequestContext = { - request: Request; + req: Request; event: APIGatewayProxyEvent; context: Context; res: Response; @@ -86,11 +86,11 @@ type RestRouteOptions = { type NextFunction = () => Promise; -type Middleware = ( - params: Record, - reqCtx: RequestContext, - next: NextFunction -) => Promise; +type Middleware = (args: { + params: Record; + reqCtx: RequestContext; + next: NextFunction; +}) => Promise; type RouteRegistryOptions = { /** diff --git a/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts b/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts index b983b4ed2b..f2be005e58 100644 --- a/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts @@ -91,7 +91,7 @@ describe('Class: Router - Basic Routing', () => { app.get('/test', async (_params, reqCtx) => { return { - hasRequest: reqCtx.request instanceof Request, + hasRequest: reqCtx.req instanceof Request, hasEvent: reqCtx.event === testEvent, hasContext: reqCtx.context === context, }; diff --git a/packages/event-handler/tests/unit/rest/Router/decorators.test.ts b/packages/event-handler/tests/unit/rest/Router/decorators.test.ts index 07cae4b0f2..3510516bc0 100644 --- a/packages/event-handler/tests/unit/rest/Router/decorators.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/decorators.test.ts @@ -400,7 +400,7 @@ describe('Class: Router - Decorators', () => { @app.get('/test') public async getTest(_params: any, reqCtx: any) { return { - hasRequest: reqCtx.request instanceof Request, + hasRequest: reqCtx.req instanceof Request, hasEvent: reqCtx.event === testEvent, hasContext: reqCtx.context === context, }; @@ -435,7 +435,7 @@ describe('Class: Router - Decorators', () => { statusCode: HttpErrorCodes.BAD_REQUEST, error: 'Bad Request', message: error.message, - hasRequest: reqCtx.request instanceof Request, + hasRequest: reqCtx.req instanceof Request, hasEvent: reqCtx.event === testEvent, hasContext: reqCtx.context === context, }; diff --git a/packages/event-handler/tests/unit/rest/Router/error-handling.test.ts b/packages/event-handler/tests/unit/rest/Router/error-handling.test.ts index bd6c924039..d18778bcb0 100644 --- a/packages/event-handler/tests/unit/rest/Router/error-handling.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/error-handling.test.ts @@ -375,7 +375,7 @@ describe('Class: Router - Error Handling', () => { statusCode: HttpErrorCodes.BAD_REQUEST, error: 'Bad Request', message: error.message, - hasRequest: reqCtx.request instanceof Request, + hasRequest: reqCtx.req instanceof Request, hasEvent: reqCtx.event === testEvent, hasContext: reqCtx.context === context, })); diff --git a/packages/event-handler/tests/unit/rest/Router/middleware.test.ts b/packages/event-handler/tests/unit/rest/Router/middleware.test.ts index 9561e1eb18..c87d247aa9 100644 --- a/packages/event-handler/tests/unit/rest/Router/middleware.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/middleware.test.ts @@ -44,16 +44,17 @@ describe('Class: Router - Middleware', () => { const app = new Router(); const executionOrder: string[] = []; - app.use(async (_params, _reqCtx, next) => { + app.use(async ({ next }) => { executionOrder.push('global-middleware'); await next(); }); const middleware: Middleware[] = middlewareNames.map( - (name) => async (_params, _reqCtx, next) => { - executionOrder.push(name); - await next(); - } + (name) => + async ({ next }) => { + executionOrder.push(name); + await next(); + } ); app.get(path as Path, middleware, async () => { @@ -137,7 +138,7 @@ describe('Class: Router - Middleware', () => { let middlewareParams: Record | undefined; let middlewareOptions: RequestContext | undefined; - app.use(async (params, reqCtx, next) => { + app.use(async ({ params, reqCtx, next }) => { middlewareParams = params; middlewareOptions = reqCtx; await next(); @@ -153,7 +154,7 @@ describe('Class: Router - Middleware', () => { expect(middlewareParams).toEqual({ id: '123' }); expect(middlewareOptions?.event).toBe(testEvent); expect(middlewareOptions?.context).toBe(context); - expect(middlewareOptions?.request).toBeInstanceOf(Request); + expect(middlewareOptions?.req).toBeInstanceOf(Request); }); it('returns error response when next() is called multiple times', async () => { @@ -161,7 +162,7 @@ describe('Class: Router - Middleware', () => { vi.stubEnv('POWERTOOLS_DEV', 'true'); const app = new Router(); - app.use(async (_params, _reqCtx, next) => { + app.use(async ({ next }) => { await next(); await next(); }); @@ -185,11 +186,11 @@ describe('Class: Router - Middleware', () => { vi.stubEnv('POWERTOOLS_DEV', 'true'); const app = new Router(); - app.use(async (_params, _reqCtx, next) => { + app.use(async ({ next }) => { await next(); }); - app.use(async (_params, _reqCtx, next) => { + app.use(async ({ next }) => { next(); }); @@ -241,7 +242,7 @@ describe('Class: Router - Middleware', () => { const app = new Router(); const executionOrder: string[] = []; - app.use(async (_params, _reqCtx, next) => { + app.use(async ({ next }) => { executionOrder.push('middleware1-start'); await next(); executionOrder.push('middleware1-end'); @@ -362,7 +363,7 @@ describe('Class: Router - Middleware', () => { // Prepare const app = new Router(); - app.use(async (_params, reqCtx, next) => { + app.use(async ({ reqCtx, next }) => { await next(); reqCtx.res.headers.set('x-custom-header', 'middleware-value'); reqCtx.res.headers.set('x-request-id', '12345'); @@ -393,7 +394,7 @@ describe('Class: Router - Middleware', () => { // Prepare const app = new Router(); - app.use(async (_params, reqCtx, next) => { + app.use(async ({ reqCtx, next }) => { await next(); const originalBody = await reqCtx.res.text(); reqCtx.res = new Response(`Modified: ${originalBody}`, { @@ -422,7 +423,7 @@ describe('Class: Router - Middleware', () => { // Prepare const app = new Router(); - app.use(async (_params, reqCtx, next) => { + app.use(async ({ reqCtx, next }) => { reqCtx.res.headers.set('x-before-handler', 'middleware-value'); await next(); }); @@ -451,7 +452,7 @@ describe('Class: Router - Middleware', () => { // Prepare const app = new Router(); - app.use(async (_params, reqCtx, next) => { + app.use(async ({ reqCtx, next }) => { reqCtx.res.headers.set('x-before-handler', 'middleware-value'); await next(); }); @@ -478,12 +479,12 @@ describe('Class: Router - Middleware', () => { // Prepare const app = new Router(); - app.use(async (_params, reqCtx, next) => { + app.use(async ({ reqCtx, next }) => { reqCtx.res.headers.set('x-test-header', 'before-next'); await next(); }); - app.use(async (_params, reqCtx, next) => { + app.use(async ({ reqCtx, next }) => { await next(); reqCtx.res.headers.set('x-test-header', 'after-next'); }); @@ -531,7 +532,7 @@ describe('Class: Router - Middleware', () => { const app = new Router(); const executionOrder: string[] = []; - app.use(async (_params, _reqCtx, next) => { + app.use(async ({ next }) => { executionOrder.push('middleware-start'); await next(); executionOrder.push('middleware-end'); diff --git a/packages/event-handler/tests/unit/rest/helpers.ts b/packages/event-handler/tests/unit/rest/helpers.ts index 6edd2c4678..960fe2c437 100644 --- a/packages/event-handler/tests/unit/rest/helpers.ts +++ b/packages/event-handler/tests/unit/rest/helpers.ts @@ -28,7 +28,7 @@ export const createTrackingMiddleware = ( name: string, executionOrder: string[] ): Middleware => { - return async (_params, _options, next) => { + return async ({ next }) => { executionOrder.push(`${name}-start`); await next(); executionOrder.push(`${name}-end`); @@ -40,7 +40,7 @@ export const createThrowingMiddleware = ( executionOrder: string[], errorMessage: string ): Middleware => { - return async (_params, _options, _next) => { + return async () => { executionOrder.push(name); throw new Error(errorMessage); }; @@ -51,7 +51,7 @@ export const createReturningMiddleware = ( executionOrder: string[], response: any ): Middleware => { - return async (_params, _options, _next) => { + return async () => { executionOrder.push(name); return response; }; @@ -61,7 +61,7 @@ export const createNoNextMiddleware = ( name: string, executionOrder: string[] ): Middleware => { - return async (_params, _options, _next) => { + return async () => { executionOrder.push(name); // Intentionally doesn't call next() }; @@ -70,10 +70,10 @@ export const createNoNextMiddleware = ( export const createSettingHeadersMiddleware = (headers: { [key: string]: string; }): Middleware => { - return async (_params, options, next) => { + return async ({ reqCtx, next }) => { await next(); Object.entries(headers).forEach(([key, value]) => { - options.res.headers.set(key, value); + reqCtx.res.headers.set(key, value); }); }; }; @@ -81,10 +81,10 @@ export const createSettingHeadersMiddleware = (headers: { export const createHeaderCheckMiddleware = (headers: { [key: string]: string; }): Middleware => { - return async (_params, options, next) => { - options.res.headers.forEach((value, key) => { + return async ({ reqCtx, next }) => { + reqCtx.res.headers.forEach((value, key) => { headers[key] = value; }); await next(); }; -}; \ No newline at end of file +}; diff --git a/packages/event-handler/tests/unit/rest/utils.test.ts b/packages/event-handler/tests/unit/rest/utils.test.ts index 7a85d700af..db8308cd63 100644 --- a/packages/event-handler/tests/unit/rest/utils.test.ts +++ b/packages/event-handler/tests/unit/rest/utils.test.ts @@ -449,12 +449,12 @@ describe('Path Utilities', () => { it('executes middleware in order', async () => { const executionOrder: string[] = []; const middleware: Middleware[] = [ - async (_params, _reqCtx, next) => { + async ({ next }) => { executionOrder.push('middleware1-start'); await next(); executionOrder.push('middleware1-end'); }, - async (_params, _reqCtx, next) => { + async ({ next }) => { executionOrder.push('middleware2-start'); await next(); executionOrder.push('middleware2-end'); @@ -462,8 +462,12 @@ describe('Path Utilities', () => { ]; const composed = composeMiddleware(middleware); - await composed({}, mockOptions, async () => { - executionOrder.push('handler'); + await composed({ + params: {}, + reqCtx: mockOptions, + next: async () => { + executionOrder.push('handler'); + }, }); expect(executionOrder).toEqual([ @@ -477,17 +481,21 @@ describe('Path Utilities', () => { it('returns result from middleware that short-circuits', async () => { const middleware: Middleware[] = [ - async (_params, _reqCtx, next) => { + async ({ next }) => { await next(); }, - async (_params, _reqCtx, _next) => { + async () => { return { shortCircuit: true }; }, ]; const composed = composeMiddleware(middleware); - const result = await composed({}, mockOptions, async () => { - return { handler: true }; + const result = await composed({ + params: {}, + reqCtx: mockOptions, + next: async () => { + return { handler: true }; + }, }); expect(result).toEqual({ shortCircuit: true }); @@ -495,14 +503,18 @@ describe('Path Utilities', () => { it('returns result from next function when middleware does not return', async () => { const middleware: Middleware[] = [ - async (_params, _reqCtx, next) => { + async ({ next }) => { await next(); }, ]; const composed = composeMiddleware(middleware); - const result = await composed({}, mockOptions, async () => { - return { handler: true }; + const result = await composed({ + params: {}, + reqCtx: mockOptions, + next: async () => { + return { handler: true }; + }, }); expect(result).toEqual({ handler: true }); @@ -510,7 +522,7 @@ describe('Path Utilities', () => { it('throws error when next() is called multiple times', async () => { const middleware: Middleware[] = [ - async (_params, _reqCtx, next) => { + async ({ next }) => { await next(); await next(); }, @@ -518,15 +530,19 @@ describe('Path Utilities', () => { const composed = composeMiddleware(middleware); - await expect(composed({}, mockOptions, async () => {})).rejects.toThrow( - 'next() called multiple times' - ); + await expect( + composed({ params: {}, reqCtx: mockOptions, next: async () => {} }) + ).rejects.toThrow('next() called multiple times'); }); it('handles empty middleware array', async () => { const composed = composeMiddleware([]); - const result = await composed({}, mockOptions, async () => { - return { handler: true }; + const result = await composed({ + params: {}, + reqCtx: mockOptions, + next: async () => { + return { handler: true }; + }, }); expect(result).toEqual({ handler: true }); @@ -534,14 +550,18 @@ describe('Path Utilities', () => { it('returns undefined when next function returns undefined', async () => { const middleware: Middleware[] = [ - async (_params, _reqCtx, next) => { + async ({ next }) => { await next(); }, ]; const composed = composeMiddleware(middleware); - const result = await composed({}, mockOptions, async () => { - return undefined; + const result = await composed({ + params: {}, + reqCtx: mockOptions, + next: async () => { + return undefined; + }, }); expect(result).toBeUndefined(); From 7ea49c7dbc84d48da6ca214e367a5c612c583cc9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Sep 2025 20:19:28 +0100 Subject: [PATCH 176/255] chore(deps): bump the aws-sdk-v3 group across 1 directory with 62 updates (#4526) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Swopnil Dangol --- examples/app/package.json | 4 +- examples/snippets/package.json | 10 +- package-lock.json | 1873 +++++++++++++++-------------- packages/idempotency/package.json | 4 +- packages/metrics/package.json | 2 +- packages/parameters/package.json | 10 +- packages/testing/package.json | 2 +- packages/tracer/package.json | 4 +- 8 files changed, 955 insertions(+), 954 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index b8784a9eaf..9949ae959c 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -44,8 +44,8 @@ "@aws-lambda-powertools/metrics": "^2.26.1", "@aws-lambda-powertools/parameters": "^2.26.1", "@aws-lambda-powertools/tracer": "^2.26.1", - "@aws-sdk/client-ssm": "^3.888.0", - "@aws-sdk/lib-dynamodb": "^3.888.0", + "@aws-sdk/client-ssm": "^3.893.0", + "@aws-sdk/lib-dynamodb": "^3.893.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", "@types/node": "24.5.2", diff --git a/examples/snippets/package.json b/examples/snippets/package.json index 78c6dc8b22..13215c6871 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -33,11 +33,11 @@ "@aws-lambda-powertools/parameters": "^2.26.1", "@aws-lambda-powertools/parser": "^2.26.1", "@aws-lambda-powertools/tracer": "^2.26.1", - "@aws-sdk/client-appconfigdata": "^3.888.0", - "@aws-sdk/client-dynamodb": "^3.888.0", - "@aws-sdk/client-secrets-manager": "^3.888.0", - "@aws-sdk/client-ssm": "^3.888.0", - "@aws-sdk/util-dynamodb": "^3.888.0", + "@aws-sdk/client-appconfigdata": "^3.893.0", + "@aws-sdk/client-dynamodb": "^3.893.0", + "@aws-sdk/client-secrets-manager": "^3.893.0", + "@aws-sdk/client-ssm": "^3.893.0", + "@aws-sdk/util-dynamodb": "^3.893.0", "@middy/core": "^4.7.0", "@redis/client": "^5.8.2", "@valkey/valkey-glide": "^2.1.0", diff --git a/package-lock.json b/package-lock.json index dd8f9b3164..db072ab500 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,8 +56,8 @@ "@aws-lambda-powertools/metrics": "^2.26.1", "@aws-lambda-powertools/parameters": "^2.26.1", "@aws-lambda-powertools/tracer": "^2.26.1", - "@aws-sdk/client-ssm": "^3.888.0", - "@aws-sdk/lib-dynamodb": "^3.888.0", + "@aws-sdk/client-ssm": "^3.893.0", + "@aws-sdk/lib-dynamodb": "^3.893.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", "@types/node": "24.5.2", @@ -95,11 +95,11 @@ "@aws-lambda-powertools/parameters": "^2.26.1", "@aws-lambda-powertools/parser": "^2.26.1", "@aws-lambda-powertools/tracer": "^2.26.1", - "@aws-sdk/client-appconfigdata": "^3.888.0", - "@aws-sdk/client-dynamodb": "^3.888.0", - "@aws-sdk/client-secrets-manager": "^3.888.0", - "@aws-sdk/client-ssm": "^3.888.0", - "@aws-sdk/util-dynamodb": "^3.888.0", + "@aws-sdk/client-appconfigdata": "^3.893.0", + "@aws-sdk/client-dynamodb": "^3.893.0", + "@aws-sdk/client-secrets-manager": "^3.893.0", + "@aws-sdk/client-ssm": "^3.893.0", + "@aws-sdk/util-dynamodb": "^3.893.0", "@middy/core": "^4.7.0", "@redis/client": "^5.8.2", "@valkey/valkey-glide": "^2.1.0", @@ -874,50 +874,50 @@ "link": true }, "node_modules/@aws-sdk/client-appconfigdata": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.888.0.tgz", - "integrity": "sha512-b4yc9Tl2TVZV8ZYpFLkCp7QTSyN4l+802Ehd33OKLiliq9j+s+eNL9X6y9uSF9mDHvsyAy3+gDbls3DrqIFjcQ==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.893.0.tgz", + "integrity": "sha512-u2+rbcmDAooQp8gzMlJIAvFE5Ea2ZVBzj7SZJzJJ4bWmCushAm/tN5EyI5COYKxnfEZcSqBaQLKzwNS/0NDXkw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", - "@smithy/util-stream": "^4.3.1", + "@smithy/util-retry": "^4.1.2", + "@smithy/util-stream": "^4.3.2", "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, @@ -926,49 +926,49 @@ } }, "node_modules/@aws-sdk/client-appsync": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-appsync/-/client-appsync-3.888.0.tgz", - "integrity": "sha512-MFZtS7oBrA5TiVMYIj07cPj3n+Yl9NGSLlP5nnTgNwt+qCiVe6RRccI1p4w8vX6omHHOTsJHEOz53gLNj2zb8w==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appsync/-/client-appsync-3.893.0.tgz", + "integrity": "sha512-/5RLLWv1TDJFcyzAPznfOARVhQLvA7gJ6oEa9l+7RdmPQ37gTdsT/XmvE3atOaA0J16Z87a+HqOjeWK4vh1KyA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", - "@smithy/util-stream": "^4.3.1", + "@smithy/util-retry": "^4.1.2", + "@smithy/util-stream": "^4.3.2", "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, @@ -977,48 +977,48 @@ } }, "node_modules/@aws-sdk/client-cloudcontrol": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudcontrol/-/client-cloudcontrol-3.888.0.tgz", - "integrity": "sha512-BsQPotE/AsbK8QBteOpXhDeFrKjBDMdbradrA845o06t7OyU8rl+eF7oB8asdj/7/1dK3xgpIVwmKtir7TDJdg==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudcontrol/-/client-cloudcontrol-3.893.0.tgz", + "integrity": "sha512-RjE8sl6nN9CLA7v2Gkm79GxpX9Uk5tf5KE/YcLWOeC63+1zF8jRpK/SNzbCmRUsEP9KA141UcF3FqxbMC46grA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", "@smithy/util-waiter": "^4.1.1", "@types/uuid": "^9.0.1", @@ -1030,48 +1030,48 @@ } }, "node_modules/@aws-sdk/client-cloudformation": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.888.0.tgz", - "integrity": "sha512-49Ve6lTSdG6oY+62s2m5or/SZOFJqZPm5r+Y/eS6XbX/sBdlHPxVvuBMI98J2zCR/bYagQ2jnWZVQwwDevMdmw==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.893.0.tgz", + "integrity": "sha512-6um0kN8bNfA55gmG7ag85BRqhLWp40Du+KJgErwSwW0v66pXnuQ4Gny6VuAQrEIMQTfaOR30uMhZKRcRvQULQA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", "@smithy/util-waiter": "^4.1.1", "@types/uuid": "^9.0.1", @@ -1083,50 +1083,50 @@ } }, "node_modules/@aws-sdk/client-cloudwatch": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.888.0.tgz", - "integrity": "sha512-HfoIHfFtDAQLddROW1Tx9X6e3x2mzKTOBQRM5eAC2ARfSVqaiPUkqMI2GGQgyKLBptO8oui0G3wyfoZHP3HYeQ==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.893.0.tgz", + "integrity": "sha512-UlyZmcseKIY9RmMLxyi86RLPGnbe0bY+M6w1TLtpzIzglNmid3n15EaO/JCe/5+tYUFp+6BxdXuyEEmM/eOBKA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", - "@smithy/middleware-compression": "^4.2.1", + "@smithy/middleware-compression": "^4.2.3", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", "@smithy/util-waiter": "^4.1.1", "tslib": "^2.6.2" @@ -1136,26 +1136,26 @@ } }, "node_modules/@aws-sdk/client-cloudwatch-logs": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.888.0.tgz", - "integrity": "sha512-eBuxqt6ltF5DLMw7jkGlqiS1MrAY90GCmXwKfUMSqqptBRSmD/0ytCIa1cphWxgHiouEuv4m53ofUHKxZ5xqVA==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.893.0.tgz", + "integrity": "sha512-US6nrUpWER+yxIVL6aa6CZnozwdzavWwEzTuSeHpBlbyHhgyA2/6E1wiqC+J6M97S1dAks0AA56tmz1uD+mTYw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/eventstream-serde-browser": "^4.1.1", "@smithy/eventstream-serde-config-resolver": "^4.2.1", "@smithy/eventstream-serde-node": "^4.1.1", @@ -1163,24 +1163,24 @@ "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", @@ -1191,48 +1191,48 @@ } }, "node_modules/@aws-sdk/client-codebuild": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-codebuild/-/client-codebuild-3.888.0.tgz", - "integrity": "sha512-8Vxg+vbPLtRTSCKGhUvsm3WJsQdGK2I/RLBhU7GlzA6YsXD5eamX5m7zMNSpYcj1ZhiU56XOQbj9tfO9o/lbuQ==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-codebuild/-/client-codebuild-3.893.0.tgz", + "integrity": "sha512-kuH1aYHAnjnJ2W8MeFb3m3hD4j+aD2b/36Dymt9cJftpi1J5cLMmqUQv5psyJjSOQbybEk9kmjn3lgjGkD7kPg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, @@ -1241,48 +1241,48 @@ } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.888.0.tgz", - "integrity": "sha512-FsHdPF9iXnCGp3oOsEl1EHR0pc0sw0emlhG67QxfMj4imPwspsypTaPslkILe+0aAwKYW64i7J9Vd4JCQKVxgQ==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.893.0.tgz", + "integrity": "sha512-oK9ntzYAHgRtQzLD6k+je9mSfNCVeDOQr9QODVPnSw/wri0hgY5joqUVUCVpLdPmtDoG38iQ3iaOYiRUVQadkg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, @@ -1291,49 +1291,49 @@ } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.888.0.tgz", - "integrity": "sha512-AjR+L/EK+HvPwj1AshKcFgNVQxYF2zsRRKaxU3gYxSpDpkIIlSz+GuM0MShPGgZocRTI80K3b9D3eFWHlI1Hqg==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.893.0.tgz", + "integrity": "sha512-rojJDqmrpzwVfcE+EZ1Q1dnSWhHZQYwk9GinsvvnQNDCrARMyH+Q24jSLXk9rKSiY9UUj0P5o3kH2RdCOS3rGw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-endpoint-discovery": "3.887.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-endpoint-discovery": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", "@smithy/util-waiter": "^4.1.1", "@types/uuid": "^9.0.1", @@ -1345,49 +1345,49 @@ } }, "node_modules/@aws-sdk/client-ec2": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ec2/-/client-ec2-3.888.0.tgz", - "integrity": "sha512-HAACb5sxpnZi+E6xDxUI24JdooVp51e23sNfr90dOlRdZ9H1wDkKCM0Gaiig0Nvf+x+/tcKaCMK1nxsTVEaq+Q==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ec2/-/client-ec2-3.893.0.tgz", + "integrity": "sha512-VsHvXWUH20xKvEKRKJhLFhyRidh7OxFbXwvwZRioMCh1PDr18eXCDQ5Oq4qJpmsyUdqenytnF4gf9bfkaeqGJw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-sdk-ec2": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-sdk-ec2": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", "@smithy/util-waiter": "^4.1.1", "@types/uuid": "^9.0.1", @@ -1399,48 +1399,48 @@ } }, "node_modules/@aws-sdk/client-ecr": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.888.0.tgz", - "integrity": "sha512-WErHOnnH0Z5zvbOBohHIpNoQq6wKLChrrAG1YMQrplKn3owlLBlVxidNWyzpd+pu+3XHN/yGItQ0qn7gC7yBGg==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.893.0.tgz", + "integrity": "sha512-gtnkWt01vZEHfrER573RcEzsLLX8ufEmepggk3OXlZ0UaotUF8yoMUT+Vom5YLIE7cfY+6pN82PgNd+52Ue3DQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", "@smithy/util-waiter": "^4.1.1", "tslib": "^2.6.2" @@ -1450,48 +1450,48 @@ } }, "node_modules/@aws-sdk/client-ecs": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecs/-/client-ecs-3.888.0.tgz", - "integrity": "sha512-mj1yI5/eVkofd5kt1GtKukFG5QFlFMI4V+TgXJf62vAVCGCUTlJCUxLovfuORi5WPiN1d91Eco2NHG2qMv8fqA==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecs/-/client-ecs-3.893.0.tgz", + "integrity": "sha512-5EHP/znlKVR266L8xSd/o04sYvoJ/1qzUsyjtj8rQL+IMC/rSYsXO1FN3N4Tt9iiNlHJsYcOxz9sLHV/RAvYrg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", "@smithy/util-waiter": "^4.1.1", "@types/uuid": "^9.0.1", @@ -1503,48 +1503,48 @@ } }, "node_modules/@aws-sdk/client-elastic-load-balancing-v2": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-elastic-load-balancing-v2/-/client-elastic-load-balancing-v2-3.888.0.tgz", - "integrity": "sha512-qW3SHLNkASfbv2Xma5PYSYWMuGv0t328Jic3Rc1Gjek50nvQ9LTq3I+ka5szH+p2fIhQHtJ9Xu1+lbkRrLruZw==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-elastic-load-balancing-v2/-/client-elastic-load-balancing-v2-3.893.0.tgz", + "integrity": "sha512-T1WmHs8FKOqDRT8T+WEwFZA/03x5w9PR3WLxf95CgwvigQVQcGwUPxRNbBP/xUZ1LLyGFwqlajmvwNo7sqBXeg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", "@smithy/util-waiter": "^4.1.1", "tslib": "^2.6.2" @@ -1554,48 +1554,48 @@ } }, "node_modules/@aws-sdk/client-iam": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-iam/-/client-iam-3.888.0.tgz", - "integrity": "sha512-BYJVOji9jrYcOiUsWspS94viNK0XCGb7QyLcHc4cyq2BXqTy3HXINnPtk+xHvep1LqRaIuyfIOGlmIKKsJ1tGA==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-iam/-/client-iam-3.893.0.tgz", + "integrity": "sha512-izChkooyT0BsvsNJkLrHwRkU/I6i+p5cmaLIzqC6g1t74RXBzq7KZTabryXQQ61++n6QVeiRurE2eCQoRNoaCg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", "@smithy/util-waiter": "^4.1.1", "tslib": "^2.6.2" @@ -1605,48 +1605,48 @@ } }, "node_modules/@aws-sdk/client-kms": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.888.0.tgz", - "integrity": "sha512-VVwBRy6rCQDiku1Da3ilnENxdI6Et1jVqVSLuWlAfwtnRUdZrTM7iMMmenMXMfhT85lyXAZL171aHW8IHys0Dg==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.893.0.tgz", + "integrity": "sha512-qHHfyqdBTxJVuKQxOhB0QtN5pBsKt44LWY+4DV6o6GrgpUecrMDtBV7WDagfo7W1sdYEggDdyeExKAzyAinm8g==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, @@ -1655,26 +1655,26 @@ } }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.888.0.tgz", - "integrity": "sha512-5s3S+2E2jnyRnX/u5Dp4TCFANVcCKnUuvVLUc0jS9peUAPJLeE4ZfksC2XmWha3ZwInE/7XU2j7maPbM/BinkA==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.893.0.tgz", + "integrity": "sha512-mhu6KfOJtfuAUjtzT/6mEX3LJWqD4e8u+No5a+uyECfOE795lgOBege999A4GrEci3gIIBalAT2bHy66oUp65Q==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/eventstream-serde-browser": "^4.1.1", "@smithy/eventstream-serde-config-resolver": "^4.2.1", "@smithy/eventstream-serde-node": "^4.1.1", @@ -1682,25 +1682,25 @@ "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", - "@smithy/util-stream": "^4.3.1", + "@smithy/util-retry": "^4.1.2", + "@smithy/util-stream": "^4.3.2", "@smithy/util-utf8": "^4.1.0", "@smithy/util-waiter": "^4.1.1", "tslib": "^2.6.2" @@ -1710,50 +1710,50 @@ } }, "node_modules/@aws-sdk/client-route-53": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-route-53/-/client-route-53-3.888.0.tgz", - "integrity": "sha512-rYtv3m2cwYvu4o2pCxUNLtaHYKBs36FUZMeJat3hXLtENjJWj0yHUIHGcGY43ZpHyMhSxggWSrB8Rv3pEWcy+w==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-route-53/-/client-route-53-3.893.0.tgz", + "integrity": "sha512-VWclo9j4F4tLtPcH9bMjBdLy5G6hOOPkitWTIkE8WluYccL7dD7d+szUPM7eAJQDiTpyNI+qWI/fDqjrTrORGQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-sdk-route53": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@aws-sdk/xml-builder": "3.887.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-sdk-route53": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/xml-builder": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", "@smithy/util-waiter": "^4.1.1", "tslib": "^2.6.2" @@ -1763,35 +1763,35 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.888.0.tgz", - "integrity": "sha512-MgYyF/qpvCMYVSiOpRJ5C/EtdFxuYAeF5SprtMsbf71xBiiCH5GurB616i+ZxJqHlfhBQTTvR0qugnWvk1Wqvw==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.893.0.tgz", + "integrity": "sha512-/P74KDJhOijnIAQR93sq1DQn8vbU3WaPZDyy1XUMRJJIY6iEJnDo1toD9XY6AFDz5TRto8/8NbcXT30AMOUtJQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-bucket-endpoint": "3.887.0", - "@aws-sdk/middleware-expect-continue": "3.887.0", - "@aws-sdk/middleware-flexible-checksums": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-location-constraint": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-sdk-s3": "3.888.0", - "@aws-sdk/middleware-ssec": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/signature-v4-multi-region": "3.888.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@aws-sdk/xml-builder": "3.887.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-bucket-endpoint": "3.893.0", + "@aws-sdk/middleware-expect-continue": "3.893.0", + "@aws-sdk/middleware-flexible-checksums": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-location-constraint": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-sdk-s3": "3.893.0", + "@aws-sdk/middleware-ssec": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/signature-v4-multi-region": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/xml-builder": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/eventstream-serde-browser": "^4.1.1", "@smithy/eventstream-serde-config-resolver": "^4.2.1", "@smithy/eventstream-serde-node": "^4.1.1", @@ -1802,25 +1802,25 @@ "@smithy/invalid-dependency": "^4.1.1", "@smithy/md5-js": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", - "@smithy/util-stream": "^4.3.1", + "@smithy/util-retry": "^4.1.2", + "@smithy/util-stream": "^4.3.2", "@smithy/util-utf8": "^4.1.0", "@smithy/util-waiter": "^4.1.1", "@types/uuid": "^9.0.1", @@ -1832,48 +1832,48 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.888.0.tgz", - "integrity": "sha512-6BQMysniH1VQF/EMMLC6Wp4VlbEu+VXOn3fJAebeQaWKZlwhrelxo4v+OsHPAWgwgycyVfAyBEcLO68lK0lB5w==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.893.0.tgz", + "integrity": "sha512-apbUdDawlhr9QpbzCyGR0T0mMEPOFtjm6B+1ZqxJBYS+WiyyIy+c5DYQkmylayeubXAJfA9QGyWPZaUp/XE8fA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", @@ -1884,48 +1884,48 @@ } }, "node_modules/@aws-sdk/client-sfn": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sfn/-/client-sfn-3.888.0.tgz", - "integrity": "sha512-YSQyCtsorjTIdsLAiA4GsWweBm1AaQ+vAwpGrmFkHSxvmsQyY1wZzsgC69IfrIGaSfDkOm67VhPGBjB97eTmvA==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sfn/-/client-sfn-3.893.0.tgz", + "integrity": "sha512-jhMD0AO7FsCML1niDQK80mmaIFx5RVtugswz1+1/pwe2ORckLQo/hUkXXc15nEgD9M8HJAUjkgE/7c8PDq037w==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", @@ -1936,48 +1936,48 @@ } }, "node_modules/@aws-sdk/client-ssm": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.888.0.tgz", - "integrity": "sha512-QnyKY3ikZtd0aw2lAMFs4uE24BkdMgyYQGil74xu0essW0aMBaw4c+XxTcmwKfXsMt1rBYQmjtwQsIXJXwy1Bw==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.893.0.tgz", + "integrity": "sha512-Z+M7pYozeGQhtmgD2yuWoHYLw4aJulxHZ5G991hdIEMPcx9/huuwnVVSTlRX3cI6ALLvihjaMvLlxdkf7StfCg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", "@smithy/util-waiter": "^4.1.1", "@types/uuid": "^9.0.1", @@ -1989,47 +1989,47 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.888.0.tgz", - "integrity": "sha512-8CLy/ehGKUmekjH+VtZJ4w40PqDg3u0K7uPziq/4P8Q7LLgsy8YQoHNbuY4am7JU3HWrqLXJI9aaz1+vPGPoWA==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.893.0.tgz", + "integrity": "sha512-0+qRGq7H8UNfxI0F02ObyOgOiYxkN4DSlFfwQUQMPfqENDNYOrL++2H9X3EInyc1lUM/+aK8TZqSbh473gdxcg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, @@ -2038,48 +2038,48 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.888.0.tgz", - "integrity": "sha512-77hkMP0BKtDW8BqgxNUVLgmzUzI8pVQKi8o3AAa5hYcZ3L8fKtWyAt1d+vZ+ZTeUhnQa9BCsxmua5HvKl5LOlQ==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.893.0.tgz", + "integrity": "sha512-0gagbyKzxvBi8nVtYLwTveMslZYlgZtY6n466uRVjGhA6r4cRrfE0uG+0aG5nDWZp1W4jmbgRyEg0A4y4b570A==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, @@ -2088,49 +2088,49 @@ } }, "node_modules/@aws-sdk/client-xray": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.888.0.tgz", - "integrity": "sha512-HZnG7UuiTtMa7yMgGpZu6ODnBuQFvwy5cBZa4smxhzcCyPmjMsFJUDWAJmAMls7IRlb7Ad9Tj24C4XWR0br8AQ==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.893.0.tgz", + "integrity": "sha512-NEJXLUeFAOG91xEjLrg8hDsjt4DZ0WflZ7gWZalbfs9XPzJCwwXoC2LfM3/22q5SamaVlDqF7WYBSEPSjem26Q==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, @@ -2139,19 +2139,19 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.888.0.tgz", - "integrity": "sha512-L3S2FZywACo4lmWv37Y4TbefuPJ1fXWyWwIJ3J4wkPYFJ47mmtUPqThlVrSbdTHkEjnZgJe5cRfxk0qCLsFh1w==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.893.0.tgz", + "integrity": "sha512-E1NAWHOprBXIJ9CVb6oTsRD/tNOozrKBD/Sb4t7WZd3dpby6KpYfM6FaEGfRGcJBIcB4245hww8Rmg16qDMJWg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", - "@aws-sdk/xml-builder": "3.887.0", - "@smithy/core": "^3.11.0", - "@smithy/node-config-provider": "^4.2.1", - "@smithy/property-provider": "^4.0.5", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/xml-builder": "3.893.0", + "@smithy/core": "^3.11.1", + "@smithy/node-config-provider": "^4.2.2", + "@smithy/property-provider": "^4.1.1", "@smithy/protocol-http": "^5.2.1", - "@smithy/signature-v4": "^5.1.3", - "@smithy/smithy-client": "^4.6.1", + "@smithy/signature-v4": "^5.2.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", @@ -2165,14 +2165,14 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.888.0.tgz", - "integrity": "sha512-mGKLEAFsIaYci219lL42L22fEkbdwLSEuqeBN2D4LzNsbuGyLuE9vIRSOZr/wbHJ3UegI+1eCn0cF+qDgP4cdg==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.893.0.tgz", + "integrity": "sha512-HUYDc/6/3UYM3HmJKFpxzhjSpz1bZC5u4xkwgnCjNChn4SVwrWAseYLXYT6wZEjn6kRd/0uNlDi6nA+PuXhIWA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.888.0", - "@aws-sdk/types": "3.887.0", - "@smithy/property-provider": "^4.0.5", + "@aws-sdk/client-cognito-identity": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@smithy/property-provider": "^4.1.1", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -2181,14 +2181,14 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.888.0.tgz", - "integrity": "sha512-shPi4AhUKbIk7LugJWvNpeZA8va7e5bOHAEKo89S0Ac8WDZt2OaNzbh/b9l0iSL2eEyte8UgIsYGcFxOwIF1VA==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.893.0.tgz", + "integrity": "sha512-h4sYNk1iDrSZQLqFfbuD1GWY6KoVCvourfqPl6JZCYj8Vmnox5y9+7taPxwlU2VVII0hiV8UUbO79P35oPBSyA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.888.0", - "@aws-sdk/types": "3.887.0", - "@smithy/property-provider": "^4.0.5", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@smithy/property-provider": "^4.1.1", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -2197,20 +2197,20 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.888.0.tgz", - "integrity": "sha512-Jvuk6nul0lE7o5qlQutcqlySBHLXOyoPtiwE6zyKbGc7RVl0//h39Lab7zMeY2drMn8xAnIopL4606Fd8JI/Hw==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.893.0.tgz", + "integrity": "sha512-xYoC7DRr++zWZ9jG7/hvd6YjCbGDQzsAu2fBHHf91RVmSETXUgdEaP9rOdfCM02iIK/MYlwiWEIVBcBxWY/GQw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.888.0", - "@aws-sdk/types": "3.887.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/types": "3.893.0", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/node-http-handler": "^4.2.1", - "@smithy/property-provider": "^4.0.5", + "@smithy/property-provider": "^4.1.1", "@smithy/protocol-http": "^5.2.1", - "@smithy/smithy-client": "^4.6.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", - "@smithy/util-stream": "^4.3.1", + "@smithy/util-stream": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2218,22 +2218,22 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.888.0.tgz", - "integrity": "sha512-M82ItvS5yq+tO6ZOV1ruaVs2xOne+v8HW85GFCXnz8pecrzYdgxh6IsVqEbbWruryG/mUGkWMbkBZoEsy4MgyA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-env": "3.888.0", - "@aws-sdk/credential-provider-http": "3.888.0", - "@aws-sdk/credential-provider-process": "3.888.0", - "@aws-sdk/credential-provider-sso": "3.888.0", - "@aws-sdk/credential-provider-web-identity": "3.888.0", - "@aws-sdk/nested-clients": "3.888.0", - "@aws-sdk/types": "3.887.0", - "@smithy/credential-provider-imds": "^4.0.7", - "@smithy/property-provider": "^4.0.5", - "@smithy/shared-ini-file-loader": "^4.0.5", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.893.0.tgz", + "integrity": "sha512-ZQWOl4jdLhJHHrHsOfNRjgpP98A5kw4YzkMOUoK+TgSQVLi7wjb957V0htvwpi6KmGr3f2F8J06D6u2OtIc62w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-env": "3.893.0", + "@aws-sdk/credential-provider-http": "3.893.0", + "@aws-sdk/credential-provider-process": "3.893.0", + "@aws-sdk/credential-provider-sso": "3.893.0", + "@aws-sdk/credential-provider-web-identity": "3.893.0", + "@aws-sdk/nested-clients": "3.893.0", + "@aws-sdk/types": "3.893.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" }, @@ -2242,21 +2242,21 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.888.0.tgz", - "integrity": "sha512-KCrQh1dCDC8Y+Ap3SZa6S81kHk+p+yAaOQ5jC3dak4zhHW3RCrsGR/jYdemTOgbEGcA6ye51UbhWfrrlMmeJSA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.888.0", - "@aws-sdk/credential-provider-http": "3.888.0", - "@aws-sdk/credential-provider-ini": "3.888.0", - "@aws-sdk/credential-provider-process": "3.888.0", - "@aws-sdk/credential-provider-sso": "3.888.0", - "@aws-sdk/credential-provider-web-identity": "3.888.0", - "@aws-sdk/types": "3.887.0", - "@smithy/credential-provider-imds": "^4.0.7", - "@smithy/property-provider": "^4.0.5", - "@smithy/shared-ini-file-loader": "^4.0.5", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.893.0.tgz", + "integrity": "sha512-NjvDUXciC2+EaQnbL/u/ZuCXj9PZQ/9ciPhI62LGCoJ3ft91lI1Z58Dgut0OFPpV6i16GhpFxzmbuf40wTgDbA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.893.0", + "@aws-sdk/credential-provider-http": "3.893.0", + "@aws-sdk/credential-provider-ini": "3.893.0", + "@aws-sdk/credential-provider-process": "3.893.0", + "@aws-sdk/credential-provider-sso": "3.893.0", + "@aws-sdk/credential-provider-web-identity": "3.893.0", + "@aws-sdk/types": "3.893.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" }, @@ -2265,15 +2265,15 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.888.0.tgz", - "integrity": "sha512-+aX6piSukPQ8DUS4JAH344GePg8/+Q1t0+kvSHAZHhYvtQ/1Zek3ySOJWH2TuzTPCafY4nmWLcQcqvU1w9+4Lw==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.893.0.tgz", + "integrity": "sha512-5XitkZdiQhjWJV71qWqrH7hMXwuK/TvIRwiwKs7Pj0sapGSk3YgD3Ykdlolz7sQOleoKWYYqgoq73fIPpTTmFA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.888.0", - "@aws-sdk/types": "3.887.0", - "@smithy/property-provider": "^4.0.5", - "@smithy/shared-ini-file-loader": "^4.0.5", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@smithy/property-provider": "^4.1.1", + "@smithy/shared-ini-file-loader": "^4.2.0", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -2282,17 +2282,17 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.888.0.tgz", - "integrity": "sha512-b1ZJji7LJ6E/j1PhFTyvp51in2iCOQ3VP6mj5H6f5OUnqn7efm41iNMoinKr87n0IKZw7qput5ggXVxEdPhouA==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.893.0.tgz", + "integrity": "sha512-ms8v13G1r0aHZh5PLcJu6AnQZPs23sRm3Ph0A7+GdqbPvWewP8M7jgZTKyTXi+oYXswdYECU1zPVur8zamhtLg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.888.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/token-providers": "3.888.0", - "@aws-sdk/types": "3.887.0", - "@smithy/property-provider": "^4.0.5", - "@smithy/shared-ini-file-loader": "^4.0.5", + "@aws-sdk/client-sso": "3.893.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/token-providers": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@smithy/property-provider": "^4.1.1", + "@smithy/shared-ini-file-loader": "^4.2.0", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -2301,15 +2301,16 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.888.0.tgz", - "integrity": "sha512-7P0QNtsDzMZdmBAaY/vY1BsZHwTGvEz3bsn2bm5VSKFAeMmZqsHK1QeYdNsFjLtegnVh+wodxMq50jqLv3LFlA==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.893.0.tgz", + "integrity": "sha512-wWD8r2ot4jf/CoogdPTl13HbwNLW4UheGUCu6gW7n9GoHh1JImYyooPHK8K7kD42hihydIA7OW7iFAf7//JYTw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.888.0", - "@aws-sdk/nested-clients": "3.888.0", - "@aws-sdk/types": "3.887.0", - "@smithy/property-provider": "^4.0.5", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/nested-clients": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@smithy/property-provider": "^4.1.1", + "@smithy/shared-ini-file-loader": "^4.2.0", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -2318,28 +2319,28 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.888.0.tgz", - "integrity": "sha512-If2AnDiJJLT889imXn6cEM4WoduPgTye/vYiVXZaDqMvjk+tJVbA9uFuv1ixF3DHMC6aE0LU9cTjXX+I4TayFg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.888.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/credential-provider-cognito-identity": "3.888.0", - "@aws-sdk/credential-provider-env": "3.888.0", - "@aws-sdk/credential-provider-http": "3.888.0", - "@aws-sdk/credential-provider-ini": "3.888.0", - "@aws-sdk/credential-provider-node": "3.888.0", - "@aws-sdk/credential-provider-process": "3.888.0", - "@aws-sdk/credential-provider-sso": "3.888.0", - "@aws-sdk/credential-provider-web-identity": "3.888.0", - "@aws-sdk/nested-clients": "3.888.0", - "@aws-sdk/types": "3.887.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", - "@smithy/credential-provider-imds": "^4.0.7", - "@smithy/node-config-provider": "^4.2.1", - "@smithy/property-provider": "^4.0.5", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.893.0.tgz", + "integrity": "sha512-nsnVpa6GNR8c/nP6kNTb9SMRtaKMGdqqL7HxiF2I6B09PwQ2u2Mm4PaJxsw1dm1Br2HIWA86ZYOvz4cB7lb8VA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.893.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/credential-provider-cognito-identity": "3.893.0", + "@aws-sdk/credential-provider-env": "3.893.0", + "@aws-sdk/credential-provider-http": "3.893.0", + "@aws-sdk/credential-provider-ini": "3.893.0", + "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/credential-provider-process": "3.893.0", + "@aws-sdk/credential-provider-sso": "3.893.0", + "@aws-sdk/credential-provider-web-identity": "3.893.0", + "@aws-sdk/nested-clients": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", + "@smithy/credential-provider-imds": "^4.1.2", + "@smithy/node-config-provider": "^4.2.2", + "@smithy/property-provider": "^4.1.1", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -2348,17 +2349,17 @@ } }, "node_modules/@aws-sdk/ec2-metadata-service": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/ec2-metadata-service/-/ec2-metadata-service-3.888.0.tgz", - "integrity": "sha512-tq5SBNvvTTtB33EP1hpXViZPFCEhEyAptzj1YeYMiA0b4Lr4n/CRplgmXV6NpT2s9cR5BwkO65twoNRsIV4+OA==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/ec2-metadata-service/-/ec2-metadata-service-3.893.0.tgz", + "integrity": "sha512-x0eOZm6mCvQqZl+aq/AgazvedGYTK02dKwhE84xefXdspshfVdykco7MJ+u2Pyqy2hZrE8CXgAABIMsX/LlGIg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", - "@smithy/node-config-provider": "^4.2.1", + "@aws-sdk/types": "3.893.0", + "@smithy/node-config-provider": "^4.2.2", "@smithy/node-http-handler": "^4.2.1", "@smithy/protocol-http": "^5.2.1", "@smithy/types": "^4.5.0", - "@smithy/util-stream": "^4.3.1", + "@smithy/util-stream": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2366,9 +2367,9 @@ } }, "node_modules/@aws-sdk/endpoint-cache": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/endpoint-cache/-/endpoint-cache-3.873.0.tgz", - "integrity": "sha512-EHd+5bSp/hZc78SMq9cUCIsX0B4ekZtFUVSSLEXyYv8x/nHFTnTqN9TsxV8bjlztR3aSUeoKSk5qxu/dVGgiQw==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/endpoint-cache/-/endpoint-cache-3.893.0.tgz", + "integrity": "sha512-KSwTfyLZyNLszz5f/yoLC+LC+CRKpeJii/+zVAy7JUOQsKhSykiRUPYUx7o2Sdc4oJfqqUl26A/jSttKYnYtAA==", "license": "Apache-2.0", "dependencies": { "mnemonist": "0.38.3", @@ -2379,15 +2380,15 @@ } }, "node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.888.0.tgz", - "integrity": "sha512-Im2TsHOBKKtY6wCsrcg66bgIEZisJfJyI323ee8oIWlS9sPIgXo1tq2rVbYQfTu2srtYgmbvxts9uzNrrPVRyA==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.893.0.tgz", + "integrity": "sha512-uO1z6DOxDxGHKc1NISkmq1g2CXg/CQPS/eeoUxuze0a6KF3nOH4ZjbUIvd7lTAg1d2k3VaO05jwJhfl9m4W/ow==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.888.0", - "@aws-sdk/util-dynamodb": "3.888.0", - "@smithy/core": "^3.11.0", - "@smithy/smithy-client": "^4.6.1", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/util-dynamodb": "3.893.0", + "@smithy/core": "^3.11.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -2395,18 +2396,18 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.888.0" + "@aws-sdk/client-dynamodb": "^3.893.0" } }, "node_modules/@aws-sdk/lib-storage": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.888.0.tgz", - "integrity": "sha512-UCZsVxjnQ6QpVWI1ZiNGmxfd1+8YBNbriQJ5lssR2IudQt5ThGhamGkwoYBmFV4iwhmgIT2fn5+gErugFZuUhw==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.893.0.tgz", + "integrity": "sha512-fsCDTpn4WyFV/H4tS5ubYxY4wE1AVMDv6trl2JdRSgUh5G+3ov9x1MOKXfnUjShhZ4KUSyq3KNezzlA2gAJIzQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.5", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/smithy-client": "^4.6.1", + "@smithy/abort-controller": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/smithy-client": "^4.6.3", "buffer": "5.6.0", "events": "3.3.0", "stream-browserify": "3.0.0", @@ -2416,7 +2417,7 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-s3": "^3.888.0" + "@aws-sdk/client-s3": "^3.893.0" } }, "node_modules/@aws-sdk/lib-storage/node_modules/events": { @@ -2428,17 +2429,17 @@ } }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.887.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.887.0.tgz", - "integrity": "sha512-qRCte/3MtNiMhPh4ZEGk9cHfAXq6IDTflvi2t1tkOIVZFyshkSCvNQNJrrE2D/ljVbOK1f3XbBDaF43EoQzIRQ==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.893.0.tgz", + "integrity": "sha512-H+wMAoFC73T7M54OFIezdHXR9/lH8TZ3Cx1C3MEBb2ctlzQrVCd8LX8zmOtcGYC8plrRwV+8rNPe0FMqecLRew==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-arn-parser": "3.873.0", - "@smithy/node-config-provider": "^4.2.1", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/node-config-provider": "^4.2.2", "@smithy/protocol-http": "^5.2.1", "@smithy/types": "^4.5.0", - "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-config-provider": "^4.1.0", "tslib": "^2.6.2" }, "engines": { @@ -2446,14 +2447,14 @@ } }, "node_modules/@aws-sdk/middleware-endpoint-discovery": { - "version": "3.887.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.887.0.tgz", - "integrity": "sha512-ik+0B5nEMILseILZiBiOomcBuBV+fPzp1+u+zD9CWFjPy2ZnGdXtEgKec2mIjJKD1PxHcJm/lFD8/mHP3Rm9RA==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.893.0.tgz", + "integrity": "sha512-WnKSbB397NuMm14/ydw+GbY5+KlnoHf033zIo92n/6AkNoSD1crPRG361ttDoWmk111dfBr/ki5yRfgjujtk9w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/endpoint-cache": "3.873.0", - "@aws-sdk/types": "3.887.0", - "@smithy/node-config-provider": "^4.2.1", + "@aws-sdk/endpoint-cache": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@smithy/node-config-provider": "^4.2.2", "@smithy/protocol-http": "^5.2.1", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" @@ -2463,12 +2464,12 @@ } }, "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.887.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.887.0.tgz", - "integrity": "sha512-AlrTZZScDTG9SYeT82BC5cK/6Q4N0miN5xqMW/pbBqP3fNXlsdJOWKB+EKD3V6DV41EV5GVKHKe/1065xKSQ4w==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.893.0.tgz", + "integrity": "sha512-PEZkvD6k0X9sacHkvkVF4t2QyQEAzd35OJ2bIrjWCfc862TwukMMJ1KErRmQ1WqKXHKF4L0ed5vtWaO/8jVLNA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", + "@aws-sdk/types": "3.893.0", "@smithy/protocol-http": "^5.2.1", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" @@ -2478,22 +2479,22 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.888.0.tgz", - "integrity": "sha512-vdwd4wMAlXSg1bldhXyTsDSnyPP+bbEVihapejGKNd4gLfyyHwjTfbli+B/hEONGttQs5Dp54UMn8yW/UA189g==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.893.0.tgz", + "integrity": "sha512-2swRPpyGK6xpZwIFmmFSFKp10iuyBLZEouhrt1ycBVA8iHGmPkuJSCim6Vb+JoRKqINp5tizWeQwdg9boIxJPw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/types": "3.887.0", - "@smithy/is-array-buffer": "^4.0.0", - "@smithy/node-config-provider": "^4.2.1", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@smithy/is-array-buffer": "^4.1.0", + "@smithy/node-config-provider": "^4.2.2", "@smithy/protocol-http": "^5.2.1", "@smithy/types": "^4.5.0", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-stream": "^4.3.1", + "@smithy/util-stream": "^4.3.2", "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, @@ -2502,12 +2503,12 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.887.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.887.0.tgz", - "integrity": "sha512-ulzqXv6NNqdu/kr0sgBYupWmahISHY+azpJidtK6ZwQIC+vBUk9NdZeqQpy7KVhIk2xd4+5Oq9rxapPwPI21CA==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.893.0.tgz", + "integrity": "sha512-qL5xYRt80ahDfj9nDYLhpCNkDinEXvjLe/Qen/Y/u12+djrR2MB4DRa6mzBCkLkdXDtf0WAoW2EZsNCfGrmOEQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", + "@aws-sdk/types": "3.893.0", "@smithy/protocol-http": "^5.2.1", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" @@ -2517,12 +2518,12 @@ } }, "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.887.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.887.0.tgz", - "integrity": "sha512-eU/9Cq4gg2sS32bOomxdx2YF43kb+o70pMhnEBBnVVeqzE8co78SO5FQdWfRTfhNJgTyQ6Vgosx//CNMPIfZPg==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.893.0.tgz", + "integrity": "sha512-MlbBc7Ttb1ekbeeeFBU4DeEZOLb5s0Vl4IokvO17g6yJdLk4dnvZro9zdXl3e7NXK+kFxHRBFZe55p/42mVgDA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", + "@aws-sdk/types": "3.893.0", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -2531,12 +2532,12 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.887.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.887.0.tgz", - "integrity": "sha512-YbbgLI6jKp2qSoAcHnXrQ5jcuc5EYAmGLVFgMVdk8dfCfJLfGGSaOLxF4CXC7QYhO50s+mPPkhBYejCik02Kug==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.893.0.tgz", + "integrity": "sha512-ZqzMecjju5zkBquSIfVfCORI/3Mge21nUY4nWaGQy+NUXehqCGG4W7AiVpiHGOcY2cGJa7xeEkYcr2E2U9U0AA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", + "@aws-sdk/types": "3.893.0", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -2545,12 +2546,12 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.887.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.887.0.tgz", - "integrity": "sha512-tjrUXFtQnFLo+qwMveq5faxP5MQakoLArXtqieHphSqZTXm21wDJM73hgT4/PQQGTwgYjDKqnqsE1hvk0hcfDw==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.893.0.tgz", + "integrity": "sha512-H7Zotd9zUHQAr/wr3bcWHULYhEeoQrF54artgsoUGIf/9emv6LzY89QUccKIxYd6oHKNTrTyXm9F0ZZrzXNxlg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", + "@aws-sdk/types": "3.893.0", "@aws/lambda-invoke-store": "^0.0.1", "@smithy/protocol-http": "^5.2.1", "@smithy/types": "^4.5.0", @@ -2561,17 +2562,17 @@ } }, "node_modules/@aws-sdk/middleware-sdk-ec2": { - "version": "3.887.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-ec2/-/middleware-sdk-ec2-3.887.0.tgz", - "integrity": "sha512-8lJRulmhpGpELX+ZHp9LnOX5vULPClh1KSNtHVLN/ClGuFVTpBgXVpAs5F/pU8dJSJnbY6qEpY4VDlIuEBtFRA==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-ec2/-/middleware-sdk-ec2-3.893.0.tgz", + "integrity": "sha512-Jev9GulnC62aLpl4JpWozIJ2KZaLF/PYybqVR58UKWOOxj9pgksEDMdARI9sgnICb1Xhzkme7vkghqZtJ677Ew==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-format-url": "3.887.0", - "@smithy/middleware-endpoint": "^4.2.1", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-format-url": "3.893.0", + "@smithy/middleware-endpoint": "^4.2.3", "@smithy/protocol-http": "^5.2.1", - "@smithy/signature-v4": "^5.1.3", - "@smithy/smithy-client": "^4.6.1", + "@smithy/signature-v4": "^5.2.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -2580,12 +2581,12 @@ } }, "node_modules/@aws-sdk/middleware-sdk-route53": { - "version": "3.887.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-route53/-/middleware-sdk-route53-3.887.0.tgz", - "integrity": "sha512-3E91c2XuIJ4WTKMZjGEAlrbqb3mwh24KPpgd9yzOzFPWkc1ZkfbrHeFUNYpR3BR2DJJ+No6rE9NIznvcH0hZ4g==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-route53/-/middleware-sdk-route53-3.893.0.tgz", + "integrity": "sha512-waFIzyqq4CIyLUxBpPT+xBvvYDHFy7S/XtLanKfbQI28deapp4cQjVcGx4oDrLSzB5R1/aewnN72PLNiBBNbzg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", + "@aws-sdk/types": "3.893.0", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -2594,23 +2595,23 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.888.0.tgz", - "integrity": "sha512-rKOFNfqgqOfrdcLGF8fcO75azWS2aq2ksRHFoIEFru5FJxzu/yDAhY4C2FKiP/X34xeIUS2SbE/gQgrgWHSN2g==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.893.0.tgz", + "integrity": "sha512-J2v7jOoSlE4o416yQiuka6+cVJzyrU7mbJEQA9VFCb+TYT2cG3xQB0bDzE24QoHeonpeBDghbg/zamYMnt+GsQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.888.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-arn-parser": "3.873.0", - "@smithy/core": "^3.11.0", - "@smithy/node-config-provider": "^4.2.1", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/core": "^3.11.1", + "@smithy/node-config-provider": "^4.2.2", "@smithy/protocol-http": "^5.2.1", - "@smithy/signature-v4": "^5.1.3", - "@smithy/smithy-client": "^4.6.1", + "@smithy/signature-v4": "^5.2.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", - "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-config-provider": "^4.1.0", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-stream": "^4.3.1", + "@smithy/util-stream": "^4.3.2", "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, @@ -2619,12 +2620,12 @@ } }, "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.887.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.887.0.tgz", - "integrity": "sha512-1ixZks0IDkdac1hjPe4vdLSuD9HznkhblCEb4T0wNyw3Ee1fdXg+MlcPWywzG5zkPXLcIrULUzJg/OSYfaDXcQ==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.893.0.tgz", + "integrity": "sha512-e4ccCiAnczv9mMPheKjgKxZQN473mcup+3DPLVNnIw5GRbQoDqPSB70nUzfORKZvM7ar7xLMPxNR8qQgo1C8Rg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", + "@aws-sdk/types": "3.893.0", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -2633,15 +2634,15 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.888.0.tgz", - "integrity": "sha512-ZkcUkoys8AdrNNG7ATjqw2WiXqrhTvT+r4CIK3KhOqIGPHX0p0DQWzqjaIl7ZhSUToKoZ4Ud7MjF795yUr73oA==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.893.0.tgz", + "integrity": "sha512-n1vHj7bdC4ycIAKkny0rmgvgvGOIgYnGBAqfPAFPR26WuGWmCxH2cT9nQTNA+li8ofxX9F9FIFBTKkW92Pc8iQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.888.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@smithy/core": "^3.11.1", "@smithy/protocol-http": "^5.2.1", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" @@ -2651,47 +2652,47 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.888.0.tgz", - "integrity": "sha512-py4o4RPSGt+uwGvSBzR6S6cCBjS4oTX5F8hrHFHfPCdIOMVjyOBejn820jXkCrcdpSj3Qg1yUZXxsByvxc9Lyg==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.893.0.tgz", + "integrity": "sha512-HIUCyNtWkxvc0BmaJPUj/A0/29OapT/dzBNxr2sjgKNZgO81JuDFp+aXCmnf7vQoA2D1RzCsAIgEtfTExNFZqA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.888.0", - "@aws-sdk/middleware-host-header": "3.887.0", - "@aws-sdk/middleware-logger": "3.887.0", - "@aws-sdk/middleware-recursion-detection": "3.887.0", - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/region-config-resolver": "3.887.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.887.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.888.0", - "@smithy/config-resolver": "^4.2.1", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.893.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.1", - "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", - "@smithy/node-config-provider": "^4.2.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.1", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.1", - "@smithy/util-defaults-mode-node": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, @@ -2700,15 +2701,15 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.887.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.887.0.tgz", - "integrity": "sha512-VdSMrIqJ3yjJb/fY+YAxrH/lCVv0iL8uA+lbMNfQGtO5tB3Zx6SU9LEpUwBNX8fPK1tUpI65CNE4w42+MY/7Mg==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.893.0.tgz", + "integrity": "sha512-/cJvh3Zsa+Of0Zbg7vl9wp/kZtdb40yk/2+XcroAMVPO9hPvmS9r/UOm6tO7FeX4TtkRFwWaQJiTZTgSdsPY+Q==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", - "@smithy/node-config-provider": "^4.2.1", + "@aws-sdk/types": "3.893.0", + "@smithy/node-config-provider": "^4.2.2", "@smithy/types": "^4.5.0", - "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-config-provider": "^4.1.0", "@smithy/util-middleware": "^4.1.1", "tslib": "^2.6.2" }, @@ -2717,15 +2718,15 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.888.0.tgz", - "integrity": "sha512-FmOHUaJzEhqfcpyh0L7HLwYcYopK13Dbmuf+oUyu56/RoeB1nLnltH1VMQVj8v3Am2IwlGR+/JpFyrdkErN+cA==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.893.0.tgz", + "integrity": "sha512-pp4Bn8dL4i68P/mHgZ7sgkm8OSIpwjtGxP73oGseu9Cli0JRyJ1asTSsT60hUz3sbo+3oKk3hEobD6UxLUeGRA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.888.0", - "@aws-sdk/types": "3.887.0", + "@aws-sdk/middleware-sdk-s3": "3.893.0", + "@aws-sdk/types": "3.893.0", "@smithy/protocol-http": "^5.2.1", - "@smithy/signature-v4": "^5.1.3", + "@smithy/signature-v4": "^5.2.1", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -2734,16 +2735,16 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.888.0.tgz", - "integrity": "sha512-WA3NF+3W8GEuCMG1WvkDYbB4z10G3O8xuhT7QSjhvLYWQ9CPt3w4VpVIfdqmUn131TCIbhCzD0KN/1VJTjAjyw==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.893.0.tgz", + "integrity": "sha512-nkzuE910TxW4pnIwJ+9xDMx5m+A8iXGM16Oa838YKsds07cgkRp7sPnpH9B8NbGK2szskAAkXfj7t1f59EKd1Q==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.888.0", - "@aws-sdk/nested-clients": "3.888.0", - "@aws-sdk/types": "3.887.0", - "@smithy/property-provider": "^4.0.5", - "@smithy/shared-ini-file-loader": "^4.0.5", + "@aws-sdk/core": "3.893.0", + "@aws-sdk/nested-clients": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@smithy/property-provider": "^4.1.1", + "@smithy/shared-ini-file-loader": "^4.2.0", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -2752,9 +2753,9 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.887.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.887.0.tgz", - "integrity": "sha512-fmTEJpUhsPsovQ12vZSpVTEP/IaRoJAMBGQXlQNjtCpkBp6Iq3KQDa/HDaPINE+3xxo6XvTdtibsNOd5zJLV9A==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.893.0.tgz", + "integrity": "sha512-Aht1nn5SnA0N+Tjv0dzhAY7CQbxVtmq1bBR6xI0MhG7p2XYVh1wXuKTzrldEvQWwA3odOYunAfT9aBiKZx9qIg==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.5.0", @@ -2765,9 +2766,9 @@ } }, "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.873.0.tgz", - "integrity": "sha512-qag+VTqnJWDn8zTAXX4wiVioa0hZDQMtbZcGRERVnLar4/3/VIKBhxX2XibNQXFu1ufgcRn4YntT/XEPecFWcg==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", + "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2777,9 +2778,9 @@ } }, "node_modules/@aws-sdk/util-dynamodb": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.888.0.tgz", - "integrity": "sha512-CmgHcL+k259MsMoZb9Xy90/kv98XwVuFMdcX3ClcR2UwGyJSpfjMRu78x2tl4rIMzYElDqso2FTD367n91kssg==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.893.0.tgz", + "integrity": "sha512-zjXv6ejXF2bzSB+EEmfATm1VoyejJmncNYunOLQ+ThiSepfLQ5jKYtbDc7niqjfHysGpVTSYji4DG25Yj+WQZA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2788,19 +2789,19 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.888.0" + "@aws-sdk/client-dynamodb": "^3.893.0" } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.887.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.887.0.tgz", - "integrity": "sha512-kpegvT53KT33BMeIcGLPA65CQVxLUL/C3gTz9AzlU/SDmeusBHX4nRApAicNzI/ltQ5lxZXbQn18UczzBuwF1w==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.893.0.tgz", + "integrity": "sha512-xeMcL31jXHKyxRwB3oeNjs8YEpyvMnSYWr2OwLydgzgTr0G349AHlJHwYGCF9xiJ2C27kDxVvXV/Hpdp0p7TWw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", + "@aws-sdk/types": "3.893.0", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", - "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-endpoints": "^3.1.2", "tslib": "^2.6.2" }, "engines": { @@ -2808,12 +2809,12 @@ } }, "node_modules/@aws-sdk/util-format-url": { - "version": "3.887.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.887.0.tgz", - "integrity": "sha512-ABDSP6KsrdD+JC7qwMqUpLXqPidvfgT+Q+W8sGGuk/IBy7smgZDOdYSZLE4VBbQpH3N/zSJuslAWhL2x37Qwww==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.893.0.tgz", + "integrity": "sha512-VmAvcedZfQlekiSFJ9y/+YjuCFT3b/vXImbkqjYoD4gbsDjmKm5lxo/w1p9ch0s602obRPLMkh9H20YgXnmwEA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", + "@aws-sdk/types": "3.893.0", "@smithy/querystring-builder": "^4.1.1", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" @@ -2823,9 +2824,9 @@ } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.873.0.tgz", - "integrity": "sha512-xcVhZF6svjM5Rj89T1WzkjQmrTF6dpR2UvIHPMTnSZoNe6CixejPZ6f0JJ2kAhO8H+dUHwNBlsUgOTIKiK/Syg==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.893.0.tgz", + "integrity": "sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2835,26 +2836,26 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.887.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.887.0.tgz", - "integrity": "sha512-X71UmVsYc6ZTH4KU6hA5urOzYowSXc3qvroagJNLJYU1ilgZ529lP4J9XOYfEvTXkLR1hPFSRxa43SrwgelMjA==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.893.0.tgz", + "integrity": "sha512-PE9NtbDBW6Kgl1bG6A5fF3EPo168tnkj8TgMcT0sg4xYBWsBpq0bpJZRh+Jm5Bkwiw9IgTCLjEU7mR6xWaMB9w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", + "@aws-sdk/types": "3.893.0", "@smithy/types": "^4.5.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.888.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.888.0.tgz", - "integrity": "sha512-rSB3OHyuKXotIGfYEo//9sU0lXAUrTY28SUUnxzOGYuQsAt0XR5iYwBAp+RjV6x8f+Hmtbg0PdCsy1iNAXa0UQ==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.893.0.tgz", + "integrity": "sha512-tTRkJo/fth9NPJ2AO/XLuJWVsOhbhejQRLyP0WXG3z0Waa5IWK5YBxBC1tWWATUCwsN748JQXU03C1aF9cRD9w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.888.0", - "@aws-sdk/types": "3.887.0", - "@smithy/node-config-provider": "^4.2.1", + "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@smithy/node-config-provider": "^4.2.2", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -2871,9 +2872,9 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.887.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.887.0.tgz", - "integrity": "sha512-lMwgWK1kNgUhHGfBvO/5uLe7TKhycwOn3eRCqsKPT9aPCx/HWuTlpcQp8oW2pCRGLS7qzcxqpQulcD+bbUL7XQ==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.893.0.tgz", + "integrity": "sha512-qKkJ2E0hU60iq0o2+hBSIWS8sf34xhqiRRGw5nbRhwEnE2MsWsWBpRoysmr32uq9dHMWUzII0c/fS29+wOSdMA==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.5.0", @@ -4312,9 +4313,9 @@ } }, "node_modules/@smithy/core": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.11.0.tgz", - "integrity": "sha512-Abs5rdP1o8/OINtE49wwNeWuynCu0kme1r4RI3VXVrHr4odVDG7h7mTnw1WXXfN5Il+c25QOnrdL2y56USfxkA==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.11.1.tgz", + "integrity": "sha512-REH7crwORgdjSpYs15JBiIWOYjj0hJNC3aCecpJvAlMMaaqL5i2CLb1i6Hc4yevToTKSqslLMI9FKjhugEwALA==", "license": "Apache-2.0", "dependencies": { "@smithy/middleware-serde": "^4.1.1", @@ -4323,7 +4324,7 @@ "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-stream": "^4.3.1", + "@smithy/util-stream": "^4.3.2", "@smithy/util-utf8": "^4.1.0", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", @@ -4519,13 +4520,13 @@ } }, "node_modules/@smithy/middleware-compression": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-4.2.2.tgz", - "integrity": "sha512-rXE9uwFvzJtqJmu7BZlJ1PVSJM/+sopo20SI6g0VqrhtYVmmbXJcpGyo/TP1ufPtnNQ2G6R10Gvec/6TRxQR1Q==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-4.2.3.tgz", + "integrity": "sha512-g23ZBhZqznGWds27uRXqASuDAJ9u71N39rEMHwaBiUREDWmHhIqTGPqOmAndbTRKcQ3UGm0eZ4NKTmXEanFksw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.11.0", + "@smithy/core": "^3.11.1", "@smithy/is-array-buffer": "^4.1.0", "@smithy/node-config-provider": "^4.2.2", "@smithy/protocol-http": "^5.2.1", @@ -4555,12 +4556,12 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.2.2.tgz", - "integrity": "sha512-M51KcwD+UeSOFtpALGf5OijWt915aQT5eJhqnMKJt7ZTfDfNcvg2UZgIgTZUoiORawb6o5lk4n3rv7vnzQXgsA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.2.3.tgz", + "integrity": "sha512-+1H5A28DeffRVrqmVmtqtRraEjoaC6JVap3xEQdVoBh2EagCVY7noPmcBcG4y7mnr9AJitR1ZAse2l+tEtK5vg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.11.0", + "@smithy/core": "^3.11.1", "@smithy/middleware-serde": "^4.1.1", "@smithy/node-config-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.2.0", @@ -4574,18 +4575,18 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.2.2.tgz", - "integrity": "sha512-KZJueEOO+PWqflv2oGx9jICpHdBYXwCI19j7e2V3IMwKgFcXc9D9q/dsTf4B+uCnYxjNoS1jpyv6pGNGRsKOXA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.2.4.tgz", + "integrity": "sha512-amyqYQFewnAviX3yy/rI/n1HqAgfvUdkEhc04kDjxsngAUREKuOI24iwqQUirrj6GtodWmR4iO5Zeyl3/3BwWg==", "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^4.2.2", "@smithy/protocol-http": "^5.2.1", - "@smithy/service-error-classification": "^4.1.1", - "@smithy/smithy-client": "^4.6.2", + "@smithy/service-error-classification": "^4.1.2", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.1", + "@smithy/util-retry": "^4.1.2", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" @@ -4706,9 +4707,9 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.1.1.tgz", - "integrity": "sha512-Iam75b/JNXyDE41UvrlM6n8DNOa/r1ylFyvgruTUx7h2Uk7vDNV9AAwP1vfL1fOL8ls0xArwEGVcGZVd7IO/Cw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.1.2.tgz", + "integrity": "sha512-Kqd8wyfmBWHZNppZSMfrQFpc3M9Y/kjyN8n8P4DqJJtuwgK1H914R471HTw7+RL+T7+kI1f1gOnL7Vb5z9+NgQ==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.5.0" @@ -4750,17 +4751,17 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.6.2.tgz", - "integrity": "sha512-u82cjh/x7MlMat76Z38TRmEcG6JtrrxN4N2CSNG5o2v2S3hfLAxRgSgFqf0FKM3dglH41Evknt/HOX+7nfzZ3g==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.6.3.tgz", + "integrity": "sha512-K27LqywsaqKz4jusdUQYJh/YP2VbnbdskZ42zG8xfV+eovbTtMc2/ZatLWCfSkW0PDsTUXlpvlaMyu8925HsOw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.11.0", - "@smithy/middleware-endpoint": "^4.2.2", + "@smithy/core": "^3.11.1", + "@smithy/middleware-endpoint": "^4.2.3", "@smithy/middleware-stack": "^4.1.1", "@smithy/protocol-http": "^5.2.1", "@smithy/types": "^4.5.0", - "@smithy/util-stream": "^4.3.1", + "@smithy/util-stream": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4857,13 +4858,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.1.2.tgz", - "integrity": "sha512-QKrOw01DvNHKgY+3p4r9Ut4u6EHLVZ01u6SkOMe6V6v5C+nRPXJeWh72qCT1HgwU3O7sxAIu23nNh+FOpYVZKA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.1.3.tgz", + "integrity": "sha512-5fm3i2laE95uhY6n6O6uGFxI5SVbqo3/RWEuS3YsT0LVmSZk+0eUqPhKd4qk0KxBRPaT5VNT/WEBUqdMyYoRgg==", "license": "Apache-2.0", "dependencies": { "@smithy/property-provider": "^4.1.1", - "@smithy/smithy-client": "^4.6.2", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "bowser": "^2.11.0", "tslib": "^2.6.2" @@ -4873,16 +4874,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.1.2.tgz", - "integrity": "sha512-l2yRmSfx5haYHswPxMmCR6jGwgPs5LjHLuBwlj9U7nNBMS43YV/eevj+Xq1869UYdiynnMrCKtoOYQcwtb6lKg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.1.3.tgz", + "integrity": "sha512-lwnMzlMslZ9GJNt+/wVjz6+fe9Wp5tqR1xAyQn+iywmP+Ymj0F6NhU/KfHM5jhGPQchRSCcau5weKhFdLIM4cA==", "license": "Apache-2.0", "dependencies": { "@smithy/config-resolver": "^4.2.2", "@smithy/credential-provider-imds": "^4.1.2", "@smithy/node-config-provider": "^4.2.2", "@smithy/property-provider": "^4.1.1", - "@smithy/smithy-client": "^4.6.2", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -4930,12 +4931,12 @@ } }, "node_modules/@smithy/util-retry": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.1.1.tgz", - "integrity": "sha512-jGeybqEZ/LIordPLMh5bnmnoIgsqnp4IEimmUp5c5voZ8yx+5kAlN5+juyr7p+f7AtZTgvhmInQk4Q0UVbrZ0Q==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.1.2.tgz", + "integrity": "sha512-NCgr1d0/EdeP6U5PSZ9Uv5SMR5XRRYoVr1kRVtKZxWL3tixEL3UatrPIMFZSKwHlCcp2zPLDvMubVDULRqeunA==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.1.1", + "@smithy/service-error-classification": "^4.1.2", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -4944,9 +4945,9 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.3.1.tgz", - "integrity": "sha512-khKkW/Jqkgh6caxMWbMuox9+YfGlsk9OnHOYCGVEdYQb/XVzcORXHLYUubHmmda0pubEDncofUrPNniS9d+uAA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.3.2.tgz", + "integrity": "sha512-Ka+FA2UCC/Q1dEqUanCdpqwxOFdf5Dg2VXtPtB1qxLcSGh5C1HdzklIt18xL504Wiy9nNUKwDMRTVCbKGoK69g==", "license": "Apache-2.0", "dependencies": { "@smithy/fetch-http-handler": "^5.2.1", @@ -10716,8 +10717,8 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.888.0", - "@aws-sdk/lib-dynamodb": "^3.888.0", + "@aws-sdk/client-dynamodb": "^3.893.0", + "@aws-sdk/lib-dynamodb": "^3.893.0", "aws-sdk-client-mock": "^4.1.0" }, "peerDependencies": { @@ -10817,7 +10818,7 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.888.0", + "@aws-sdk/client-cloudwatch": "^3.893.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, @@ -10839,11 +10840,11 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.888.0", - "@aws-sdk/client-dynamodb": "^3.888.0", - "@aws-sdk/client-secrets-manager": "^3.888.0", - "@aws-sdk/client-ssm": "^3.888.0", - "@aws-sdk/util-dynamodb": "^3.888.0", + "@aws-sdk/client-appconfigdata": "^3.893.0", + "@aws-sdk/client-dynamodb": "^3.893.0", + "@aws-sdk/client-secrets-manager": "^3.893.0", + "@aws-sdk/client-ssm": "^3.893.0", + "@aws-sdk/util-dynamodb": "^3.893.0", "@smithy/util-base64": "^4.0.0", "aws-sdk-client-mock": "^4.1.0" }, @@ -10906,7 +10907,7 @@ "license": "MIT-0", "dependencies": { "@aws-cdk/toolkit-lib": "^1.8.1", - "@aws-sdk/client-lambda": "^3.888.0", + "@aws-sdk/client-lambda": "^3.893.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.214.0", "esbuild": "^0.25.10", @@ -10927,8 +10928,8 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.888.0", - "@aws-sdk/client-xray": "^3.888.0" + "@aws-sdk/client-dynamodb": "^3.893.0", + "@aws-sdk/client-xray": "^3.893.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x" diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index 1c23058d99..39ff87718f 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -150,8 +150,8 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.888.0", - "@aws-sdk/lib-dynamodb": "^3.888.0", + "@aws-sdk/client-dynamodb": "^3.893.0", + "@aws-sdk/lib-dynamodb": "^3.893.0", "aws-sdk-client-mock": "^4.1.0" } } diff --git a/packages/metrics/package.json b/packages/metrics/package.json index db404e997b..27758bf2cd 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -64,7 +64,7 @@ "main": "./lib/cjs/index.js", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.888.0", + "@aws-sdk/client-cloudwatch": "^3.893.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, diff --git a/packages/parameters/package.json b/packages/parameters/package.json index 382d9715cc..1f08901b72 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -155,11 +155,11 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.888.0", - "@aws-sdk/client-dynamodb": "^3.888.0", - "@aws-sdk/client-secrets-manager": "^3.888.0", - "@aws-sdk/client-ssm": "^3.888.0", - "@aws-sdk/util-dynamodb": "^3.888.0", + "@aws-sdk/client-appconfigdata": "^3.893.0", + "@aws-sdk/client-dynamodb": "^3.893.0", + "@aws-sdk/client-secrets-manager": "^3.893.0", + "@aws-sdk/client-ssm": "^3.893.0", + "@aws-sdk/util-dynamodb": "^3.893.0", "@smithy/util-base64": "^4.0.0", "aws-sdk-client-mock": "^4.1.0" }, diff --git a/packages/testing/package.json b/packages/testing/package.json index f177f562c7..95c7dadc74 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -98,7 +98,7 @@ "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/testing#readme", "dependencies": { "@aws-cdk/toolkit-lib": "^1.8.1", - "@aws-sdk/client-lambda": "^3.888.0", + "@aws-sdk/client-lambda": "^3.893.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.214.0", "esbuild": "^0.25.10", diff --git a/packages/tracer/package.json b/packages/tracer/package.json index 2b82120c25..159f06bf75 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -29,8 +29,8 @@ "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.888.0", - "@aws-sdk/client-xray": "^3.888.0" + "@aws-sdk/client-dynamodb": "^3.893.0", + "@aws-sdk/client-xray": "^3.893.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x" From 278fca0491ce9cb955326523557c3ddf9d03dbc5 Mon Sep 17 00:00:00 2001 From: Swopnil Dangol Date: Tue, 23 Sep 2025 09:18:11 +0100 Subject: [PATCH 177/255] improv(event-handler): changed path parameter in middleware and routehandler signature (#4532) --- packages/event-handler/src/rest/Router.ts | 11 ++++------- packages/event-handler/src/rest/utils.ts | 3 +-- packages/event-handler/src/types/rest.ts | 9 ++++----- .../tests/unit/rest/Router/basic-routing.test.ts | 6 +++--- .../tests/unit/rest/Router/decorators.test.ts | 2 +- .../tests/unit/rest/Router/middleware.test.ts | 4 ++-- .../tests/unit/rest/middleware/compress.test.ts | 2 +- 7 files changed, 16 insertions(+), 21 deletions(-) diff --git a/packages/event-handler/src/rest/Router.ts b/packages/event-handler/src/rest/Router.ts index 03bb209523..313fb88ffd 100644 --- a/packages/event-handler/src/rest/Router.ts +++ b/packages/event-handler/src/rest/Router.ts @@ -224,6 +224,7 @@ class Router { // this response should be overwritten by the handler, if it isn't // it means something went wrong with the middleware chain res: new Response('', { status: 500 }), + params: {}, }; try { @@ -231,11 +232,7 @@ class Router { const route = this.routeRegistry.resolve(method, path); - const handlerMiddleware: Middleware = async ({ - params, - reqCtx, - next, - }) => { + const handlerMiddleware: Middleware = async ({ reqCtx, next }) => { if (route === null) { const notFoundRes = await this.handleError( new NotFoundError(`Route ${path} for method ${method} not found`), @@ -251,7 +248,7 @@ class Router { ? route.handler : route.handler.bind(options.scope); - const handlerResult = await handler(params, reqCtx); + const handlerResult = await handler(reqCtx); reqCtx.res = handlerResultToWebResponse( handlerResult, reqCtx.res.headers @@ -267,8 +264,8 @@ class Router { handlerMiddleware, ]); + requestContext.params = route?.params ?? {}; const middlewareResult = await middleware({ - params: route?.params ?? {}, reqCtx: requestContext, next: () => Promise.resolve(), }); diff --git a/packages/event-handler/src/rest/utils.ts b/packages/event-handler/src/rest/utils.ts index 792b85854b..e8fbd1e5d0 100644 --- a/packages/event-handler/src/rest/utils.ts +++ b/packages/event-handler/src/rest/utils.ts @@ -150,7 +150,7 @@ export const isAPIGatewayProxyResult = ( * ``` */ export const composeMiddleware = (middleware: Middleware[]): Middleware => { - return async ({ params, reqCtx, next }): Promise => { + return async ({ reqCtx, next }): Promise => { let index = -1; let result: HandlerResponse | undefined; @@ -177,7 +177,6 @@ export const composeMiddleware = (middleware: Middleware[]): Middleware => { }; const middlewareResult = await middlewareFn({ - params, reqCtx, next: nextFn, }); diff --git a/packages/event-handler/src/types/rest.ts b/packages/event-handler/src/types/rest.ts index d59b174a80..456a1dec9d 100644 --- a/packages/event-handler/src/types/rest.ts +++ b/packages/event-handler/src/types/rest.ts @@ -19,6 +19,7 @@ type RequestContext = { event: APIGatewayProxyEvent; context: Context; res: Response; + params: Record; }; type ErrorResolveOptions = RequestContext & ResolveOptions; @@ -60,10 +61,9 @@ type DynamicRoute = Route & CompiledRoute; type HandlerResponse = Response | JSONObject; -type RouteHandler< - TParams = Record, - TReturn = HandlerResponse, -> = (args: TParams, reqCtx: RequestContext) => Promise; +type RouteHandler = ( + reqCtx: RequestContext +) => Promise; type HttpMethod = keyof typeof HttpVerbs; @@ -87,7 +87,6 @@ type RestRouteOptions = { type NextFunction = () => Promise; type Middleware = (args: { - params: Record; reqCtx: RequestContext; next: NextFunction; }) => Promise; diff --git a/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts b/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts index f2be005e58..fa58f23c87 100644 --- a/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts @@ -89,7 +89,7 @@ describe('Class: Router - Basic Routing', () => { const app = new Router(); const testEvent = createTestEvent('/test', 'GET'); - app.get('/test', async (_params, reqCtx) => { + app.get('/test', async (reqCtx) => { return { hasRequest: reqCtx.req instanceof Request, hasEvent: reqCtx.event === testEvent, @@ -126,8 +126,8 @@ describe('Class: Router - Basic Routing', () => { app.post('/', async () => { return { actualPath: '/todos' }; }); - app.get('/:todoId', async ({ todoId }) => { - return { actualPath: `/todos/${todoId}` }; + app.get('/:todoId', async (reqCtx) => { + return { actualPath: `/todos/${reqCtx.params.todoId}` }; }); // Act diff --git a/packages/event-handler/tests/unit/rest/Router/decorators.test.ts b/packages/event-handler/tests/unit/rest/Router/decorators.test.ts index 3510516bc0..4b6be75101 100644 --- a/packages/event-handler/tests/unit/rest/Router/decorators.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/decorators.test.ts @@ -398,7 +398,7 @@ describe('Class: Router - Decorators', () => { class Lambda { @app.get('/test') - public async getTest(_params: any, reqCtx: any) { + public async getTest(reqCtx: any) { return { hasRequest: reqCtx.req instanceof Request, hasEvent: reqCtx.event === testEvent, diff --git a/packages/event-handler/tests/unit/rest/Router/middleware.test.ts b/packages/event-handler/tests/unit/rest/Router/middleware.test.ts index c87d247aa9..a5080eb654 100644 --- a/packages/event-handler/tests/unit/rest/Router/middleware.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/middleware.test.ts @@ -138,8 +138,8 @@ describe('Class: Router - Middleware', () => { let middlewareParams: Record | undefined; let middlewareOptions: RequestContext | undefined; - app.use(async ({ params, reqCtx, next }) => { - middlewareParams = params; + app.use(async ({ reqCtx, next }) => { + middlewareParams = reqCtx.params; middlewareOptions = reqCtx; await next(); }); diff --git a/packages/event-handler/tests/unit/rest/middleware/compress.test.ts b/packages/event-handler/tests/unit/rest/middleware/compress.test.ts index 056b04219a..0aa8a1e289 100644 --- a/packages/event-handler/tests/unit/rest/middleware/compress.test.ts +++ b/packages/event-handler/tests/unit/rest/middleware/compress.test.ts @@ -1,8 +1,8 @@ import { gzipSync } from 'node:zlib'; import context from '@aws-lambda-powertools/testing-utils/context'; -import { Router } from 'src/rest/Router.js'; import { beforeEach, describe, expect, it } from 'vitest'; import { compress } from '../../../../src/rest/middleware/index.js'; +import { Router } from '../../../../src/rest/Router.js'; import { createSettingHeadersMiddleware, createTestEvent } from '../helpers.js'; describe('Compress Middleware', () => { From d281d46cbdd2e813005c5b5174aa017ace8f0671 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 11:28:21 +0100 Subject: [PATCH 178/255] chore(deps): bump the aws-cdk group across 1 directory with 3 updates (#4527) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Swopnil Dangol --- examples/app/package.json | 4 ++-- layers/package.json | 4 ++-- package-lock.json | 38 +++++++++++++++++------------------ packages/testing/package.json | 4 ++-- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 9949ae959c..49baa179f6 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -30,7 +30,7 @@ "devDependencies": { "@types/aws-lambda": "^8.10.152", "@types/node": "24.5.2", - "aws-cdk-lib": "^2.214.0", + "aws-cdk-lib": "^2.216.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", "tsx": "^4.20.5", @@ -49,7 +49,7 @@ "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", "@types/node": "24.5.2", - "aws-cdk": "^2.1029.1", + "aws-cdk": "^2.1029.2", "constructs": "^10.4.2", "esbuild": "^0.25.10", "typescript": "^5.9.2" diff --git a/layers/package.json b/layers/package.json index 9c157e0cda..8b9146feff 100644 --- a/layers/package.json +++ b/layers/package.json @@ -40,8 +40,8 @@ "source-map-support": "^0.5.21" }, "dependencies": { - "aws-cdk": "^2.1029.1", - "aws-cdk-lib": "^2.214.0", + "aws-cdk": "^2.1029.2", + "aws-cdk-lib": "^2.216.0", "esbuild": "^0.25.10", "tsx": "^4.20.5" } diff --git a/package-lock.json b/package-lock.json index db072ab500..d278440c94 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,7 +61,7 @@ "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", "@types/node": "24.5.2", - "aws-cdk": "^2.1029.1", + "aws-cdk": "^2.1029.2", "constructs": "^10.4.2", "esbuild": "^0.25.10", "typescript": "^5.9.2" @@ -69,7 +69,7 @@ "devDependencies": { "@types/aws-lambda": "^8.10.152", "@types/node": "24.5.2", - "aws-cdk-lib": "^2.214.0", + "aws-cdk-lib": "^2.216.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", "tsx": "^4.20.5", @@ -134,8 +134,8 @@ "version": "2.26.1", "license": "MIT-0", "dependencies": { - "aws-cdk": "^2.1029.1", - "aws-cdk-lib": "^2.214.0", + "aws-cdk": "^2.1029.2", + "aws-cdk-lib": "^2.216.0", "esbuild": "^0.25.10", "tsx": "^4.20.5" }, @@ -317,9 +317,9 @@ } }, "node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "48.9.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-48.9.0.tgz", - "integrity": "sha512-wZsFnrLLzowYA26yfV6Xe7h6ZAYXZwsAQLLBowxhVdR5NcJIeCWI0dAavNdrUdZgiEbYU4rkUX3AXYI+nC6FTA==", + "version": "48.10.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-48.10.0.tgz", + "integrity": "sha512-Y9wkKUiH9ey8jTmSgbYD3ZbEzmog9dXCb6V6KwfAwqfn3yiFq0l0BoQKIkhcuLQnrB8cYGM3MdmzdViwTL1F9g==", "bundleDependencies": [ "jsonschema", "semver" @@ -420,13 +420,13 @@ } }, "node_modules/@aws-cdk/toolkit-lib": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@aws-cdk/toolkit-lib/-/toolkit-lib-1.8.1.tgz", - "integrity": "sha512-aUlCh9Vq3Yc6wOJnYtUgkSnB3zlTWq5nlwj99OirIB9+i0CHaRr9J6yRUFv6FermbuZd+LmZNUwZT7f/GgND7w==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@aws-cdk/toolkit-lib/-/toolkit-lib-1.8.2.tgz", + "integrity": "sha512-O9Bjwm0QUs5LtseykAGDYg2GdWdf7DLzrf4dXok/9PR4r6HpTN3SfsEnW5hKV+b98GjNWJcMN1nFBVZP70NXSg==", "license": "Apache-2.0", "dependencies": { "@aws-cdk/cdk-assets-lib": "^1", - "@aws-cdk/cloud-assembly-schema": ">=48.9.0", + "@aws-cdk/cloud-assembly-schema": ">=48.10.0", "@aws-cdk/cloudformation-diff": "^2", "@aws-cdk/cx-api": "^2", "@aws-sdk/client-appsync": "^3", @@ -5991,9 +5991,9 @@ } }, "node_modules/aws-cdk": { - "version": "2.1029.1", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.1029.1.tgz", - "integrity": "sha512-etMnV7xwm1pBKOXl5zZKtNRt7ZIMocEe+GrZHVVp6oHsXqpPDi7iyPm7HR3CV1xe9yFjs3hZiHDebg+ONpccuw==", + "version": "2.1029.2", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.1029.2.tgz", + "integrity": "sha512-VkgxcbDLygHtnIuZHDYosQSlYwqmnYogzgB4zq+n6prHUP3Q9R8b/eOeo5bG+5OhE+r6+ZXrrVSmfISyaxA0og==", "license": "Apache-2.0", "bin": { "cdk": "bin/cdk" @@ -6006,9 +6006,9 @@ } }, "node_modules/aws-cdk-lib": { - "version": "2.214.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.214.0.tgz", - "integrity": "sha512-Mj9GSJkkXj8wjiy2pKARquOsiiHsu7tK1WDfdA8Db39hIznWWP+/KscI2iqnntDMeEmcj1QX25PbYT+6rq8zkw==", + "version": "2.216.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.216.0.tgz", + "integrity": "sha512-Y8u5HiMVeJp3HLJy8Ok3tr+Fgk0oUbhQfbSAyEBVZts7T9olEkQPfmBf1TiybcQmt/C/pjk3qQFHsGL+fgxtvw==", "bundleDependencies": [ "@balena/dockerignore", "case", @@ -10906,10 +10906,10 @@ "version": "2.26.1", "license": "MIT-0", "dependencies": { - "@aws-cdk/toolkit-lib": "^1.8.1", + "@aws-cdk/toolkit-lib": "^1.8.2", "@aws-sdk/client-lambda": "^3.893.0", "@smithy/util-utf8": "^4.0.0", - "aws-cdk-lib": "^2.214.0", + "aws-cdk-lib": "^2.216.0", "esbuild": "^0.25.10", "promise-retry": "^2.0.1" }, diff --git a/packages/testing/package.json b/packages/testing/package.json index 95c7dadc74..42b3bfb814 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -97,10 +97,10 @@ }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/testing#readme", "dependencies": { - "@aws-cdk/toolkit-lib": "^1.8.1", + "@aws-cdk/toolkit-lib": "^1.8.2", "@aws-sdk/client-lambda": "^3.893.0", "@smithy/util-utf8": "^4.0.0", - "aws-cdk-lib": "^2.214.0", + "aws-cdk-lib": "^2.216.0", "esbuild": "^0.25.10", "promise-retry": "^2.0.1" }, From fd156aa04806b3de37c16efb07bef111d411d31a Mon Sep 17 00:00:00 2001 From: Shrivarsha Poojary Date: Wed, 24 Sep 2025 00:38:11 +0530 Subject: [PATCH 179/255] chore(ci): add `registry-url` to `setup-node` steps to fix Scorecard packaging check (#4539) --- .github/workflows/make-release.yml | 1 + .github/workflows/publish-package.yml | 1 + README.md | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/make-release.yml b/.github/workflows/make-release.yml index 48e6ce418e..201c1d0a8a 100644 --- a/.github/workflows/make-release.yml +++ b/.github/workflows/make-release.yml @@ -52,6 +52,7 @@ jobs: with: node-version: "22" cache: "npm" + registry-url: 'https://registry.npmjs.org' - name: Setup auth tokens env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/publish-package.yml b/.github/workflows/publish-package.yml index 770a553aa9..1cdfab16f5 100644 --- a/.github/workflows/publish-package.yml +++ b/.github/workflows/publish-package.yml @@ -43,6 +43,7 @@ jobs: with: node-version: "22" cache: "npm" + registry-url: 'https://registry.npmjs.org' - name: Setup auth tokens env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/README.md b/README.md index a21b68b2b7..25660c273a 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,8 @@ ![GitHub Release](https://img.shields.io/github/v/release/aws-powertools/powertools-lambda-typescript?style=flat) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=aws-powertools_powertools-lambda-typescript&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=aws-powertools_powertools-lambda-typescript) [![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=aws-powertools_powertools-lambda-typescript&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=aws-powertools_powertools-lambda-typescript) -[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/aws-powertools/powertools-lambda-typescript/badge)](https://api.securityscorecards.dev/projects/github.com/aws-powertools/powertools-lambda-typescript) +[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/aws-powertools/powertools-lambda-typescript/badge)](https://scorecard.dev/viewer/?uri=github.com/aws-powertools/powertools-lambda-typescript) + [![Discord](https://img.shields.io/badge/Discord-Join_Community-7289da.svg)](https://discord.gg/B8zZKbbyET) Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.powertools.aws.dev/lambda/typescript/latest/#features). From f08b366b79152d338ebefb5a25caacade6846919 Mon Sep 17 00:00:00 2001 From: Swopnil Dangol Date: Tue, 23 Sep 2025 21:44:48 +0100 Subject: [PATCH 180/255] improv(event-handler): made error handler responses versatile (#4536) Co-authored-by: Stefano Vozza --- packages/event-handler/src/rest/Router.ts | 30 ++- packages/event-handler/src/rest/converters.ts | 14 +- packages/event-handler/src/rest/errors.ts | 9 +- packages/event-handler/src/types/index.ts | 1 - packages/event-handler/src/types/rest.ts | 9 +- .../unit/rest/Router/error-handling.test.ts | 181 +++++++++++++++++- 6 files changed, 219 insertions(+), 25 deletions(-) diff --git a/packages/event-handler/src/rest/Router.ts b/packages/event-handler/src/rest/Router.ts index 313fb88ffd..8d1766a2dc 100644 --- a/packages/event-handler/src/rest/Router.ts +++ b/packages/event-handler/src/rest/Router.ts @@ -4,7 +4,11 @@ import { isDevMode, } from '@aws-lambda-powertools/commons/utils/env'; import type { APIGatewayProxyResult, Context } from 'aws-lambda'; -import type { ResolveOptions } from '../types/index.js'; +import type { + HandlerResponse, + HttpStatusCode, + ResolveOptions, +} from '../types/index.js'; import type { ErrorConstructor, ErrorHandler, @@ -22,7 +26,6 @@ import { handlerResultToProxyResult, handlerResultToWebResponse, proxyEventToWebRequest, - webResponseToProxyResult, } from './converters.js'; import { ErrorHandlerRegistry } from './ErrorHandlerRegistry.js'; import { @@ -36,6 +39,7 @@ import { RouteHandlerRegistry } from './RouteHandlerRegistry.js'; import { composeMiddleware, isAPIGatewayProxyEvent, + isAPIGatewayProxyResult, isHttpMethod, } from './utils.js'; @@ -280,7 +284,9 @@ class Router { ...requestContext, scope: options?.scope, }); - return await webResponseToProxyResult(result); + const statusCode = + result instanceof Response ? result.status : result.statusCode; + return handlerResultToProxyResult(result, statusCode as HttpStatusCode); } } @@ -310,17 +316,31 @@ class Router { protected async handleError( error: Error, options: ErrorResolveOptions - ): Promise { + ): Promise { const handler = this.errorHandlerRegistry.resolve(error); if (handler !== null) { try { const { scope, ...reqCtx } = options; const body = await handler.apply(scope ?? this, [error, reqCtx]); + if (body instanceof Response || isAPIGatewayProxyResult(body)) { + return body; + } + if (!body.statusCode) { + if (error instanceof NotFoundError) { + body.statusCode = HttpErrorCodes.NOT_FOUND; + } else if (error instanceof MethodNotAllowedError) { + body.statusCode = HttpErrorCodes.METHOD_NOT_ALLOWED; + } + } return new Response(JSON.stringify(body), { - status: body.statusCode, + status: + (body.statusCode as number) ?? HttpErrorCodes.INTERNAL_SERVER_ERROR, headers: { 'Content-Type': 'application/json' }, }); } catch (handlerError) { + if (handlerError instanceof ServiceError) { + return await this.handleError(handlerError, options); + } return this.#defaultErrorHandler(handlerError as Error); } } diff --git a/packages/event-handler/src/rest/converters.ts b/packages/event-handler/src/rest/converters.ts index d82f2ada5c..30948b3d9b 100644 --- a/packages/event-handler/src/rest/converters.ts +++ b/packages/event-handler/src/rest/converters.ts @@ -1,6 +1,10 @@ import type { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; -import type { CompressionOptions, HandlerResponse } from '../types/rest.js'; -import { COMPRESSION_ENCODING_TYPES } from './constants.js'; +import type { + CompressionOptions, + HandlerResponse, + HttpStatusCode, +} from '../types/rest.js'; +import { COMPRESSION_ENCODING_TYPES, HttpErrorCodes } from './constants.js'; import { isAPIGatewayProxyResult } from './utils.js'; /** @@ -181,10 +185,12 @@ export const handlerResultToWebResponse = ( * Handles APIGatewayProxyResult, Response objects, and plain objects. * * @param response - The handler response (APIGatewayProxyResult, Response, or plain object) + * @param statusCode - The response status code to return * @returns An API Gateway proxy result */ export const handlerResultToProxyResult = async ( - response: HandlerResponse + response: HandlerResponse, + statusCode: HttpStatusCode = HttpErrorCodes.OK ): Promise => { if (isAPIGatewayProxyResult(response)) { return response; @@ -193,7 +199,7 @@ export const handlerResultToProxyResult = async ( return await webResponseToProxyResult(response); } return { - statusCode: 200, + statusCode, body: JSON.stringify(response), headers: { 'content-type': 'application/json' }, isBase64Encoded: false, diff --git a/packages/event-handler/src/rest/errors.ts b/packages/event-handler/src/rest/errors.ts index f03421bc9c..80fa0cbc2a 100644 --- a/packages/event-handler/src/rest/errors.ts +++ b/packages/event-handler/src/rest/errors.ts @@ -1,4 +1,5 @@ -import type { ErrorResponse, HttpStatusCode } from '../types/rest.js'; +import type { JSONValue } from '@aws-lambda-powertools/commons/types'; +import type { HandlerResponse, HttpStatusCode } from '../types/rest.js'; import { HttpErrorCodes } from './constants.js'; export class RouteMatchingError extends Error { @@ -34,12 +35,14 @@ export abstract class ServiceError extends Error { this.details = details; } - toJSON(): ErrorResponse { + toJSON(): HandlerResponse { return { statusCode: this.statusCode, error: this.errorType, message: this.message, - ...(this.details && { details: this.details }), + ...(this.details && { + details: this.details as Record, + }), }; } } diff --git a/packages/event-handler/src/types/index.ts b/packages/event-handler/src/types/index.ts index 56e017c563..b32b78c70f 100644 --- a/packages/event-handler/src/types/index.ts +++ b/packages/event-handler/src/types/index.ts @@ -35,7 +35,6 @@ export type { CorsOptions, ErrorHandler, ErrorResolveOptions, - ErrorResponse, HandlerResponse, HttpMethod, HttpStatusCode, diff --git a/packages/event-handler/src/types/rest.ts b/packages/event-handler/src/types/rest.ts index 456a1dec9d..188d3ff29a 100644 --- a/packages/event-handler/src/types/rest.ts +++ b/packages/event-handler/src/types/rest.ts @@ -8,12 +8,6 @@ import type { Route } from '../rest/Route.js'; import type { Router } from '../rest/Router.js'; import type { ResolveOptions } from './common.js'; -type ErrorResponse = { - statusCode: HttpStatusCode; - error: string; - message: string; -}; - type RequestContext = { req: Request; event: APIGatewayProxyEvent; @@ -27,7 +21,7 @@ type ErrorResolveOptions = RequestContext & ResolveOptions; type ErrorHandler = ( error: T, reqCtx: RequestContext -) => Promise; +) => Promise; interface ErrorConstructor { new (...args: any[]): T; @@ -165,7 +159,6 @@ export type { CompiledRoute, CorsOptions, DynamicRoute, - ErrorResponse, ErrorConstructor, ErrorHandlerRegistryOptions, ErrorHandler, diff --git a/packages/event-handler/tests/unit/rest/Router/error-handling.test.ts b/packages/event-handler/tests/unit/rest/Router/error-handling.test.ts index d18778bcb0..9795117dc1 100644 --- a/packages/event-handler/tests/unit/rest/Router/error-handling.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/error-handling.test.ts @@ -5,6 +5,7 @@ import { HttpErrorCodes, InternalServerError, MethodNotAllowedError, + NotFoundError, Router, } from '../../../../src/rest/index.js'; import { createTestEvent } from '../helpers.js'; @@ -49,7 +50,6 @@ describe('Class: Router - Error Handling', () => { const app = new Router(); app.notFound(async (error) => ({ - statusCode: HttpErrorCodes.NOT_FOUND, error: 'Not Found', message: `Custom: ${error.message}`, })); @@ -64,9 +64,9 @@ describe('Class: Router - Error Handling', () => { expect(result).toEqual({ statusCode: HttpErrorCodes.NOT_FOUND, body: JSON.stringify({ - statusCode: HttpErrorCodes.NOT_FOUND, error: 'Not Found', message: 'Custom: Route /nonexistent for method GET not found', + statusCode: HttpErrorCodes.NOT_FOUND, }), headers: { 'content-type': 'application/json' }, isBase64Encoded: false, @@ -78,7 +78,6 @@ describe('Class: Router - Error Handling', () => { const app = new Router(); app.methodNotAllowed(async (error) => ({ - statusCode: HttpErrorCodes.METHOD_NOT_ALLOWED, error: 'Method Not Allowed', message: `Custom: ${error.message}`, })); @@ -94,9 +93,9 @@ describe('Class: Router - Error Handling', () => { expect(result).toEqual({ statusCode: HttpErrorCodes.METHOD_NOT_ALLOWED, body: JSON.stringify({ - statusCode: HttpErrorCodes.METHOD_NOT_ALLOWED, error: 'Method Not Allowed', message: 'Custom: POST not allowed', + statusCode: HttpErrorCodes.METHOD_NOT_ALLOWED, }), headers: { 'content-type': 'application/json' }, isBase64Encoded: false, @@ -393,4 +392,178 @@ describe('Class: Router - Error Handling', () => { expect(body.hasEvent).toBe(true); expect(body.hasContext).toBe(true); }); + + it('handles returning a Response from the error handler', async () => { + // Prepare + const app = new Router(); + + app.errorHandler( + BadRequestError, + async () => + new Response( + JSON.stringify({ + foo: 'bar', + }), + { + status: HttpErrorCodes.BAD_REQUEST, + headers: { + 'content-type': 'application/json', + }, + } + ) + ); + + app.get('/test', () => { + throw new BadRequestError('test error'); + }); + + // Act + const result = await app.resolve(createTestEvent('/test', 'GET'), context); + + // Assess + expect(result).toEqual({ + statusCode: HttpErrorCodes.BAD_REQUEST, + body: JSON.stringify({ + foo: 'bar', + }), + headers: { 'content-type': 'application/json' }, + isBase64Encoded: false, + }); + }); + + it('handles returning an API Gateway Proxy result from the error handler', async () => { + // Prepare + const app = new Router(); + + app.errorHandler(BadRequestError, async () => ({ + statusCode: HttpErrorCodes.BAD_REQUEST, + body: JSON.stringify({ + foo: 'bar', + }), + })); + + app.get('/test', () => { + throw new BadRequestError('test error'); + }); + + // Act + const result = await app.resolve(createTestEvent('/test', 'GET'), context); + + // Assess + expect(result).toEqual({ + statusCode: HttpErrorCodes.BAD_REQUEST, + body: JSON.stringify({ + foo: 'bar', + }), + }); + }); + + it('handles returning a JSONObject from the error handler', async () => { + // Prepare + const app = new Router(); + + app.errorHandler(BadRequestError, async () => ({ foo: 'bar' })); + + app.get('/test', () => { + throw new BadRequestError('test error'); + }); + + // Act + const result = await app.resolve(createTestEvent('/test', 'GET'), context); + + // Assess + expect(result).toEqual({ + statusCode: HttpErrorCodes.INTERNAL_SERVER_ERROR, + body: JSON.stringify({ + foo: 'bar', + }), + headers: { 'content-type': 'application/json' }, + isBase64Encoded: false, + }); + }); + + it('handles throwing a built in NotFound error from the error handler', async () => { + // Prepare + const app = new Router(); + + app.errorHandler(BadRequestError, async () => { + throw new NotFoundError('This error is thrown from the error handler'); + }); + + app.get('/test', () => { + throw new BadRequestError('test error'); + }); + + // Act + const result = await app.resolve(createTestEvent('/test', 'GET'), context); + + // Assess + expect(result).toEqual({ + statusCode: HttpErrorCodes.NOT_FOUND, + body: JSON.stringify({ + statusCode: HttpErrorCodes.NOT_FOUND, + error: 'NotFoundError', + message: 'This error is thrown from the error handler', + }), + headers: { 'content-type': 'application/json' }, + isBase64Encoded: false, + }); + }); + + it('handles throwing a built in MethodNotAllowedError error from the error handler', async () => { + // Prepare + const app = new Router(); + + app.errorHandler(BadRequestError, async () => { + throw new MethodNotAllowedError( + 'This error is thrown from the error handler' + ); + }); + + app.get('/test', () => { + throw new BadRequestError('test error'); + }); + + // Act + const result = await app.resolve(createTestEvent('/test', 'GET'), context); + + // Assess + expect(result).toEqual({ + statusCode: HttpErrorCodes.METHOD_NOT_ALLOWED, + body: JSON.stringify({ + statusCode: HttpErrorCodes.METHOD_NOT_ALLOWED, + error: 'MethodNotAllowedError', + message: 'This error is thrown from the error handler', + }), + headers: { 'content-type': 'application/json' }, + isBase64Encoded: false, + }); + }); + + it('handles throwing a generic error from the error handler', async () => { + // Prepare + vi.stubEnv('POWERTOOLS_DEV', 'true'); + const app = new Router(); + + app.errorHandler(BadRequestError, async () => { + throw new Error('This error is thrown from the error handler'); + }); + + app.get('/test', () => { + throw new BadRequestError('test error'); + }); + + // Act + const result = await app.resolve(createTestEvent('/test', 'GET'), context); + + // Assess + expect(result.statusCode).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + const body = JSON.parse(result.body); + expect(body.error).toBe('Internal Server Error'); + expect(body.message).toBe('This error is thrown from the error handler'); + expect(body.stack).toBeDefined(); + expect(body.details).toEqual({ + errorName: 'Error', + }); + }); }); From 3d1255c145f85709b8ab4c4ec9e143ceb2a26ec9 Mon Sep 17 00:00:00 2001 From: guillemcomerma <69576384+guillemcomerma@users.noreply.github.com> Date: Wed, 24 Sep 2025 09:53:38 +0200 Subject: [PATCH 181/255] docs(idempotency): fix dataKeywordArgument reference and remove unused test code (#4537) Co-authored-by: guillempc Co-authored-by: Andrea Amorosi --- packages/idempotency/src/makeIdempotent.ts | 71 ++++++++++++++----- .../tests/unit/IdempotencyHandler.test.ts | 1 - 2 files changed, 54 insertions(+), 18 deletions(-) diff --git a/packages/idempotency/src/makeIdempotent.ts b/packages/idempotency/src/makeIdempotent.ts index 31718d80da..46ed2b09c7 100644 --- a/packages/idempotency/src/makeIdempotent.ts +++ b/packages/idempotency/src/makeIdempotent.ts @@ -44,36 +44,73 @@ const isOptionsWithDataIndexArgument = ( }; /** - * Use function wrapper to make your function idempotent. + * Function wrapper to make any function idempotent. + * + * The `makeIdempotent` function is a higher-order function that takes another function and returns a new version of that function with idempotency behavior. + * This means that if the function is called multiple times with the same input, it will return the same result without re-executing the original function logic. + * + * By default, the entire first argument is hashed to create the idempotency key. You can customize this behavior: + * - Use {@link IdempotencyConfig.eventKeyJmesPath | `eventKeyJmesPath`} to hash only a subset of the payload + * - Use {@link ItempotentFunctionOptions.dataIndexArgument | `dataIndexArgument`} to hash a different function argument + * + * + * **Using a subset of the payload** + * * @example - * ```ts - * // this is your processing function with an example record { transactionId: '123', foo: 'bar' } - * const processRecord = (record: Record): any => { - * // you custom processing logic + * ```typescript + * import { makeIdempotent, IdempotencyConfig } from '@aws-lambda-powertools/idempotency'; + * import { DynamoDBPersistenceLayer } from '@aws-lambda-powertools/idempotency/dynamodb'; + * + * const processRecord = (record: Record): unknown => { + * // your processing logic * return result; * }; * - * // we use wrapper to make processing function idempotent with DynamoDBPersistenceLayer * const processIdempotently = makeIdempotent(processRecord, { - * persistenceStore: new DynamoDBPersistenceLayer() - * dataKeywordArgument: 'transactionId', // keyword argument to hash the payload and the result + * persistenceStore: new DynamoDBPersistenceLayer({ tableName: 'idempotency-table' }), + * config: new IdempotencyConfig({ + * eventKeyJmesPath: 'transactionId', // hash only this field as idempotency key + * }), * }); * - * export const handler = async ( - * _event: EventRecords, - * _context: Context - * ): Promise => { - * for (const record of _event.records) { - * const result = await processIdempotently(record); - * // do something with the result + * export const handler = async (event: { records: Record[] }) => { + * for (const record of event.records) { + * // use the idempotent function + * const result = await processIdempotently(record); + * // ... do something with the result * } + * }; + *``` + * + * **Using a different function argument (useful for multi-parameter functions)** + * + * @example + * ```typescript + * import { makeIdempotent } from '@aws-lambda-powertools/idempotency'; + * import { DynamoDBPersistenceLayer } from '@aws-lambda-powertools/idempotency/dynamodb'; * - * return Promise.resolve(); + * const processRecord = (record: Record, userId: string): unknown => { + * // your processing logic + * return result; * }; * + * const processIdempotently = makeIdempotent(processRecord, { + * persistenceStore: new DynamoDBPersistenceLayer({ tableName: 'idempotency-table' }), + * dataIndexArgument: 1, // hash the userId (second argument) instead of first (record) + * }); + * + * export const handler = async (event: { records: Record[]; userId: string }) => { + * for (const record of event.records) { + * const userId = event.userId; + * // use the idempotent function + * const result = await processIdempotently(record, userId); + * // ... do something with the result + * } + * }; + * ``` + * * @param fn - the function to make idempotent * @param options - the options to configure the idempotency behavior - * ``` */ function makeIdempotent( fn: Func, diff --git a/packages/idempotency/tests/unit/IdempotencyHandler.test.ts b/packages/idempotency/tests/unit/IdempotencyHandler.test.ts index 883abb0219..ebcdbddf59 100644 --- a/packages/idempotency/tests/unit/IdempotencyHandler.test.ts +++ b/packages/idempotency/tests/unit/IdempotencyHandler.test.ts @@ -20,7 +20,6 @@ const mockFunctionPayloadToBeHashed = {}; const persistenceStore = new PersistenceLayerTestClass(); const mockIdempotencyOptions = { persistenceStore, - dataKeywordArgument: 'testKeywordArgument', config: new IdempotencyConfig({}), }; From e53aa8816325f21510706e3f9e62fb0a76692915 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Wed, 24 Sep 2025 10:49:21 +0200 Subject: [PATCH 182/255] improv(event-handler): rename HttpErrorCodes to HttpStatusCodes (#4543) --- .../rest/gettingStarted_error_handling.ts | 4 +- .../rest/gettingStarted_handle_not_found.ts | 4 +- packages/event-handler/src/rest/Router.ts | 11 +-- packages/event-handler/src/rest/constants.ts | 33 ++++--- packages/event-handler/src/rest/converters.ts | 4 +- packages/event-handler/src/rest/errors.ts | 68 ++++++++++----- packages/event-handler/src/rest/index.ts | 2 +- .../event-handler/src/rest/middleware/cors.ts | 4 +- packages/event-handler/src/types/rest.ts | 4 +- .../unit/rest/ErrorHandlerRegistry.test.ts | 26 +++--- .../unit/rest/RouteHandlerRegistry.test.ts | 41 ++------- .../unit/rest/Router/basic-routing.test.ts | 4 +- .../tests/unit/rest/Router/decorators.test.ts | 36 ++++---- .../unit/rest/Router/error-handling.test.ts | 86 +++++++++---------- .../tests/unit/rest/Router/middleware.test.ts | 12 +-- .../tests/unit/rest/errors.test.ts | 42 ++++----- .../event-handler/tests/unit/rest/helpers.ts | 6 +- .../tests/unit/rest/utils.test.ts | 18 ++-- 18 files changed, 211 insertions(+), 194 deletions(-) diff --git a/examples/snippets/event-handler/rest/gettingStarted_error_handling.ts b/examples/snippets/event-handler/rest/gettingStarted_error_handling.ts index 9465fa6d02..87431c151a 100644 --- a/examples/snippets/event-handler/rest/gettingStarted_error_handling.ts +++ b/examples/snippets/event-handler/rest/gettingStarted_error_handling.ts @@ -2,7 +2,7 @@ declare function getTodoById(todoId: unknown): Promise<{ id: string } & T>; declare class GetTodoError extends Error {} import { - HttpErrorCodes, + HttpStatusCodes, Router, } from '@aws-lambda-powertools/event-handler/experimental-rest'; import { Logger } from '@aws-lambda-powertools/logger'; @@ -15,7 +15,7 @@ app.errorHandler(GetTodoError, async (error, reqCtx) => { logger.error('Unable to get todo', { error }); return { - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, message: `Bad request: ${error.message} - ${reqCtx.request.headers.get('x-correlation-id')}`, error: 'BadRequest', }; diff --git a/examples/snippets/event-handler/rest/gettingStarted_handle_not_found.ts b/examples/snippets/event-handler/rest/gettingStarted_handle_not_found.ts index 970fc7b294..7a44fbf0fd 100644 --- a/examples/snippets/event-handler/rest/gettingStarted_handle_not_found.ts +++ b/examples/snippets/event-handler/rest/gettingStarted_handle_not_found.ts @@ -1,5 +1,5 @@ import { - HttpErrorCodes, + HttpStatusCodes, Router, } from '@aws-lambda-powertools/event-handler/experimental-rest'; import { Logger } from '@aws-lambda-powertools/logger'; @@ -12,7 +12,7 @@ app.notFound(async (error, reqCtx) => { logger.error('Unable to get todo', { error }); return { - statusCode: HttpErrorCodes.IM_A_TEAPOT, + statusCode: HttpStatusCodes.IM_A_TEAPOT, body: "I'm a teapot!", headers: { 'x-correlation-id': reqCtx.request.headers.get('x-correlation-id'), diff --git a/packages/event-handler/src/rest/Router.ts b/packages/event-handler/src/rest/Router.ts index 8d1766a2dc..cbff596d09 100644 --- a/packages/event-handler/src/rest/Router.ts +++ b/packages/event-handler/src/rest/Router.ts @@ -21,7 +21,7 @@ import type { RestRouterOptions, RouteHandler, } from '../types/rest.js'; -import { HttpErrorCodes, HttpVerbs } from './constants.js'; +import { HttpStatusCodes, HttpVerbs } from './constants.js'; import { handlerResultToProxyResult, handlerResultToWebResponse, @@ -214,7 +214,7 @@ class Router { // We can't throw a MethodNotAllowedError outside the try block as it // will be converted to an internal server error by the API Gateway runtime return { - statusCode: HttpErrorCodes.METHOD_NOT_ALLOWED, + statusCode: HttpStatusCodes.METHOD_NOT_ALLOWED, body: '', }; } @@ -327,14 +327,15 @@ class Router { } if (!body.statusCode) { if (error instanceof NotFoundError) { - body.statusCode = HttpErrorCodes.NOT_FOUND; + body.statusCode = HttpStatusCodes.NOT_FOUND; } else if (error instanceof MethodNotAllowedError) { - body.statusCode = HttpErrorCodes.METHOD_NOT_ALLOWED; + body.statusCode = HttpStatusCodes.METHOD_NOT_ALLOWED; } } return new Response(JSON.stringify(body), { status: - (body.statusCode as number) ?? HttpErrorCodes.INTERNAL_SERVER_ERROR, + (body.statusCode as number) ?? + HttpStatusCodes.INTERNAL_SERVER_ERROR, headers: { 'Content-Type': 'application/json' }, }); } catch (handlerError) { diff --git a/packages/event-handler/src/rest/constants.ts b/packages/event-handler/src/rest/constants.ts index ae9a80103f..5ec0377e6d 100644 --- a/packages/event-handler/src/rest/constants.ts +++ b/packages/event-handler/src/rest/constants.ts @@ -1,4 +1,4 @@ -export const HttpVerbs = { +const HttpVerbs = { GET: 'GET', POST: 'POST', PUT: 'PUT', @@ -8,7 +8,7 @@ export const HttpVerbs = { OPTIONS: 'OPTIONS', } as const; -export const HttpErrorCodes = { +const HttpStatusCodes = { // 1xx Informational CONTINUE: 100, SWITCHING_PROTOCOLS: 101, @@ -82,16 +82,16 @@ export const HttpErrorCodes = { NETWORK_AUTHENTICATION_REQUIRED: 511, } as const; -export const PARAM_PATTERN = /:([a-zA-Z_]\w*)(?=\/|$)/g; +const PARAM_PATTERN = /:([a-zA-Z_]\w*)(?=\/|$)/g; -export const SAFE_CHARS = "-._~()'!*:@,;=+&$"; +const SAFE_CHARS = "-._~()'!*:@,;=+&$"; -export const UNSAFE_CHARS = '%<> \\[\\]{}|^'; +const UNSAFE_CHARS = '%<> \\[\\]{}|^'; /** * Default CORS configuration */ -export const DEFAULT_CORS_OPTIONS = { +const DEFAULT_CORS_OPTIONS = { origin: '*', allowMethods: ['DELETE', 'GET', 'HEAD', 'PATCH', 'POST', 'PUT'], allowHeaders: [ @@ -102,17 +102,28 @@ export const DEFAULT_CORS_OPTIONS = { 'X-Amz-Security-Token', ], exposeHeaders: [], - credentials: false + credentials: false, }; -export const DEFAULT_COMPRESSION_RESPONSE_THRESHOLD = 1024; +const DEFAULT_COMPRESSION_RESPONSE_THRESHOLD = 1024; -export const CACHE_CONTROL_NO_TRANSFORM_REGEX = - /(?:^|,)\s*?no-transform\s*?(?:,|$)/i; +const CACHE_CONTROL_NO_TRANSFORM_REGEX = /(?:^|,)\s*?no-transform\s*?(?:,|$)/i; -export const COMPRESSION_ENCODING_TYPES = { +const COMPRESSION_ENCODING_TYPES = { GZIP: 'gzip', DEFLATE: 'deflate', IDENTITY: 'identity', ANY: '*', } as const; + +export { + HttpVerbs, + HttpStatusCodes, + PARAM_PATTERN, + SAFE_CHARS, + UNSAFE_CHARS, + DEFAULT_CORS_OPTIONS, + DEFAULT_COMPRESSION_RESPONSE_THRESHOLD, + CACHE_CONTROL_NO_TRANSFORM_REGEX, + COMPRESSION_ENCODING_TYPES, +}; diff --git a/packages/event-handler/src/rest/converters.ts b/packages/event-handler/src/rest/converters.ts index 30948b3d9b..d47302ebf6 100644 --- a/packages/event-handler/src/rest/converters.ts +++ b/packages/event-handler/src/rest/converters.ts @@ -4,7 +4,7 @@ import type { HandlerResponse, HttpStatusCode, } from '../types/rest.js'; -import { COMPRESSION_ENCODING_TYPES, HttpErrorCodes } from './constants.js'; +import { COMPRESSION_ENCODING_TYPES, HttpStatusCodes } from './constants.js'; import { isAPIGatewayProxyResult } from './utils.js'; /** @@ -190,7 +190,7 @@ export const handlerResultToWebResponse = ( */ export const handlerResultToProxyResult = async ( response: HandlerResponse, - statusCode: HttpStatusCode = HttpErrorCodes.OK + statusCode: HttpStatusCode = HttpStatusCodes.OK ): Promise => { if (isAPIGatewayProxyResult(response)) { return response; diff --git a/packages/event-handler/src/rest/errors.ts b/packages/event-handler/src/rest/errors.ts index 80fa0cbc2a..ceef79a7e9 100644 --- a/packages/event-handler/src/rest/errors.ts +++ b/packages/event-handler/src/rest/errors.ts @@ -1,8 +1,8 @@ import type { JSONValue } from '@aws-lambda-powertools/commons/types'; import type { HandlerResponse, HttpStatusCode } from '../types/rest.js'; -import { HttpErrorCodes } from './constants.js'; +import { HttpStatusCodes } from './constants.js'; -export class RouteMatchingError extends Error { +class RouteMatchingError extends Error { constructor( message: string, public readonly path: string, @@ -13,14 +13,14 @@ export class RouteMatchingError extends Error { } } -export class ParameterValidationError extends RouteMatchingError { +class ParameterValidationError extends RouteMatchingError { constructor(public readonly issues: string[]) { super(`Parameter validation failed: ${issues.join(', ')}`, '', ''); this.name = 'ParameterValidationError'; } } -export abstract class ServiceError extends Error { +abstract class ServiceError extends Error { abstract readonly statusCode: HttpStatusCode; abstract readonly errorType: string; public readonly details?: Record; @@ -47,8 +47,8 @@ export abstract class ServiceError extends Error { } } -export class BadRequestError extends ServiceError { - readonly statusCode = HttpErrorCodes.BAD_REQUEST; +class BadRequestError extends ServiceError { + readonly statusCode = HttpStatusCodes.BAD_REQUEST; readonly errorType = 'BadRequestError'; constructor( @@ -57,11 +57,12 @@ export class BadRequestError extends ServiceError { details?: Record ) { super(message, options, details); + this.name = 'BadRequestError'; } } -export class UnauthorizedError extends ServiceError { - readonly statusCode = HttpErrorCodes.UNAUTHORIZED; +class UnauthorizedError extends ServiceError { + readonly statusCode = HttpStatusCodes.UNAUTHORIZED; readonly errorType = 'UnauthorizedError'; constructor( @@ -70,11 +71,12 @@ export class UnauthorizedError extends ServiceError { details?: Record ) { super(message, options, details); + this.name = 'UnauthorizedError'; } } -export class ForbiddenError extends ServiceError { - readonly statusCode = HttpErrorCodes.FORBIDDEN; +class ForbiddenError extends ServiceError { + readonly statusCode = HttpStatusCodes.FORBIDDEN; readonly errorType = 'ForbiddenError'; constructor( @@ -83,11 +85,12 @@ export class ForbiddenError extends ServiceError { details?: Record ) { super(message, options, details); + this.name = 'ForbiddenError'; } } -export class NotFoundError extends ServiceError { - readonly statusCode = HttpErrorCodes.NOT_FOUND; +class NotFoundError extends ServiceError { + readonly statusCode = HttpStatusCodes.NOT_FOUND; readonly errorType = 'NotFoundError'; constructor( @@ -96,11 +99,12 @@ export class NotFoundError extends ServiceError { details?: Record ) { super(message, options, details); + this.name = 'NotFoundError'; } } -export class MethodNotAllowedError extends ServiceError { - readonly statusCode = HttpErrorCodes.METHOD_NOT_ALLOWED; +class MethodNotAllowedError extends ServiceError { + readonly statusCode = HttpStatusCodes.METHOD_NOT_ALLOWED; readonly errorType = 'MethodNotAllowedError'; constructor( @@ -109,11 +113,12 @@ export class MethodNotAllowedError extends ServiceError { details?: Record ) { super(message, options, details); + this.name = 'MethodNotAllowedError'; } } -export class RequestTimeoutError extends ServiceError { - readonly statusCode = HttpErrorCodes.REQUEST_TIMEOUT; +class RequestTimeoutError extends ServiceError { + readonly statusCode = HttpStatusCodes.REQUEST_TIMEOUT; readonly errorType = 'RequestTimeoutError'; constructor( @@ -122,11 +127,12 @@ export class RequestTimeoutError extends ServiceError { details?: Record ) { super(message, options, details); + this.name = 'RequestTimeoutError'; } } -export class RequestEntityTooLargeError extends ServiceError { - readonly statusCode = HttpErrorCodes.REQUEST_ENTITY_TOO_LARGE; +class RequestEntityTooLargeError extends ServiceError { + readonly statusCode = HttpStatusCodes.REQUEST_ENTITY_TOO_LARGE; readonly errorType = 'RequestEntityTooLargeError'; constructor( @@ -135,11 +141,12 @@ export class RequestEntityTooLargeError extends ServiceError { details?: Record ) { super(message, options, details); + this.name = 'RequestEntityTooLargeError'; } } -export class InternalServerError extends ServiceError { - readonly statusCode = HttpErrorCodes.INTERNAL_SERVER_ERROR; +class InternalServerError extends ServiceError { + readonly statusCode = HttpStatusCodes.INTERNAL_SERVER_ERROR; readonly errorType = 'InternalServerError'; constructor( @@ -148,11 +155,12 @@ export class InternalServerError extends ServiceError { details?: Record ) { super(message, options, details); + this.name = 'InternalServerError'; } } -export class ServiceUnavailableError extends ServiceError { - readonly statusCode = HttpErrorCodes.SERVICE_UNAVAILABLE; +class ServiceUnavailableError extends ServiceError { + readonly statusCode = HttpStatusCodes.SERVICE_UNAVAILABLE; readonly errorType = 'ServiceUnavailableError'; constructor( @@ -161,5 +169,21 @@ export class ServiceUnavailableError extends ServiceError { details?: Record ) { super(message, options, details); + this.name = 'ServiceUnavailableError'; } } + +export { + BadRequestError, + ForbiddenError, + InternalServerError, + MethodNotAllowedError, + NotFoundError, + ParameterValidationError, + RequestEntityTooLargeError, + RequestTimeoutError, + RouteMatchingError, + ServiceError, + ServiceUnavailableError, + UnauthorizedError, +}; diff --git a/packages/event-handler/src/rest/index.ts b/packages/event-handler/src/rest/index.ts index 06efe93224..2a4d605ea4 100644 --- a/packages/event-handler/src/rest/index.ts +++ b/packages/event-handler/src/rest/index.ts @@ -1,4 +1,4 @@ -export { HttpErrorCodes, HttpVerbs } from './constants.js'; +export { HttpStatusCodes, HttpVerbs } from './constants.js'; export { handlerResultToProxyResult, handlerResultToWebResponse, diff --git a/packages/event-handler/src/rest/middleware/cors.ts b/packages/event-handler/src/rest/middleware/cors.ts index a1ac697bfb..25c780e39b 100644 --- a/packages/event-handler/src/rest/middleware/cors.ts +++ b/packages/event-handler/src/rest/middleware/cors.ts @@ -1,7 +1,7 @@ import type { CorsOptions, Middleware } from '../../types/rest.js'; import { DEFAULT_CORS_OPTIONS, - HttpErrorCodes, + HttpStatusCodes, HttpVerbs, } from '../constants.js'; @@ -123,7 +123,7 @@ export const cors = (options?: CorsOptions): Middleware => { reqCtx.res.headers.append('access-control-allow-headers', header); } return new Response(null, { - status: HttpErrorCodes.NO_CONTENT, + status: HttpStatusCodes.NO_CONTENT, headers: reqCtx.res.headers, }); } diff --git a/packages/event-handler/src/types/rest.ts b/packages/event-handler/src/types/rest.ts index 188d3ff29a..1c9925ce22 100644 --- a/packages/event-handler/src/types/rest.ts +++ b/packages/event-handler/src/types/rest.ts @@ -3,7 +3,7 @@ import type { JSONObject, } from '@aws-lambda-powertools/commons/types'; import type { APIGatewayProxyEvent, Context } from 'aws-lambda'; -import type { HttpErrorCodes, HttpVerbs } from '../rest/constants.js'; +import type { HttpStatusCodes, HttpVerbs } from '../rest/constants.js'; import type { Route } from '../rest/Route.js'; import type { Router } from '../rest/Router.js'; import type { ResolveOptions } from './common.js'; @@ -61,7 +61,7 @@ type RouteHandler = ( type HttpMethod = keyof typeof HttpVerbs; -type HttpStatusCode = (typeof HttpErrorCodes)[keyof typeof HttpErrorCodes]; +type HttpStatusCode = (typeof HttpStatusCodes)[keyof typeof HttpStatusCodes]; type Path = `/${string}`; diff --git a/packages/event-handler/tests/unit/rest/ErrorHandlerRegistry.test.ts b/packages/event-handler/tests/unit/rest/ErrorHandlerRegistry.test.ts index 1dbef04f6a..7b0fc9a857 100644 --- a/packages/event-handler/tests/unit/rest/ErrorHandlerRegistry.test.ts +++ b/packages/event-handler/tests/unit/rest/ErrorHandlerRegistry.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; import { ErrorHandlerRegistry } from '../../../src/rest/ErrorHandlerRegistry.js'; -import { HttpErrorCodes } from '../../../src/rest/index.js'; +import { HttpStatusCodes } from '../../../src/rest/index.js'; import type { HttpStatusCode, RequestContext, @@ -39,8 +39,8 @@ describe('Class: ErrorHandlerRegistry', () => { it('logs a warning when registering a duplicate error handler', () => { // Prepare const registry = new ErrorHandlerRegistry({ logger: console }); - const handler1 = createErrorHandler(HttpErrorCodes.BAD_REQUEST, 'first'); - const handler2 = createErrorHandler(HttpErrorCodes.NOT_FOUND, 'second'); + const handler1 = createErrorHandler(HttpStatusCodes.BAD_REQUEST, 'first'); + const handler2 = createErrorHandler(HttpStatusCodes.NOT_FOUND, 'second'); // Act registry.register(CustomError, handler1); @@ -58,7 +58,7 @@ describe('Class: ErrorHandlerRegistry', () => { it('registers handlers for multiple error types', () => { // Prepare const registry = new ErrorHandlerRegistry({ logger: console }); - const handler = createErrorHandler(HttpErrorCodes.BAD_REQUEST); + const handler = createErrorHandler(HttpStatusCodes.BAD_REQUEST); // Act registry.register([CustomError, AnotherError], handler); @@ -71,9 +71,9 @@ describe('Class: ErrorHandlerRegistry', () => { it('resolves handlers using exact constructor match', () => { // Prepare const registry = new ErrorHandlerRegistry({ logger: console }); - const customHandler = createErrorHandler(HttpErrorCodes.BAD_REQUEST); + const customHandler = createErrorHandler(HttpStatusCodes.BAD_REQUEST); const anotherHandler = createErrorHandler( - HttpErrorCodes.INTERNAL_SERVER_ERROR + HttpStatusCodes.INTERNAL_SERVER_ERROR ); // Act @@ -88,7 +88,7 @@ describe('Class: ErrorHandlerRegistry', () => { it('resolves handlers using instanceof for inheritance', () => { // Prepare const registry = new ErrorHandlerRegistry({ logger: console }); - const baseHandler = createErrorHandler(HttpErrorCodes.BAD_REQUEST); + const baseHandler = createErrorHandler(HttpStatusCodes.BAD_REQUEST); // Act registry.register(CustomError, baseHandler); @@ -101,7 +101,7 @@ describe('Class: ErrorHandlerRegistry', () => { it('resolves handlers using name-based matching', () => { // Prepare const registry = new ErrorHandlerRegistry({ logger: console }); - const handler = createErrorHandler(HttpErrorCodes.BAD_REQUEST); + const handler = createErrorHandler(HttpStatusCodes.BAD_REQUEST); // Act registry.register(CustomError, handler); @@ -116,7 +116,7 @@ describe('Class: ErrorHandlerRegistry', () => { it('returns null when no handler is found', () => { // Prepare const registry = new ErrorHandlerRegistry({ logger: console }); - const handler = createErrorHandler(HttpErrorCodes.BAD_REQUEST); + const handler = createErrorHandler(HttpStatusCodes.BAD_REQUEST); // Act registry.register(CustomError, handler); @@ -129,9 +129,9 @@ describe('Class: ErrorHandlerRegistry', () => { it('prioritizes exact constructor match over instanceof', () => { // Prepare const registry = new ErrorHandlerRegistry({ logger: console }); - const baseHandler = createErrorHandler(HttpErrorCodes.BAD_REQUEST); + const baseHandler = createErrorHandler(HttpStatusCodes.BAD_REQUEST); const specificHandler = createErrorHandler( - HttpErrorCodes.INTERNAL_SERVER_ERROR + HttpStatusCodes.INTERNAL_SERVER_ERROR ); // Act @@ -145,9 +145,9 @@ describe('Class: ErrorHandlerRegistry', () => { it('prioritizes instanceof match over name-based matching', () => { // Prepare const registry = new ErrorHandlerRegistry({ logger: console }); - const baseHandler = createErrorHandler(HttpErrorCodes.BAD_REQUEST); + const baseHandler = createErrorHandler(HttpStatusCodes.BAD_REQUEST); const nameHandler = createErrorHandler( - HttpErrorCodes.INTERNAL_SERVER_ERROR + HttpStatusCodes.INTERNAL_SERVER_ERROR ); // Create a class with different name but register with name matching diff --git a/packages/event-handler/tests/unit/rest/RouteHandlerRegistry.test.ts b/packages/event-handler/tests/unit/rest/RouteHandlerRegistry.test.ts index 24dac6f6f9..42dccf5f24 100644 --- a/packages/event-handler/tests/unit/rest/RouteHandlerRegistry.test.ts +++ b/packages/event-handler/tests/unit/rest/RouteHandlerRegistry.test.ts @@ -559,11 +559,9 @@ describe('Class: RouteHandlerRegistry', () => { // Prepare const registry = new RouteHandlerRegistry({ logger: console }); const handler = async () => ({ message: 'test' }); - - // Act registry.register(new Route(HttpVerbs.GET, '/users/:id', handler)); - // Assess + // Act & Assess expect(() => { registry.resolve(HttpVerbs.GET, '/users/%20'); }).toThrow("Parameter 'id' cannot be empty"); @@ -573,40 +571,19 @@ describe('Class: RouteHandlerRegistry', () => { // Prepare const registry = new RouteHandlerRegistry({ logger: console }); const handler = async () => ({ message: 'test' }); - - // Act - registry.register( - new Route(HttpVerbs.GET, '/users/:userId/posts/:postId', handler) - ); - - // Assess - expect(() => { - registry.resolve(HttpVerbs.GET, '/users/%20/posts/%20%20'); - }).toThrow('Parameter validation failed'); - }); - - it('includes all validation issues in error message', () => { - // Prepare - const registry = new RouteHandlerRegistry({ logger: console }); - const handler = async () => ({ message: 'test' }); - - // Act registry.register( new Route(HttpVerbs.GET, '/api/:version/:resource/:id', handler) ); - // Assess - expect(() => { - registry.resolve(HttpVerbs.GET, '/api/%20/users/%20'); - }).toThrow(); - - try { + // Act & Assess + expect(async () => { registry.resolve(HttpVerbs.GET, '/api/%20/users/%20'); - } catch (error: any) { - expect(error.message).toContain('Parameter validation failed'); - expect(error.issues).toContain("Parameter 'version' cannot be empty"); - expect(error.issues).toContain("Parameter 'id' cannot be empty"); - } + }).rejects.toMatchObject({ + issues: [ + "Parameter 'version' cannot be empty", + "Parameter 'id' cannot be empty", + ], + }); }); }); }); diff --git a/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts b/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts index fa58f23c87..d4dffadb44 100644 --- a/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts @@ -1,7 +1,7 @@ import context from '@aws-lambda-powertools/testing-utils/context'; import { describe, expect, it } from 'vitest'; import { - HttpErrorCodes, + HttpStatusCodes, HttpVerbs, InternalServerError, Router, @@ -50,7 +50,7 @@ describe('Class: Router - Basic Routing', () => { context ); - expect(result.statusCode).toBe(HttpErrorCodes.METHOD_NOT_ALLOWED); + expect(result.statusCode).toBe(HttpStatusCodes.METHOD_NOT_ALLOWED); expect(result.body).toEqual(''); } ); diff --git a/packages/event-handler/tests/unit/rest/Router/decorators.test.ts b/packages/event-handler/tests/unit/rest/Router/decorators.test.ts index 4b6be75101..0528e7a963 100644 --- a/packages/event-handler/tests/unit/rest/Router/decorators.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/decorators.test.ts @@ -3,11 +3,12 @@ import type { Context } from 'aws-lambda'; import { describe, expect, it } from 'vitest'; import { BadRequestError, - HttpErrorCodes, + HttpStatusCodes, MethodNotAllowedError, type NotFoundError, Router, } from '../../../../src/rest/index.js'; +import type { RequestContext } from '../../../../src/types/rest.js'; import { createTestEvent, createTrackingMiddleware } from '../helpers.js'; describe('Class: Router - Decorators', () => { @@ -219,7 +220,7 @@ describe('Class: Router - Decorators', () => { @app.errorHandler(BadRequestError) public async handleBadRequest(error: BadRequestError) { return { - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, error: 'Bad Request', message: `Decorated: ${error.message}`, }; @@ -245,9 +246,9 @@ describe('Class: Router - Decorators', () => { // Assess expect(result).toEqual({ - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, body: JSON.stringify({ - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, error: 'Bad Request', message: 'Decorated: test error', }), @@ -266,7 +267,7 @@ describe('Class: Router - Decorators', () => { @app.notFound() public async handleNotFound(error: NotFoundError) { return { - statusCode: HttpErrorCodes.NOT_FOUND, + statusCode: HttpStatusCodes.NOT_FOUND, error: 'Not Found', message: `${this.scope}: ${error.message}`, }; @@ -288,9 +289,9 @@ describe('Class: Router - Decorators', () => { // Assess expect(result).toEqual({ - statusCode: HttpErrorCodes.NOT_FOUND, + statusCode: HttpStatusCodes.NOT_FOUND, body: JSON.stringify({ - statusCode: HttpErrorCodes.NOT_FOUND, + statusCode: HttpStatusCodes.NOT_FOUND, error: 'Not Found', message: 'scoped: Route /nonexistent for method GET not found', }), @@ -307,7 +308,7 @@ describe('Class: Router - Decorators', () => { @app.methodNotAllowed() public async handleMethodNotAllowed(error: MethodNotAllowedError) { return { - statusCode: HttpErrorCodes.METHOD_NOT_ALLOWED, + statusCode: HttpStatusCodes.METHOD_NOT_ALLOWED, error: 'Method Not Allowed', message: `Decorated: ${error.message}`, }; @@ -333,9 +334,9 @@ describe('Class: Router - Decorators', () => { // Assess expect(result).toEqual({ - statusCode: HttpErrorCodes.METHOD_NOT_ALLOWED, + statusCode: HttpStatusCodes.METHOD_NOT_ALLOWED, body: JSON.stringify({ - statusCode: HttpErrorCodes.METHOD_NOT_ALLOWED, + statusCode: HttpStatusCodes.METHOD_NOT_ALLOWED, error: 'Method Not Allowed', message: 'Decorated: POST not allowed', }), @@ -354,7 +355,7 @@ describe('Class: Router - Decorators', () => { @app.errorHandler(BadRequestError) public async handleBadRequest(error: BadRequestError) { return { - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, error: 'Bad Request', message: `${this.scope}: ${error.message}`, }; @@ -378,9 +379,9 @@ describe('Class: Router - Decorators', () => { // Assess expect(result).toEqual({ - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, body: JSON.stringify({ - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, error: 'Bad Request', message: 'scoped: test error', }), @@ -398,7 +399,7 @@ describe('Class: Router - Decorators', () => { class Lambda { @app.get('/test') - public async getTest(reqCtx: any) { + public async getTest(reqCtx: RequestContext) { return { hasRequest: reqCtx.req instanceof Request, hasEvent: reqCtx.event === testEvent, @@ -430,9 +431,12 @@ describe('Class: Router - Decorators', () => { class Lambda { @app.errorHandler(BadRequestError) - public async handleBadRequest(error: BadRequestError, reqCtx: any) { + public async handleBadRequest( + error: BadRequestError, + reqCtx: RequestContext + ) { return { - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, error: 'Bad Request', message: error.message, hasRequest: reqCtx.req instanceof Request, diff --git a/packages/event-handler/tests/unit/rest/Router/error-handling.test.ts b/packages/event-handler/tests/unit/rest/Router/error-handling.test.ts index 9795117dc1..f3921aa42b 100644 --- a/packages/event-handler/tests/unit/rest/Router/error-handling.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/error-handling.test.ts @@ -2,7 +2,7 @@ import context from '@aws-lambda-powertools/testing-utils/context'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { BadRequestError, - HttpErrorCodes, + HttpStatusCodes, InternalServerError, MethodNotAllowedError, NotFoundError, @@ -20,7 +20,7 @@ describe('Class: Router - Error Handling', () => { vi.stubEnv('POWERTOOLS_DEV', 'true'); app.errorHandler(BadRequestError, async (error) => ({ - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, error: 'Bad Request', message: `Handled: ${error.message}`, })); @@ -34,9 +34,9 @@ describe('Class: Router - Error Handling', () => { // Assess expect(result).toEqual({ - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, body: JSON.stringify({ - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, error: 'Bad Request', message: 'Handled: test error', }), @@ -62,11 +62,11 @@ describe('Class: Router - Error Handling', () => { // Assess expect(result).toEqual({ - statusCode: HttpErrorCodes.NOT_FOUND, + statusCode: HttpStatusCodes.NOT_FOUND, body: JSON.stringify({ error: 'Not Found', message: 'Custom: Route /nonexistent for method GET not found', - statusCode: HttpErrorCodes.NOT_FOUND, + statusCode: HttpStatusCodes.NOT_FOUND, }), headers: { 'content-type': 'application/json' }, isBase64Encoded: false, @@ -91,11 +91,11 @@ describe('Class: Router - Error Handling', () => { // Assess expect(result).toEqual({ - statusCode: HttpErrorCodes.METHOD_NOT_ALLOWED, + statusCode: HttpStatusCodes.METHOD_NOT_ALLOWED, body: JSON.stringify({ error: 'Method Not Allowed', message: 'Custom: POST not allowed', - statusCode: HttpErrorCodes.METHOD_NOT_ALLOWED, + statusCode: HttpStatusCodes.METHOD_NOT_ALLOWED, }), headers: { 'content-type': 'application/json' }, isBase64Encoded: false, @@ -119,9 +119,9 @@ describe('Class: Router - Error Handling', () => { const result = await app.resolve(createTestEvent('/test', 'GET'), context); // Assess - expect(result.statusCode).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + expect(result.statusCode).toBe(HttpStatusCodes.INTERNAL_SERVER_ERROR); const body = JSON.parse(result.body); - expect(body.statusCode).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + expect(body.statusCode).toBe(HttpStatusCodes.INTERNAL_SERVER_ERROR); expect(body.error).toBe('Internal Server Error'); expect(body.message).toBe('Internal Server Error'); }); @@ -139,9 +139,9 @@ describe('Class: Router - Error Handling', () => { const result = await app.resolve(createTestEvent('/test', 'GET'), context); // Assess - expect(result.statusCode).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + expect(result.statusCode).toBe(HttpStatusCodes.INTERNAL_SERVER_ERROR); const body = JSON.parse(result.body); - expect(body.statusCode).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + expect(body.statusCode).toBe(HttpStatusCodes.INTERNAL_SERVER_ERROR); expect(body.error).toBe('Internal Server Error'); expect(body.message).toBe('Internal Server Error'); }); @@ -151,13 +151,13 @@ describe('Class: Router - Error Handling', () => { const app = new Router(); app.errorHandler(Error, async () => ({ - statusCode: HttpErrorCodes.INTERNAL_SERVER_ERROR, + statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR, error: 'Generic Error', message: 'Generic handler', })); app.errorHandler(BadRequestError, async () => ({ - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, error: 'Bad Request', message: 'Specific handler', })); @@ -171,9 +171,9 @@ describe('Class: Router - Error Handling', () => { // Assess expect(result).toEqual({ - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, body: JSON.stringify({ - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, error: 'Bad Request', message: 'Specific handler', }), @@ -195,9 +195,9 @@ describe('Class: Router - Error Handling', () => { // Assess expect(result).toEqual({ - statusCode: HttpErrorCodes.INTERNAL_SERVER_ERROR, + statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR, body: JSON.stringify({ - statusCode: HttpErrorCodes.INTERNAL_SERVER_ERROR, + statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR, error: 'InternalServerError', message: 'service error', }), @@ -219,9 +219,9 @@ describe('Class: Router - Error Handling', () => { const result = await app.resolve(createTestEvent('/test', 'GET'), context); // Assess - expect(result.statusCode).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + expect(result.statusCode).toBe(HttpStatusCodes.INTERNAL_SERVER_ERROR); const body = JSON.parse(result.body); - expect(body.statusCode).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + expect(body.statusCode).toBe(HttpStatusCodes.INTERNAL_SERVER_ERROR); expect(body.error).toBe('Internal Server Error'); expect(body.message).toBe('Internal Server Error'); expect(body.stack).toBeUndefined(); @@ -241,9 +241,9 @@ describe('Class: Router - Error Handling', () => { const result = await app.resolve(createTestEvent('/test', 'GET'), context); // Assess - expect(result.statusCode).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + expect(result.statusCode).toBe(HttpStatusCodes.INTERNAL_SERVER_ERROR); const body = JSON.parse(result.body); - expect(body.statusCode).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + expect(body.statusCode).toBe(HttpStatusCodes.INTERNAL_SERVER_ERROR); expect(body.error).toBe('Internal Server Error'); expect(body.message).toBe('debug error details'); expect(body.stack).toBeDefined(); @@ -258,7 +258,7 @@ describe('Class: Router - Error Handling', () => { app.errorHandler( [BadRequestError, MethodNotAllowedError], async (error: Error) => ({ - statusCode: HttpErrorCodes.UNPROCESSABLE_ENTITY, + statusCode: HttpStatusCodes.UNPROCESSABLE_ENTITY, error: 'Validation Error', message: `Array handler: ${error.message}`, }) @@ -284,9 +284,9 @@ describe('Class: Router - Error Handling', () => { // Assess const expectedBadResult = { - statusCode: HttpErrorCodes.UNPROCESSABLE_ENTITY, + statusCode: HttpStatusCodes.UNPROCESSABLE_ENTITY, body: JSON.stringify({ - statusCode: HttpErrorCodes.UNPROCESSABLE_ENTITY, + statusCode: HttpStatusCodes.UNPROCESSABLE_ENTITY, error: 'Validation Error', message: 'Array handler: bad request', }), @@ -294,9 +294,9 @@ describe('Class: Router - Error Handling', () => { isBase64Encoded: false, }; const expectedMethodResult = { - statusCode: HttpErrorCodes.UNPROCESSABLE_ENTITY, + statusCode: HttpStatusCodes.UNPROCESSABLE_ENTITY, body: JSON.stringify({ - statusCode: HttpErrorCodes.UNPROCESSABLE_ENTITY, + statusCode: HttpStatusCodes.UNPROCESSABLE_ENTITY, error: 'Validation Error', message: 'Array handler: method not allowed', }), @@ -313,13 +313,13 @@ describe('Class: Router - Error Handling', () => { const app = new Router(); app.errorHandler(BadRequestError, async () => ({ - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, error: 'First Handler', message: 'first', })); app.errorHandler(BadRequestError, async (error) => ({ - statusCode: HttpErrorCodes.UNPROCESSABLE_ENTITY, + statusCode: HttpStatusCodes.UNPROCESSABLE_ENTITY, error: 'Second Handler', message: `second: ${error.message}`, })); @@ -333,9 +333,9 @@ describe('Class: Router - Error Handling', () => { // Assess expect(result).toEqual({ - statusCode: HttpErrorCodes.UNPROCESSABLE_ENTITY, + statusCode: HttpStatusCodes.UNPROCESSABLE_ENTITY, body: JSON.stringify({ - statusCode: HttpErrorCodes.UNPROCESSABLE_ENTITY, + statusCode: HttpStatusCodes.UNPROCESSABLE_ENTITY, error: 'Second Handler', message: 'second: test error', }), @@ -349,7 +349,7 @@ describe('Class: Router - Error Handling', () => { const app = new Router(); app.errorHandler(BadRequestError, async (error) => ({ - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, error: 'Bad Request', message: error.message, })); @@ -371,7 +371,7 @@ describe('Class: Router - Error Handling', () => { const testEvent = createTestEvent('/test', 'GET'); app.errorHandler(BadRequestError, async (error, reqCtx) => ({ - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, error: 'Bad Request', message: error.message, hasRequest: reqCtx.req instanceof Request, @@ -405,7 +405,7 @@ describe('Class: Router - Error Handling', () => { foo: 'bar', }), { - status: HttpErrorCodes.BAD_REQUEST, + status: HttpStatusCodes.BAD_REQUEST, headers: { 'content-type': 'application/json', }, @@ -422,7 +422,7 @@ describe('Class: Router - Error Handling', () => { // Assess expect(result).toEqual({ - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, body: JSON.stringify({ foo: 'bar', }), @@ -436,7 +436,7 @@ describe('Class: Router - Error Handling', () => { const app = new Router(); app.errorHandler(BadRequestError, async () => ({ - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, body: JSON.stringify({ foo: 'bar', }), @@ -451,7 +451,7 @@ describe('Class: Router - Error Handling', () => { // Assess expect(result).toEqual({ - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, body: JSON.stringify({ foo: 'bar', }), @@ -473,7 +473,7 @@ describe('Class: Router - Error Handling', () => { // Assess expect(result).toEqual({ - statusCode: HttpErrorCodes.INTERNAL_SERVER_ERROR, + statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR, body: JSON.stringify({ foo: 'bar', }), @@ -499,9 +499,9 @@ describe('Class: Router - Error Handling', () => { // Assess expect(result).toEqual({ - statusCode: HttpErrorCodes.NOT_FOUND, + statusCode: HttpStatusCodes.NOT_FOUND, body: JSON.stringify({ - statusCode: HttpErrorCodes.NOT_FOUND, + statusCode: HttpStatusCodes.NOT_FOUND, error: 'NotFoundError', message: 'This error is thrown from the error handler', }), @@ -529,9 +529,9 @@ describe('Class: Router - Error Handling', () => { // Assess expect(result).toEqual({ - statusCode: HttpErrorCodes.METHOD_NOT_ALLOWED, + statusCode: HttpStatusCodes.METHOD_NOT_ALLOWED, body: JSON.stringify({ - statusCode: HttpErrorCodes.METHOD_NOT_ALLOWED, + statusCode: HttpStatusCodes.METHOD_NOT_ALLOWED, error: 'MethodNotAllowedError', message: 'This error is thrown from the error handler', }), @@ -557,7 +557,7 @@ describe('Class: Router - Error Handling', () => { const result = await app.resolve(createTestEvent('/test', 'GET'), context); // Assess - expect(result.statusCode).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + expect(result.statusCode).toBe(HttpStatusCodes.INTERNAL_SERVER_ERROR); const body = JSON.parse(result.body); expect(body.error).toBe('Internal Server Error'); expect(body.message).toBe('This error is thrown from the error handler'); diff --git a/packages/event-handler/tests/unit/rest/Router/middleware.test.ts b/packages/event-handler/tests/unit/rest/Router/middleware.test.ts index a5080eb654..4d66055914 100644 --- a/packages/event-handler/tests/unit/rest/Router/middleware.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/middleware.test.ts @@ -1,7 +1,7 @@ import context from '@aws-lambda-powertools/testing-utils/context'; import type { Context } from 'aws-lambda'; import { describe, expect, it, vi } from 'vitest'; -import { HttpErrorCodes, Router } from '../../../../src/rest/index.js'; +import { HttpStatusCodes, Router } from '../../../../src/rest/index.js'; import type { Middleware, Path, @@ -176,7 +176,7 @@ describe('Class: Router - Middleware', () => { ); // Assess - expect(result.statusCode).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + expect(result.statusCode).toBe(HttpStatusCodes.INTERNAL_SERVER_ERROR); const body = JSON.parse(result.body); expect(body.message).toContain('next() called multiple times'); }); @@ -234,7 +234,7 @@ describe('Class: Router - Middleware', () => { // Assess expect(executionOrder).toEqual(['middleware1']); - expect(result.statusCode).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + expect(result.statusCode).toBe(HttpStatusCodes.INTERNAL_SERVER_ERROR); }); it('handles errors thrown in middleware after next()', async () => { @@ -266,7 +266,7 @@ describe('Class: Router - Middleware', () => { 'handler', 'middleware1-end', ]); - expect(result.statusCode).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + expect(result.statusCode).toBe(HttpStatusCodes.INTERNAL_SERVER_ERROR); }); it('propagates handler errors through middleware chain', async () => { @@ -294,7 +294,7 @@ describe('Class: Router - Middleware', () => { 'middleware2-start', 'handler', ]); - expect(result.statusCode).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + expect(result.statusCode).toBe(HttpStatusCodes.INTERNAL_SERVER_ERROR); }); it('handles middleware not calling next()', async () => { @@ -318,7 +318,7 @@ describe('Class: Router - Middleware', () => { // Assess expect(executionOrder).toEqual(['middleware1']); - expect(result.statusCode).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + expect(result.statusCode).toBe(HttpStatusCodes.INTERNAL_SERVER_ERROR); }); it('handles middleware returning JSON objects', async () => { diff --git a/packages/event-handler/tests/unit/rest/errors.test.ts b/packages/event-handler/tests/unit/rest/errors.test.ts index 6f26cf678c..95db647802 100644 --- a/packages/event-handler/tests/unit/rest/errors.test.ts +++ b/packages/event-handler/tests/unit/rest/errors.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from 'vitest'; import { BadRequestError, ForbiddenError, - HttpErrorCodes, + HttpStatusCodes, InternalServerError, MethodNotAllowedError, NotFoundError, @@ -17,55 +17,55 @@ describe('HTTP Error Classes', () => { { ErrorClass: BadRequestError, errorType: 'BadRequestError', - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, customMessage: 'Invalid input', }, { ErrorClass: UnauthorizedError, errorType: 'UnauthorizedError', - statusCode: HttpErrorCodes.UNAUTHORIZED, + statusCode: HttpStatusCodes.UNAUTHORIZED, customMessage: 'Token expired', }, { ErrorClass: ForbiddenError, errorType: 'ForbiddenError', - statusCode: HttpErrorCodes.FORBIDDEN, + statusCode: HttpStatusCodes.FORBIDDEN, customMessage: 'Access denied', }, { ErrorClass: NotFoundError, errorType: 'NotFoundError', - statusCode: HttpErrorCodes.NOT_FOUND, + statusCode: HttpStatusCodes.NOT_FOUND, customMessage: 'Resource not found', }, { ErrorClass: MethodNotAllowedError, errorType: 'MethodNotAllowedError', - statusCode: HttpErrorCodes.METHOD_NOT_ALLOWED, + statusCode: HttpStatusCodes.METHOD_NOT_ALLOWED, customMessage: 'POST not allowed', }, { ErrorClass: RequestTimeoutError, errorType: 'RequestTimeoutError', - statusCode: HttpErrorCodes.REQUEST_TIMEOUT, + statusCode: HttpStatusCodes.REQUEST_TIMEOUT, customMessage: 'Operation timed out', }, { ErrorClass: RequestEntityTooLargeError, errorType: 'RequestEntityTooLargeError', - statusCode: HttpErrorCodes.REQUEST_ENTITY_TOO_LARGE, + statusCode: HttpStatusCodes.REQUEST_ENTITY_TOO_LARGE, customMessage: 'File too large', }, { ErrorClass: InternalServerError, errorType: 'InternalServerError', - statusCode: HttpErrorCodes.INTERNAL_SERVER_ERROR, + statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR, customMessage: 'Database connection failed', }, { ErrorClass: ServiceUnavailableError, errorType: 'ServiceUnavailableError', - statusCode: HttpErrorCodes.SERVICE_UNAVAILABLE, + statusCode: HttpStatusCodes.SERVICE_UNAVAILABLE, customMessage: 'Maintenance mode', }, ])( @@ -83,55 +83,55 @@ describe('HTTP Error Classes', () => { { ErrorClass: BadRequestError, errorType: 'BadRequestError', - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, message: 'Invalid input', }, { ErrorClass: UnauthorizedError, errorType: 'UnauthorizedError', - statusCode: HttpErrorCodes.UNAUTHORIZED, + statusCode: HttpStatusCodes.UNAUTHORIZED, message: 'Token expired', }, { ErrorClass: ForbiddenError, errorType: 'ForbiddenError', - statusCode: HttpErrorCodes.FORBIDDEN, + statusCode: HttpStatusCodes.FORBIDDEN, message: 'Access denied', }, { ErrorClass: NotFoundError, errorType: 'NotFoundError', - statusCode: HttpErrorCodes.NOT_FOUND, + statusCode: HttpStatusCodes.NOT_FOUND, message: 'Resource not found', }, { ErrorClass: MethodNotAllowedError, errorType: 'MethodNotAllowedError', - statusCode: HttpErrorCodes.METHOD_NOT_ALLOWED, + statusCode: HttpStatusCodes.METHOD_NOT_ALLOWED, message: 'POST not allowed', }, { ErrorClass: RequestTimeoutError, errorType: 'RequestTimeoutError', - statusCode: HttpErrorCodes.REQUEST_TIMEOUT, + statusCode: HttpStatusCodes.REQUEST_TIMEOUT, message: 'Operation timed out', }, { ErrorClass: RequestEntityTooLargeError, errorType: 'RequestEntityTooLargeError', - statusCode: HttpErrorCodes.REQUEST_ENTITY_TOO_LARGE, + statusCode: HttpStatusCodes.REQUEST_ENTITY_TOO_LARGE, message: 'File too large', }, { ErrorClass: InternalServerError, errorType: 'InternalServerError', - statusCode: HttpErrorCodes.INTERNAL_SERVER_ERROR, + statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR, message: 'Database connection failed', }, { ErrorClass: ServiceUnavailableError, errorType: 'ServiceUnavailableError', - statusCode: HttpErrorCodes.SERVICE_UNAVAILABLE, + statusCode: HttpStatusCodes.SERVICE_UNAVAILABLE, message: 'Maintenance mode', }, ])( @@ -154,7 +154,7 @@ describe('HTTP Error Classes', () => { const json = error.toJSON(); expect(json).toEqual({ - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, error: 'BadRequestError', message: 'Invalid input', details, @@ -166,7 +166,7 @@ describe('HTTP Error Classes', () => { const json = error.toJSON(); expect(json).toEqual({ - statusCode: HttpErrorCodes.BAD_REQUEST, + statusCode: HttpStatusCodes.BAD_REQUEST, error: 'BadRequestError', message: 'Invalid input', }); diff --git a/packages/event-handler/tests/unit/rest/helpers.ts b/packages/event-handler/tests/unit/rest/helpers.ts index 960fe2c437..4f04e0e3c1 100644 --- a/packages/event-handler/tests/unit/rest/helpers.ts +++ b/packages/event-handler/tests/unit/rest/helpers.ts @@ -1,5 +1,5 @@ import type { APIGatewayProxyEvent } from 'aws-lambda'; -import type { Middleware } from '../../../src/types/rest.js'; +import type { HandlerResponse, Middleware } from '../../../src/types/rest.js'; export const createTestEvent = ( path: string, @@ -20,7 +20,7 @@ export const createTestEvent = ( httpMethod, path, domainName: 'localhost', - } as any, + } as APIGatewayProxyEvent['requestContext'], resource: '', }); @@ -49,7 +49,7 @@ export const createThrowingMiddleware = ( export const createReturningMiddleware = ( name: string, executionOrder: string[], - response: any + response: HandlerResponse ): Middleware => { return async () => { executionOrder.push(name); diff --git a/packages/event-handler/tests/unit/rest/utils.test.ts b/packages/event-handler/tests/unit/rest/utils.test.ts index db8308cd63..5082eb6608 100644 --- a/packages/event-handler/tests/unit/rest/utils.test.ts +++ b/packages/event-handler/tests/unit/rest/utils.test.ts @@ -1,4 +1,8 @@ -import type { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; +import type { + APIGatewayProxyEvent, + APIGatewayProxyResult, + Context, +} from 'aws-lambda'; import { describe, expect, it } from 'vitest'; import { composeMiddleware, @@ -440,9 +444,10 @@ describe('Path Utilities', () => { describe('composeMiddleware', () => { const mockOptions: RequestContext = { + params: {}, event: {} as APIGatewayProxyEvent, - context: {} as any, - request: new Request('https://example.com'), + context: {} as Context, + req: new Request('https://example.com'), res: new Response(), }; @@ -463,7 +468,6 @@ describe('Path Utilities', () => { const composed = composeMiddleware(middleware); await composed({ - params: {}, reqCtx: mockOptions, next: async () => { executionOrder.push('handler'); @@ -491,7 +495,6 @@ describe('Path Utilities', () => { const composed = composeMiddleware(middleware); const result = await composed({ - params: {}, reqCtx: mockOptions, next: async () => { return { handler: true }; @@ -510,7 +513,6 @@ describe('Path Utilities', () => { const composed = composeMiddleware(middleware); const result = await composed({ - params: {}, reqCtx: mockOptions, next: async () => { return { handler: true }; @@ -531,14 +533,13 @@ describe('Path Utilities', () => { const composed = composeMiddleware(middleware); await expect( - composed({ params: {}, reqCtx: mockOptions, next: async () => {} }) + composed({ reqCtx: mockOptions, next: async () => {} }) ).rejects.toThrow('next() called multiple times'); }); it('handles empty middleware array', async () => { const composed = composeMiddleware([]); const result = await composed({ - params: {}, reqCtx: mockOptions, next: async () => { return { handler: true }; @@ -557,7 +558,6 @@ describe('Path Utilities', () => { const composed = composeMiddleware(middleware); const result = await composed({ - params: {}, reqCtx: mockOptions, next: async () => { return undefined; From 72cf1cd046fa37abb5148aa9ed5f3244ca5db1ac Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Wed, 24 Sep 2025 10:52:15 +0200 Subject: [PATCH 183/255] docs(event-handler): update to new APIs before release (#4542) --- docs/features/event-handler/rest.md | 32 +++++++++++++------ .../event-handler/rest/advanced_compress.ts | 2 +- .../rest/advanced_cors_per_route.ts | 2 +- .../rest/advanced_cors_simple.ts | 2 +- .../rest/advanced_fine_grained_responses.ts | 4 +-- .../advanced_mw_compose_middleware_index.ts | 4 +-- .../advanced_mw_compose_middleware_shared.ts | 6 ++-- .../rest/advanced_mw_custom_middleware.ts | 10 +++--- .../rest/advanced_mw_destructuring_problem.ts | 4 +-- .../rest/advanced_mw_early_return.ts | 6 ++-- .../rest/advanced_mw_middleware_order.ts | 13 ++++---- .../diagrams/middleware_early_return.mermaid | 4 +-- .../middleware_error_handling.mermaid | 4 +-- .../middleware_execution_order.mermaid | 6 ++-- .../diagrams/middleware_handled_error.mermaid | 6 ++-- .../middleware_throwing_error.mermaid | 4 +-- .../rest/gettingStarted_dynamic_routes.ts | 2 +- .../rest/gettingStarted_error_handling.ts | 5 ++- .../rest/gettingStarted_handle_not_found.ts | 2 +- .../rest/gettingStarted_methods.ts | 4 +-- .../rest/gettingStarted_multi_methods.ts | 4 +-- .../rest/gettingStarted_route_prefix.ts | 15 +++++++++ .../rest/gettingStarted_serialization.ts | 5 ++- .../gettingStarted_throwing_http_errors.ts | 4 +-- 24 files changed, 88 insertions(+), 62 deletions(-) create mode 100644 examples/snippets/event-handler/rest/gettingStarted_route_prefix.ts diff --git a/docs/features/event-handler/rest.md b/docs/features/event-handler/rest.md index 18ec89cad4..136565eb2f 100644 --- a/docs/features/event-handler/rest.md +++ b/docs/features/event-handler/rest.md @@ -128,7 +128,7 @@ Please [check this issue](https://github.com/aws-powertools/powertools-lambda-ty ### Accessing request details -You can access request details such as headers, query parameters, and body using the `Request` object provided to your route handlers and middleware functions via `reqCtx.request`. +You can access request details such as headers, query parameters, and body using the `Request` object provided to your route handlers and middleware functions via `reqCtx.req`. ### Handling not found routes @@ -148,6 +148,8 @@ You can use the `errorHandler()` method as a higher-order function or class meth This allows you to catch and return custom error responses, or perform any other error handling logic you need. +Error handlers receive the error object and the request context as arguments, and can return a [`Response` object](#returning-response-objects) or a JavaScript object that will be auto-serialized as per the [response auto-serialization](#response-auto-serialization) section. + !!! tip "You can also pass a list of error classes to the `errorHandler()` method." === "index.ts" @@ -158,15 +160,17 @@ This allows you to catch and return custom error responses, or perform any other ### Throwing HTTP errors -You can throw HTTP errors in your route handlers to return specific HTTP status codes and messages. Event Handler provides a set of built-in HTTP error classes that you can use to throw common HTTP errors. +You can throw HTTP errors in your route handlers to stop execution and return specific HTTP status codes and messages. Event Handler provides a set of built-in HTTP error classes that you can use to throw common HTTP errors. This ensures that your Lambda function doesn't fail but returns a well-defined HTTP error response to the client. If you need to send custom headers or a different response structure/code, you can use the [Response](#returning-response-objects) object instead. +!!! tip "You can throw HTTP errors in your route handlers, middleware, or custom error handlers!" + === "index.ts" - ```ts hl_lines="3 10" + ```ts hl_lines="3 11" --8<-- "examples/snippets/event-handler/rest/gettingStarted_throwing_http_errors.ts:3" ``` @@ -194,15 +198,21 @@ All error classes accept optional parameters for custom messages and additional ### Route prefixes -!!! note "Coming soon" - When defining multiple routes related to a specific resource, it's common to have a shared prefix. For example, you might have several routes that all start with `/todos`. For example, if you have a custom domain `api.example.com` and you want to map it to the `/v1` base path of your API. In this case, all the requests will contain `/v1/` in the path, requiring you to repeat the `/v1` prefix in all your route definitions. -At the moment, you have to manually include the prefix in each route definition, however we are planning to add support for route prefixes in a future release. +To avoid repeating the prefix in each route definition, you can use the `prefix` constructor parameter when creating a new `Router` instance, and we'll automatically strip it from the request path before matching routes. After mapping a path prefix, the new root path will automatically be mapped to the path argument of `/`. + +=== "index.ts" + + ```ts hl_lines="4 7" + --8<-- "examples/snippets/event-handler/rest/gettingStarted_route_prefix.ts:3" + ``` -Please [check this issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4513) for more details and examples, and add 👍 if you would like us to prioritize it. +This is also useful when splitting routes into separate files (see [Split routers](#split-routers) section) or when using [API mappings](https://docs.aws.amazon.com/apigateway/latest/developerguide/rest-api-mappings.html){target="_blank"} to map custom domains to specific base paths. + +For example, when using `prefix: '/pay'`, there is no difference between a request path of `/pay` and `/pay/`; and the path argument would be defined as `/`. ## Advanced @@ -213,9 +223,8 @@ incoming request and your route handler. They provide a way to implement cross-c concerns like authentication, logging, validation, and response transformation without cluttering your route handlers. -Each middleware function receives the following arguments: +Each middleware function receives two arguments: -* **params** - Route parameters extracted from the URL path * **reqCtx** - Request context containing the event, Lambda context, request, and response objects * **next** - A function to pass control to the next middleware in the chain @@ -312,6 +321,11 @@ that no post-processing of your request will occur. A common pattern to create reusable middleware is to implement a factory functions that accepts configuration options and returns a middleware function. +!!! note "Always `await next()` unless returning early" + Middleware functions must always call `await next()` to pass control to the next middleware + in the chain, unless you are intentionally returning early by returning a `Response` or + JSON object. + === "index.ts" ```ts hl_lines="20-21 36 41" diff --git a/examples/snippets/event-handler/rest/advanced_compress.ts b/examples/snippets/event-handler/rest/advanced_compress.ts index 44756a1e14..0a251a332f 100644 --- a/examples/snippets/event-handler/rest/advanced_compress.ts +++ b/examples/snippets/event-handler/rest/advanced_compress.ts @@ -8,7 +8,7 @@ const app = new Router(); app.use(compress()); -app.get('/todos/:todoId', async ({ todoId }) => { +app.get('/todos/:todoId', async ({ params: { todoId } }) => { const todo = await getTodoById(todoId); return { todo }; }); diff --git a/examples/snippets/event-handler/rest/advanced_cors_per_route.ts b/examples/snippets/event-handler/rest/advanced_cors_per_route.ts index 89a49f942f..feb080a381 100644 --- a/examples/snippets/event-handler/rest/advanced_cors_per_route.ts +++ b/examples/snippets/event-handler/rest/advanced_cors_per_route.ts @@ -13,7 +13,7 @@ app.use( }) ); -app.get('/todos/:todoId', async ({ todoId }) => { +app.get('/todos/:todoId', async ({ params: { todoId } }) => { const todo = await getTodoById(todoId); return { todo }; }); diff --git a/examples/snippets/event-handler/rest/advanced_cors_simple.ts b/examples/snippets/event-handler/rest/advanced_cors_simple.ts index b080185ce1..d86bef4356 100644 --- a/examples/snippets/event-handler/rest/advanced_cors_simple.ts +++ b/examples/snippets/event-handler/rest/advanced_cors_simple.ts @@ -13,7 +13,7 @@ app.use( }) ); -app.get('/todos/:todoId', async ({ todoId }) => { +app.get('/todos/:todoId', async ({ params: { todoId } }) => { const todo = await getTodoById(todoId); return { todo }; }); diff --git a/examples/snippets/event-handler/rest/advanced_fine_grained_responses.ts b/examples/snippets/event-handler/rest/advanced_fine_grained_responses.ts index 26cd5d204c..eb918c8587 100644 --- a/examples/snippets/event-handler/rest/advanced_fine_grained_responses.ts +++ b/examples/snippets/event-handler/rest/advanced_fine_grained_responses.ts @@ -23,8 +23,8 @@ app.get('/todos', async () => { }); }); -app.post('/todos', async (_, reqCtx) => { - const body = await reqCtx.request.json(); +app.post('/todos', async ({ req }) => { + const body = await req.json(); const todo = await createTodo(body.title); return new Response(JSON.stringify(todo), { diff --git a/examples/snippets/event-handler/rest/advanced_mw_compose_middleware_index.ts b/examples/snippets/event-handler/rest/advanced_mw_compose_middleware_index.ts index e1a26356b3..5b6e9c2499 100644 --- a/examples/snippets/event-handler/rest/advanced_mw_compose_middleware_index.ts +++ b/examples/snippets/event-handler/rest/advanced_mw_compose_middleware_index.ts @@ -14,8 +14,8 @@ app.get('/todos', async () => { return { todos }; }); -app.post('/todos', async (_, { request }) => { - const body = await request.json(); +app.post('/todos', async ({ req }) => { + const body = await req.json(); const todo = await putTodo(body); return todo; }); diff --git a/examples/snippets/event-handler/rest/advanced_mw_compose_middleware_shared.ts b/examples/snippets/event-handler/rest/advanced_mw_compose_middleware_shared.ts index 1a475aa13b..190d5365f0 100644 --- a/examples/snippets/event-handler/rest/advanced_mw_compose_middleware_shared.ts +++ b/examples/snippets/event-handler/rest/advanced_mw_compose_middleware_shared.ts @@ -5,13 +5,13 @@ import { Logger } from '@aws-lambda-powertools/logger'; const logger = new Logger(); -const logging: Middleware = async (_, reqCtx, next) => { - logger.info(`Request: ${reqCtx.request.method} ${reqCtx.request.url}`); +const logging: Middleware = async ({ reqCtx, next }) => { + logger.info(`Request: ${reqCtx.req.method} ${reqCtx.req.url}`); await next(); logger.info(`Response: ${reqCtx.res.status}`); }; -const rateLimit: Middleware = async (_, reqCtx, next) => { +const rateLimit: Middleware = async ({ reqCtx, next }) => { // Rate limiting logic would go here reqCtx.res.headers.set('X-RateLimit-Limit', '100'); await next(); diff --git a/examples/snippets/event-handler/rest/advanced_mw_custom_middleware.ts b/examples/snippets/event-handler/rest/advanced_mw_custom_middleware.ts index 05f560c325..8e852dd523 100644 --- a/examples/snippets/event-handler/rest/advanced_mw_custom_middleware.ts +++ b/examples/snippets/event-handler/rest/advanced_mw_custom_middleware.ts @@ -25,10 +25,10 @@ const store: { userId: string; roles: string[] } = { userId: '', roles: [] }; // Factory function that returns middleware const verifyToken = (options: { jwtSecret: string }): Middleware => { - return async (_, { request }, next) => { - const auth = request.headers.get('Authorization'); + return async ({ reqCtx: { req }, next }) => { + const auth = req.headers.get('Authorization'); if (!auth || !auth.startsWith('Bearer ')) - return new UnauthorizedError('Missing or invalid Authorization header'); + throw new UnauthorizedError('Missing or invalid Authorization header'); const token = auth.slice(7); try { @@ -37,7 +37,7 @@ const verifyToken = (options: { jwtSecret: string }): Middleware => { store.roles = payload.roles; } catch (error) { logger.error('Token verification failed', { error }); - return new UnauthorizedError('Invalid token'); + throw new UnauthorizedError('Invalid token'); } await next(); @@ -47,7 +47,7 @@ const verifyToken = (options: { jwtSecret: string }): Middleware => { // Use custom middleware globally app.use(verifyToken({ jwtSecret })); -app.post('/todos', async (_) => { +app.post('/todos', async () => { const { userId } = store; const todos = await getUserTodos(userId); return { todos }; diff --git a/examples/snippets/event-handler/rest/advanced_mw_destructuring_problem.ts b/examples/snippets/event-handler/rest/advanced_mw_destructuring_problem.ts index eaaca2bc2b..b1fd622248 100644 --- a/examples/snippets/event-handler/rest/advanced_mw_destructuring_problem.ts +++ b/examples/snippets/event-handler/rest/advanced_mw_destructuring_problem.ts @@ -5,7 +5,7 @@ import type { Context } from 'aws-lambda'; const app = new Router(); // ❌ WRONG: Using destructuring captures a reference to the original response -const _badMiddleware: Middleware = async (_, { res }, next) => { +const _badMiddleware: Middleware = async ({ reqCtx: { res }, next }) => { res.headers.set('X-Before', 'Before'); await next(); // This header will NOT be added because 'res' is a stale reference @@ -13,7 +13,7 @@ const _badMiddleware: Middleware = async (_, { res }, next) => { }; // ✅ CORRECT: Always access response through reqCtx -const goodMiddleware: Middleware = async (_, reqCtx, next) => { +const goodMiddleware: Middleware = async ({ reqCtx, next }) => { reqCtx.res.headers.set('X-Before', 'Before'); await next(); // This header WILL be added because we get the current response diff --git a/examples/snippets/event-handler/rest/advanced_mw_early_return.ts b/examples/snippets/event-handler/rest/advanced_mw_early_return.ts index 4a1d26df9e..e973269e67 100644 --- a/examples/snippets/event-handler/rest/advanced_mw_early_return.ts +++ b/examples/snippets/event-handler/rest/advanced_mw_early_return.ts @@ -9,8 +9,8 @@ const logger = new Logger(); const app = new Router({ logger }); // Authentication middleware - returns early if no auth header -const authMiddleware: Middleware = async (_, reqCtx, next) => { - const authHeader = reqCtx.request.headers.get('authorization'); +const authMiddleware: Middleware = async ({ reqCtx, next }) => { + const authHeader = reqCtx.req.headers.get('authorization'); if (!authHeader) { return new Response(JSON.stringify({ error: 'Unauthorized' }), { @@ -23,7 +23,7 @@ const authMiddleware: Middleware = async (_, reqCtx, next) => { }; // Logging middleware - never executes when auth fails -const loggingMiddleware: Middleware = async (_, __, next) => { +const loggingMiddleware: Middleware = async ({ next }) => { logger.info('Request processed'); await next(); }; diff --git a/examples/snippets/event-handler/rest/advanced_mw_middleware_order.ts b/examples/snippets/event-handler/rest/advanced_mw_middleware_order.ts index fc86013b5e..418e3f4142 100644 --- a/examples/snippets/event-handler/rest/advanced_mw_middleware_order.ts +++ b/examples/snippets/event-handler/rest/advanced_mw_middleware_order.ts @@ -10,14 +10,14 @@ const logger = new Logger(); const app = new Router({ logger }); // Global middleware - executes first in pre-processing, last in post-processing -app.use(async (_, reqCtx, next) => { +app.use(async ({ reqCtx, next }) => { reqCtx.res.headers.set('x-pre-processed-by', 'global-middleware'); await next(); reqCtx.res.headers.set('x-post-processed-by', 'global-middleware'); }); // Route-specific middleware - executes second in pre-processing, first in post-processing -const routeMiddleware: Middleware = async (_, reqCtx, next) => { +const routeMiddleware: Middleware = async ({ reqCtx, next }) => { reqCtx.res.headers.set('x-pre-processed-by', 'route-middleware'); await next(); reqCtx.res.headers.set('x-post-processed-by', 'route-middleware'); @@ -31,12 +31,11 @@ app.get('/todos', async () => { // This route will have: // x-pre-processed-by: route-middleware (route middleware overwrites global) // x-post-processed-by: global-middleware (global middleware executes last) -app.post('/todos', [routeMiddleware], async (_, reqCtx) => { - const body = await reqCtx.request.json(); +app.post('/todos', [routeMiddleware], async ({ req }) => { + const body = await req.json(); const todo = await putTodo(body); return todo; }); -export const handler = async (event: unknown, context: Context) => { - return app.resolve(event, context); -}; +export const handler = async (event: unknown, context: Context) => + app.resolve(event, context); diff --git a/examples/snippets/event-handler/rest/diagrams/middleware_early_return.mermaid b/examples/snippets/event-handler/rest/diagrams/middleware_early_return.mermaid index ca7e189db5..6a54e217ba 100644 --- a/examples/snippets/event-handler/rest/diagrams/middleware_early_return.mermaid +++ b/examples/snippets/event-handler/rest/diagrams/middleware_early_return.mermaid @@ -7,9 +7,9 @@ sequenceDiagram participant Handler as Route Handler Request->>Router: Incoming Request - Router->>M1: Execute (params, reqCtx, next) + Router->>M1: Execute ({ reqCtx, next }) Note over M1: Pre-processing - M1->>M2: Call next() + M1->>M2: Call await next() Note over M2: Pre-processing M2->>M2: Return Response (early return) Note over M2: Post-processing diff --git a/examples/snippets/event-handler/rest/diagrams/middleware_error_handling.mermaid b/examples/snippets/event-handler/rest/diagrams/middleware_error_handling.mermaid index 5c5aafa569..cae7119608 100644 --- a/examples/snippets/event-handler/rest/diagrams/middleware_error_handling.mermaid +++ b/examples/snippets/event-handler/rest/diagrams/middleware_error_handling.mermaid @@ -7,9 +7,9 @@ sequenceDiagram participant Handler as Route Handler Request->>Router: Incoming Request - Router->>M1: Execute (params, reqCtx, next) + Router->>M1: Execute ({ reqCtx, next }) Note over M1: Pre-processing - M1->>M2: Call next() + M1->>M2: Call await next() Note over M2: Throws Error M2-->>M1: Error propagated M1-->>Router: Error propagated diff --git a/examples/snippets/event-handler/rest/diagrams/middleware_execution_order.mermaid b/examples/snippets/event-handler/rest/diagrams/middleware_execution_order.mermaid index 696be1264d..b8befe4d20 100644 --- a/examples/snippets/event-handler/rest/diagrams/middleware_execution_order.mermaid +++ b/examples/snippets/event-handler/rest/diagrams/middleware_execution_order.mermaid @@ -6,11 +6,11 @@ sequenceDiagram participant Handler as Route Handler Request->>Router: Incoming Request - Router->>GM: Execute (params, reqCtx, next) + Router->>GM: Execute ({ reqCtx, next }) Note over GM: Pre-processing - GM->>RM: Call next() + GM->>RM: Call await next() Note over RM: Pre-processing - RM->>Handler: Call next() + RM->>Handler: Call await next() Note over Handler: Execute handler Handler-->>RM: Return Note over RM: Post-processing diff --git a/examples/snippets/event-handler/rest/diagrams/middleware_handled_error.mermaid b/examples/snippets/event-handler/rest/diagrams/middleware_handled_error.mermaid index 5d0da29a88..395983fda4 100644 --- a/examples/snippets/event-handler/rest/diagrams/middleware_handled_error.mermaid +++ b/examples/snippets/event-handler/rest/diagrams/middleware_handled_error.mermaid @@ -6,12 +6,12 @@ sequenceDiagram participant Handler as Route Handler Request->>Router: Incoming Request - Router->>M1: Execute (params, reqCtx, next) + Router->>M1: Execute ({ reqCtx, next }) Note over M1: Pre-processing - M1->>M2: Call next() + M1->>M2: Call await next() Note over M2: Error thrown & caught Note over M2: Handle error gracefully - M2->>Handler: Call next() + M2->>Handler: Call await next() Note over Handler: Execute handler Handler-->>M2: Return Note over M2: Post-processing diff --git a/examples/snippets/event-handler/rest/diagrams/middleware_throwing_error.mermaid b/examples/snippets/event-handler/rest/diagrams/middleware_throwing_error.mermaid index 25ed59d74d..6a57cccd23 100644 --- a/examples/snippets/event-handler/rest/diagrams/middleware_throwing_error.mermaid +++ b/examples/snippets/event-handler/rest/diagrams/middleware_throwing_error.mermaid @@ -7,9 +7,9 @@ sequenceDiagram participant Handler as Route Handler Request->>Router: Incoming Request - Router->>M1: Execute (params, reqCtx, next) + Router->>M1: Execute ({ reqCtx, next }) Note over M1: Pre-processing - M1->>M2: Call next() + M1->>M2: Call await next() Note over M2: Intentionally throws error M2-->>M1: Error propagated M1-->>Router: Error propagated diff --git a/examples/snippets/event-handler/rest/gettingStarted_dynamic_routes.ts b/examples/snippets/event-handler/rest/gettingStarted_dynamic_routes.ts index 426588ebe9..4f9f0fd0fb 100644 --- a/examples/snippets/event-handler/rest/gettingStarted_dynamic_routes.ts +++ b/examples/snippets/event-handler/rest/gettingStarted_dynamic_routes.ts @@ -13,7 +13,7 @@ const logger = new Logger({ }); const app = new Router({ logger }); -app.get('/todos/:todoId', async ({ todoId }) => { +app.get('/todos/:todoId', async ({ params: { todoId } }) => { const todo = await getTodoById(todoId); return { todo }; }); diff --git a/examples/snippets/event-handler/rest/gettingStarted_error_handling.ts b/examples/snippets/event-handler/rest/gettingStarted_error_handling.ts index 87431c151a..677fc69fc6 100644 --- a/examples/snippets/event-handler/rest/gettingStarted_error_handling.ts +++ b/examples/snippets/event-handler/rest/gettingStarted_error_handling.ts @@ -16,12 +16,11 @@ app.errorHandler(GetTodoError, async (error, reqCtx) => { return { statusCode: HttpStatusCodes.BAD_REQUEST, - message: `Bad request: ${error.message} - ${reqCtx.request.headers.get('x-correlation-id')}`, - error: 'BadRequest', + message: `Bad request: ${error.message} - ${reqCtx.req.headers.get('x-correlation-id')}`, }; }); -app.get('/todos/:todoId', async ({ todoId }) => { +app.get('/todos/:todoId', async ({ params: { todoId } }) => { const todo = await getTodoById(todoId); // May throw GetTodoError return { todo }; }); diff --git a/examples/snippets/event-handler/rest/gettingStarted_handle_not_found.ts b/examples/snippets/event-handler/rest/gettingStarted_handle_not_found.ts index 7a44fbf0fd..fe7e402b8b 100644 --- a/examples/snippets/event-handler/rest/gettingStarted_handle_not_found.ts +++ b/examples/snippets/event-handler/rest/gettingStarted_handle_not_found.ts @@ -15,7 +15,7 @@ app.notFound(async (error, reqCtx) => { statusCode: HttpStatusCodes.IM_A_TEAPOT, body: "I'm a teapot!", headers: { - 'x-correlation-id': reqCtx.request.headers.get('x-correlation-id'), + 'x-correlation-id': reqCtx.req.headers.get('x-correlation-id'), }, }; }); diff --git a/examples/snippets/event-handler/rest/gettingStarted_methods.ts b/examples/snippets/event-handler/rest/gettingStarted_methods.ts index f63ffe306a..0a345dbb3a 100644 --- a/examples/snippets/event-handler/rest/gettingStarted_methods.ts +++ b/examples/snippets/event-handler/rest/gettingStarted_methods.ts @@ -13,8 +13,8 @@ const logger = new Logger({ }); const app = new Router({ logger }); -app.post('/todos', async (_, { request }) => { - const body = await request.json(); +app.post('/todos', async ({ req }) => { + const body = await req.json(); const todo = await putTodo(body); return todo; diff --git a/examples/snippets/event-handler/rest/gettingStarted_multi_methods.ts b/examples/snippets/event-handler/rest/gettingStarted_multi_methods.ts index 4888d31097..3d1e9109ec 100644 --- a/examples/snippets/event-handler/rest/gettingStarted_multi_methods.ts +++ b/examples/snippets/event-handler/rest/gettingStarted_multi_methods.ts @@ -14,8 +14,8 @@ const logger = new Logger({ const app = new Router({ logger }); app.route( - async (_, { request }) => { - const body = await request.json(); + async ({ req }) => { + const body = await req.json(); const todo = await putTodo(body); return todo; diff --git a/examples/snippets/event-handler/rest/gettingStarted_route_prefix.ts b/examples/snippets/event-handler/rest/gettingStarted_route_prefix.ts new file mode 100644 index 0000000000..3a0ca18f6d --- /dev/null +++ b/examples/snippets/event-handler/rest/gettingStarted_route_prefix.ts @@ -0,0 +1,15 @@ +declare function getUserTodos(auth: string | null): Promise<{ id: string }>; + +import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; +import type { Context } from 'aws-lambda'; + +const app = new Router({ prefix: '/todos' }); + +// matches POST /todos +app.post('/', async ({ req: { headers } }) => { + const todos = await getUserTodos(headers.get('Authorization')); + return { todos }; +}); + +export const handler = async (event: unknown, context: Context) => + app.resolve(event, context); diff --git a/examples/snippets/event-handler/rest/gettingStarted_serialization.ts b/examples/snippets/event-handler/rest/gettingStarted_serialization.ts index 5b93f14004..7bbc22f305 100644 --- a/examples/snippets/event-handler/rest/gettingStarted_serialization.ts +++ b/examples/snippets/event-handler/rest/gettingStarted_serialization.ts @@ -7,6 +7,5 @@ app.get('/ping', async () => { return { message: 'pong' }; // (1)! }); -export const handler = async (event: unknown, context: Context) => { - return app.resolve(event, context); -}; +export const handler = async (event: unknown, context: Context) => + app.resolve(event, context); diff --git a/examples/snippets/event-handler/rest/gettingStarted_throwing_http_errors.ts b/examples/snippets/event-handler/rest/gettingStarted_throwing_http_errors.ts index 417a9a2e8b..5950720d77 100644 --- a/examples/snippets/event-handler/rest/gettingStarted_throwing_http_errors.ts +++ b/examples/snippets/event-handler/rest/gettingStarted_throwing_http_errors.ts @@ -8,8 +8,8 @@ import type { Context } from 'aws-lambda'; const app = new Router(); -app.use(async (_, reqCtx, next) => { - if (!isAuthenticated(reqCtx.request.headers.get('Authorization') ?? '')) { +app.use(async ({ reqCtx, next }) => { + if (!isAuthenticated(reqCtx.req.headers.get('Authorization') ?? '')) { throw new UnauthorizedError(); // This will return a 401 Unauthorized response } await next(); From f38af1db92473327776fc3128bccad145062e354 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 24 Sep 2025 10:09:17 +0100 Subject: [PATCH 184/255] chore(ci): bump version to 2.27.0 (#4544) Co-authored-by: aws-powertools-bot <151832416+aws-powertools-bot@users.noreply.github.com> --- CHANGELOG.md | 23 ++++++++++++++++++++++ examples/app/CHANGELOG.md | 4 ++++ examples/app/package.json | 14 +++++++------- examples/snippets/CHANGELOG.md | 4 ++++ examples/snippets/package.json | 20 +++++++++---------- layers/CHANGELOG.md | 4 ++++ layers/package.json | 2 +- package-lock.json | 30 ++++++++++++++--------------- packages/batch/CHANGELOG.md | 5 +++++ packages/batch/package.json | 6 +++--- packages/commons/CHANGELOG.md | 4 ++++ packages/commons/package.json | 2 +- packages/commons/src/version.ts | 2 +- packages/event-handler/CHANGELOG.md | 20 +++++++++++++++++++ packages/event-handler/package.json | 4 ++-- packages/idempotency/CHANGELOG.md | 4 ++++ packages/idempotency/package.json | 6 +++--- packages/jmespath/CHANGELOG.md | 4 ++++ packages/jmespath/package.json | 4 ++-- packages/kafka/CHANGELOG.md | 4 ++++ packages/kafka/package.json | 4 ++-- packages/logger/CHANGELOG.md | 4 ++++ packages/logger/package.json | 6 +++--- packages/metrics/CHANGELOG.md | 4 ++++ packages/metrics/package.json | 4 ++-- packages/parameters/CHANGELOG.md | 4 ++++ packages/parameters/package.json | 4 ++-- packages/parser/CHANGELOG.md | 4 ++++ packages/parser/package.json | 4 ++-- packages/testing/CHANGELOG.md | 4 ++++ packages/testing/package.json | 2 +- packages/tracer/CHANGELOG.md | 4 ++++ packages/tracer/package.json | 4 ++-- packages/validation/CHANGELOG.md | 4 ++++ packages/validation/package.json | 6 +++--- 35 files changed, 166 insertions(+), 62 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81e73992e8..c5a60c35e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,28 @@ # Change Log +## [2.27.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.1...v2.27.0) (2025-09-24) + +### Bug Fixes + +- **batch** fixed the build issue with Batch processor due to missing dependencies ([#4498](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4498)) ([ef67b43](https://github.com/aws-powertools/powertools-lambda-typescript/commit/ef67b43921f1d67b06b3257fb0f96c74e0d6dbae)) +- **event-handler** fixed CORS behaviour not aligned with CORS spec ([#4512](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4512)) ([dd368fa](https://github.com/aws-powertools/powertools-lambda-typescript/commit/dd368fa3eb08a86c2d5aad3cf9b832d7a8288486)) +- **event-handler** run global middleware on all requests for REST API ([#4507](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4507)) ([49d5f8a](https://github.com/aws-powertools/powertools-lambda-typescript/commit/49d5f8a4f36a5af26c573f7706347f34ec70689e)) + +### Improvements + +- **event-handler** rename HttpErrorCodes to HttpStatusCodes ([#4543](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4543)) ([e53aa88](https://github.com/aws-powertools/powertools-lambda-typescript/commit/e53aa8816325f21510706e3f9e62fb0a76692915)) +- **event-handler** made error handler responses versatile ([#4536](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4536)) ([f08b366](https://github.com/aws-powertools/powertools-lambda-typescript/commit/f08b366b79152d338ebefb5a25caacade6846919)) +- **event-handler** changed path parameter in middleware and routehandler signature ([#4532](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4532)) ([278fca0](https://github.com/aws-powertools/powertools-lambda-typescript/commit/278fca0491ce9cb955326523557c3ddf9d03dbc5)) +- **event-handler** change the Middleware and RequestContext signatures ([#4530](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4530)) ([a05c074](https://github.com/aws-powertools/powertools-lambda-typescript/commit/a05c07411629d1e23a9cb3fec8a78cf23bd8dd0c)) + +### Features + +- **event-handler** implemented route prefixes in HTTP event handler ([#4523](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4523)) ([8913854](https://github.com/aws-powertools/powertools-lambda-typescript/commit/89138542cd9e195555299f401646ae94d0bb50ee)) +- **event-handler** throw error when middleware does not await next() ([#4511](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4511)) ([b0b43e8](https://github.com/aws-powertools/powertools-lambda-typescript/commit/b0b43e862fb189941fe9db220580884e7707d541)) +- **event-handler** add CORS middleware support ([#4477](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4477)) ([972cd1f](https://github.com/aws-powertools/powertools-lambda-typescript/commit/972cd1f86b6ea01c93abef5e6cde7876360196f1)) +- **event-handler** added compress middleware for the REST API event handler ([#4495](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4495)) ([320e0dc](https://github.com/aws-powertools/powertools-lambda-typescript/commit/320e0dcaa07476de3b7d07209ef27379b9d4900a)) + + ## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) ### Bug Fixes diff --git a/examples/app/CHANGELOG.md b/examples/app/CHANGELOG.md index f260afbf19..cca13ec503 100644 --- a/examples/app/CHANGELOG.md +++ b/examples/app/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.27.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.1...v2.27.0) (2025-09-24) + +**Note:** Version bump only for this package + ## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) **Note:** Version bump only for this package diff --git a/examples/app/package.json b/examples/app/package.json index 49baa179f6..5912aa7d08 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -1,6 +1,6 @@ { "name": "powertools-sample-app", - "version": "2.26.1", + "version": "2.27.0", "author": { "name": "Amazon Web Services", "url": "https://aws.amazon.com" @@ -38,12 +38,12 @@ "vitest": "^3.0.5" }, "dependencies": { - "@aws-lambda-powertools/batch": "^2.26.1", - "@aws-lambda-powertools/idempotency": "^2.26.1", - "@aws-lambda-powertools/logger": "^2.26.1", - "@aws-lambda-powertools/metrics": "^2.26.1", - "@aws-lambda-powertools/parameters": "^2.26.1", - "@aws-lambda-powertools/tracer": "^2.26.1", + "@aws-lambda-powertools/batch": "^2.27.0", + "@aws-lambda-powertools/idempotency": "^2.27.0", + "@aws-lambda-powertools/logger": "^2.27.0", + "@aws-lambda-powertools/metrics": "^2.27.0", + "@aws-lambda-powertools/parameters": "^2.27.0", + "@aws-lambda-powertools/tracer": "^2.27.0", "@aws-sdk/client-ssm": "^3.893.0", "@aws-sdk/lib-dynamodb": "^3.893.0", "@middy/core": "^4.7.0", diff --git a/examples/snippets/CHANGELOG.md b/examples/snippets/CHANGELOG.md index ae2c64f7f8..4afd8b2dcf 100644 --- a/examples/snippets/CHANGELOG.md +++ b/examples/snippets/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.27.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.1...v2.27.0) (2025-09-24) + +**Note:** Version bump only for this package + ## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) **Note:** Version bump only for this package diff --git a/examples/snippets/package.json b/examples/snippets/package.json index 13215c6871..333273bd6c 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -1,6 +1,6 @@ { "name": "code-snippets", - "version": "2.26.1", + "version": "2.27.0", "description": "A collection code snippets for the Powertools for AWS Lambda (TypeScript) docs", "author": { "name": "Amazon Web Services", @@ -24,15 +24,15 @@ }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript#readme", "devDependencies": { - "@aws-lambda-powertools/batch": "^2.26.1", - "@aws-lambda-powertools/event-handler": "^2.26.1", - "@aws-lambda-powertools/idempotency": "^2.26.1", - "@aws-lambda-powertools/jmespath": "^2.26.1", - "@aws-lambda-powertools/logger": "^2.26.1", - "@aws-lambda-powertools/metrics": "^2.26.1", - "@aws-lambda-powertools/parameters": "^2.26.1", - "@aws-lambda-powertools/parser": "^2.26.1", - "@aws-lambda-powertools/tracer": "^2.26.1", + "@aws-lambda-powertools/batch": "^2.27.0", + "@aws-lambda-powertools/event-handler": "^2.27.0", + "@aws-lambda-powertools/idempotency": "^2.27.0", + "@aws-lambda-powertools/jmespath": "^2.27.0", + "@aws-lambda-powertools/logger": "^2.27.0", + "@aws-lambda-powertools/metrics": "^2.27.0", + "@aws-lambda-powertools/parameters": "^2.27.0", + "@aws-lambda-powertools/parser": "^2.27.0", + "@aws-lambda-powertools/tracer": "^2.27.0", "@aws-sdk/client-appconfigdata": "^3.893.0", "@aws-sdk/client-dynamodb": "^3.893.0", "@aws-sdk/client-secrets-manager": "^3.893.0", diff --git a/layers/CHANGELOG.md b/layers/CHANGELOG.md index 8dbab88334..86d9bd5a26 100644 --- a/layers/CHANGELOG.md +++ b/layers/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.27.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.1...v2.27.0) (2025-09-24) + +**Note:** Version bump only for this package + ## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) **Note:** Version bump only for this package diff --git a/layers/package.json b/layers/package.json index 8b9146feff..225068157d 100644 --- a/layers/package.json +++ b/layers/package.json @@ -1,6 +1,6 @@ { "name": "layers", - "version": "2.26.1", + "version": "2.27.0", "bin": { "layer": "bin/layers.js" }, diff --git a/package-lock.json b/package-lock.json index d278440c94..06f45c00dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ }, "examples/app": { "name": "powertools-sample-app", - "version": "2.26.1", + "version": "2.27.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/batch": "^2.26.1", @@ -79,7 +79,7 @@ }, "examples/snippets": { "name": "code-snippets", - "version": "2.26.1", + "version": "2.27.0", "license": "MIT-0", "dependencies": { "arktype": "^2.1.22", @@ -10679,7 +10679,7 @@ }, "packages/batch": { "name": "@aws-lambda-powertools/batch", - "version": "2.26.1", + "version": "2.27.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.1", @@ -10693,7 +10693,7 @@ }, "packages/commons": { "name": "@aws-lambda-powertools/commons", - "version": "2.26.1", + "version": "2.27.0", "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing" @@ -10701,7 +10701,7 @@ }, "packages/event-handler": { "name": "@aws-lambda-powertools/event-handler", - "version": "2.26.1", + "version": "2.27.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.1" @@ -10709,7 +10709,7 @@ }, "packages/idempotency": { "name": "@aws-lambda-powertools/idempotency", - "version": "2.26.1", + "version": "2.27.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.1", @@ -10748,7 +10748,7 @@ }, "packages/jmespath": { "name": "@aws-lambda-powertools/jmespath", - "version": "2.26.1", + "version": "2.27.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.1" @@ -10756,7 +10756,7 @@ }, "packages/kafka": { "name": "@aws-lambda-powertools/kafka", - "version": "2.26.1", + "version": "2.27.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.1", @@ -10786,7 +10786,7 @@ }, "packages/logger": { "name": "@aws-lambda-powertools/logger", - "version": "2.26.1", + "version": "2.27.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.1", @@ -10811,7 +10811,7 @@ }, "packages/metrics": { "name": "@aws-lambda-powertools/metrics", - "version": "2.26.1", + "version": "2.27.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.1" @@ -10833,7 +10833,7 @@ }, "packages/parameters": { "name": "@aws-lambda-powertools/parameters", - "version": "2.26.1", + "version": "2.27.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.1" @@ -10879,7 +10879,7 @@ }, "packages/parser": { "name": "@aws-lambda-powertools/parser", - "version": "2.26.1", + "version": "2.27.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.1", @@ -10903,7 +10903,7 @@ }, "packages/testing": { "name": "@aws-lambda-powertools/testing-utils", - "version": "2.26.1", + "version": "2.27.0", "license": "MIT-0", "dependencies": { "@aws-cdk/toolkit-lib": "^1.8.2", @@ -10920,7 +10920,7 @@ }, "packages/tracer": { "name": "@aws-lambda-powertools/tracer", - "version": "2.26.1", + "version": "2.27.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.1", @@ -10942,7 +10942,7 @@ }, "packages/validation": { "name": "@aws-lambda-powertools/validation", - "version": "2.26.1", + "version": "2.27.0", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.26.1", diff --git a/packages/batch/CHANGELOG.md b/packages/batch/CHANGELOG.md index 0f1ad2e93b..69de1bb5d9 100644 --- a/packages/batch/CHANGELOG.md +++ b/packages/batch/CHANGELOG.md @@ -1,5 +1,10 @@ # Change Log +## [2.27.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.1...v2.27.0) (2025-09-24) + +### Bug Fixes + +- fixed the build issue with Batch processor due to missing dependencies ([#4498](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4498)) ([ef67b43](https://github.com/aws-powertools/powertools-lambda-typescript/commit/ef67b43921f1d67b06b3257fb0f96c74e0d6dbae)) ## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) ### Bug Fixes diff --git a/packages/batch/package.json b/packages/batch/package.json index f4876b47fb..e1da30bfee 100644 --- a/packages/batch/package.json +++ b/packages/batch/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/batch", - "version": "2.26.1", + "version": "2.27.0", "description": "The batch processing package for the Powertools for AWS Lambda (TypeScript) library.", "author": { "name": "Amazon Web Services", @@ -81,11 +81,11 @@ "nodejs" ], "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1", + "@aws-lambda-powertools/commons": "2.27.0", "@standard-schema/spec": "^1.0.0" }, "devDependencies": { - "@aws-lambda-powertools/parser": "2.26.1", + "@aws-lambda-powertools/parser": "2.27.0", "@aws-lambda-powertools/testing-utils": "file:../testing", "zod": "^4.1.11" } diff --git a/packages/commons/CHANGELOG.md b/packages/commons/CHANGELOG.md index 9305018237..d2155d0696 100644 --- a/packages/commons/CHANGELOG.md +++ b/packages/commons/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.27.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.1...v2.27.0) (2025-09-24) + +**Note:** Version bump only for this package + ## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) **Note:** Version bump only for this package diff --git a/packages/commons/package.json b/packages/commons/package.json index 9f8516e349..3f93b3f614 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/commons", - "version": "2.26.1", + "version": "2.27.0", "description": "A shared utility package for Powertools for AWS Lambda (TypeScript) libraries", "author": { "name": "Amazon Web Services", diff --git a/packages/commons/src/version.ts b/packages/commons/src/version.ts index fc60956423..99db866aed 100644 --- a/packages/commons/src/version.ts +++ b/packages/commons/src/version.ts @@ -1,2 +1,2 @@ // this file is auto generated, do not modify -export const PT_VERSION = '2.26.1'; +export const PT_VERSION = '2.27.0'; diff --git a/packages/event-handler/CHANGELOG.md b/packages/event-handler/CHANGELOG.md index 7e6b25c7bc..39ce241b4b 100644 --- a/packages/event-handler/CHANGELOG.md +++ b/packages/event-handler/CHANGELOG.md @@ -1,5 +1,25 @@ # Change Log +## [2.27.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.1...v2.27.0) (2025-09-24) + +### Improvements + +- rename HttpErrorCodes to HttpStatusCodes ([#4543](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4543)) ([e53aa88](https://github.com/aws-powertools/powertools-lambda-typescript/commit/e53aa8816325f21510706e3f9e62fb0a76692915)) +- made error handler responses versatile ([#4536](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4536)) ([f08b366](https://github.com/aws-powertools/powertools-lambda-typescript/commit/f08b366b79152d338ebefb5a25caacade6846919)) +- changed path parameter in middleware and routehandler signature ([#4532](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4532)) ([278fca0](https://github.com/aws-powertools/powertools-lambda-typescript/commit/278fca0491ce9cb955326523557c3ddf9d03dbc5)) +- change the Middleware and RequestContext signatures ([#4530](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4530)) ([a05c074](https://github.com/aws-powertools/powertools-lambda-typescript/commit/a05c07411629d1e23a9cb3fec8a78cf23bd8dd0c)) + +### Bug Fixes + +- fixed CORS behaviour not aligned with CORS spec ([#4512](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4512)) ([dd368fa](https://github.com/aws-powertools/powertools-lambda-typescript/commit/dd368fa3eb08a86c2d5aad3cf9b832d7a8288486)) +- run global middleware on all requests for REST API ([#4507](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4507)) ([49d5f8a](https://github.com/aws-powertools/powertools-lambda-typescript/commit/49d5f8a4f36a5af26c573f7706347f34ec70689e)) + +### Features + +- implemented route prefixes in HTTP event handler ([#4523](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4523)) ([8913854](https://github.com/aws-powertools/powertools-lambda-typescript/commit/89138542cd9e195555299f401646ae94d0bb50ee)) +- throw error when middleware does not await next() ([#4511](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4511)) ([b0b43e8](https://github.com/aws-powertools/powertools-lambda-typescript/commit/b0b43e862fb189941fe9db220580884e7707d541)) +- add CORS middleware support ([#4477](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4477)) ([972cd1f](https://github.com/aws-powertools/powertools-lambda-typescript/commit/972cd1f86b6ea01c93abef5e6cde7876360196f1)) +- added compress middleware for the REST API event handler ([#4495](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4495)) ([320e0dc](https://github.com/aws-powertools/powertools-lambda-typescript/commit/320e0dcaa07476de3b7d07209ef27379b9d4900a)) ## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) **Note:** Version bump only for this package diff --git a/packages/event-handler/package.json b/packages/event-handler/package.json index 49510b81c9..2bbfcf4357 100644 --- a/packages/event-handler/package.json +++ b/packages/event-handler/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/event-handler", - "version": "2.26.1", + "version": "2.27.0", "description": "Lightweight routing to reduce boilerplate for API Gateway REST/HTTP API, ALB, Lambda Function URLs, and AppSync.", "author": { "name": "Amazon Web Services", @@ -124,7 +124,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1" + "@aws-lambda-powertools/commons": "2.27.0" }, "keywords": [ "aws", diff --git a/packages/idempotency/CHANGELOG.md b/packages/idempotency/CHANGELOG.md index bf523b6c16..56e6886b50 100644 --- a/packages/idempotency/CHANGELOG.md +++ b/packages/idempotency/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.27.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.1...v2.27.0) (2025-09-24) + +**Note:** Version bump only for this package + ## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) **Note:** Version bump only for this package diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index 39ff87718f..0e8b845fae 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/idempotency", - "version": "2.26.1", + "version": "2.27.0", "description": "The idempotency package for the Powertools for AWS Lambda (TypeScript) library. It provides options to make your Lambda functions idempotent and safe to retry.", "author": { "name": "Amazon Web Services", @@ -113,8 +113,8 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1", - "@aws-lambda-powertools/jmespath": "2.26.1" + "@aws-lambda-powertools/commons": "2.27.0", + "@aws-lambda-powertools/jmespath": "2.27.0" }, "peerDependencies": { "@aws-sdk/client-dynamodb": ">=3.x", diff --git a/packages/jmespath/CHANGELOG.md b/packages/jmespath/CHANGELOG.md index 8348394fe7..ef319e903a 100644 --- a/packages/jmespath/CHANGELOG.md +++ b/packages/jmespath/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.27.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.1...v2.27.0) (2025-09-24) + +**Note:** Version bump only for this package + ## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) **Note:** Version bump only for this package diff --git a/packages/jmespath/package.json b/packages/jmespath/package.json index 48065570dc..1c90f14c3e 100644 --- a/packages/jmespath/package.json +++ b/packages/jmespath/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/jmespath", - "version": "2.26.1", + "version": "2.27.0", "description": "A type safe and modern jmespath module to parse and extract data from JSON documents using JMESPath", "author": { "name": "Amazon Web Services", @@ -71,7 +71,7 @@ "lib" ], "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1" + "@aws-lambda-powertools/commons": "2.27.0" }, "repository": { "type": "git", diff --git a/packages/kafka/CHANGELOG.md b/packages/kafka/CHANGELOG.md index cd6864695b..477ce5160e 100644 --- a/packages/kafka/CHANGELOG.md +++ b/packages/kafka/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.27.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.1...v2.27.0) (2025-09-24) + +**Note:** Version bump only for this package + ## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) **Note:** Version bump only for this package diff --git a/packages/kafka/package.json b/packages/kafka/package.json index ed6b2b9c84..95bdf94360 100644 --- a/packages/kafka/package.json +++ b/packages/kafka/package.json @@ -1,7 +1,7 @@ { "name": "@aws-lambda-powertools/kafka", "description": "Utility to easily handle message deserialization and parsing of Kafka events in AWS Lambda functions", - "version": "2.26.1", + "version": "2.27.0", "author": { "name": "Amazon Web Services", "url": "https://aws.amazon.com" @@ -46,7 +46,7 @@ "nodejs" ], "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1", + "@aws-lambda-powertools/commons": "2.27.0", "@standard-schema/spec": "^1.0.0" }, "peerDependencies": { diff --git a/packages/logger/CHANGELOG.md b/packages/logger/CHANGELOG.md index 488e644cdc..4cb298c5de 100644 --- a/packages/logger/CHANGELOG.md +++ b/packages/logger/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.27.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.1...v2.27.0) (2025-09-24) + +**Note:** Version bump only for this package + ## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) **Note:** Version bump only for this package diff --git a/packages/logger/package.json b/packages/logger/package.json index 74f29bdaf0..e0fe39665d 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/logger", - "version": "2.26.1", + "version": "2.27.0", "description": "The logging package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -75,7 +75,7 @@ "@types/lodash.merge": "^4.6.9" }, "peerDependencies": { - "@aws-lambda-powertools/jmespath": "2.26.1", + "@aws-lambda-powertools/jmespath": "2.27.0", "@middy/core": "4.x || 5.x || 6.x" }, "peerDependenciesMeta": { @@ -97,7 +97,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1", + "@aws-lambda-powertools/commons": "2.27.0", "lodash.merge": "^4.6.2" }, "keywords": [ diff --git a/packages/metrics/CHANGELOG.md b/packages/metrics/CHANGELOG.md index 4ca9b2ce83..1c37993e32 100644 --- a/packages/metrics/CHANGELOG.md +++ b/packages/metrics/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.27.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.1...v2.27.0) (2025-09-24) + +**Note:** Version bump only for this package + ## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) **Note:** Version bump only for this package diff --git a/packages/metrics/package.json b/packages/metrics/package.json index 27758bf2cd..9f7ed0f48e 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/metrics", - "version": "2.26.1", + "version": "2.27.0", "description": "The metrics package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -87,7 +87,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1" + "@aws-lambda-powertools/commons": "2.27.0" }, "keywords": [ "aws", diff --git a/packages/parameters/CHANGELOG.md b/packages/parameters/CHANGELOG.md index 2c231f5b2d..673d06e176 100644 --- a/packages/parameters/CHANGELOG.md +++ b/packages/parameters/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.27.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.1...v2.27.0) (2025-09-24) + +**Note:** Version bump only for this package + ## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) **Note:** Version bump only for this package diff --git a/packages/parameters/package.json b/packages/parameters/package.json index 1f08901b72..56a4cfae5f 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/parameters", - "version": "2.26.1", + "version": "2.27.0", "description": "The parameters package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -164,7 +164,7 @@ "aws-sdk-client-mock": "^4.1.0" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1" + "@aws-lambda-powertools/commons": "2.27.0" }, "peerDependencies": { "@aws-sdk/client-appconfigdata": ">=3.x", diff --git a/packages/parser/CHANGELOG.md b/packages/parser/CHANGELOG.md index 39c9f7a97c..a80befe90c 100644 --- a/packages/parser/CHANGELOG.md +++ b/packages/parser/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.27.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.1...v2.27.0) (2025-09-24) + +**Note:** Version bump only for this package + ## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) **Note:** Version bump only for this package diff --git a/packages/parser/package.json b/packages/parser/package.json index af7daed5db..5f4e93bce9 100644 --- a/packages/parser/package.json +++ b/packages/parser/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/parser", - "version": "2.26.1", + "version": "2.27.0", "description": "The parser package for the Powertools for AWS Lambda (TypeScript) library.", "author": { "name": "Amazon Web Services", @@ -199,7 +199,7 @@ "nodejs" ], "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1", + "@aws-lambda-powertools/commons": "2.27.0", "@standard-schema/spec": "^1.0.0" }, "peerDependencies": { diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index df180307db..1a09f45128 100644 --- a/packages/testing/CHANGELOG.md +++ b/packages/testing/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.27.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.1...v2.27.0) (2025-09-24) + +**Note:** Version bump only for this package + ## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) **Note:** Version bump only for this package diff --git a/packages/testing/package.json b/packages/testing/package.json index 42b3bfb814..734dbe77a5 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/testing-utils", - "version": "2.26.1", + "version": "2.27.0", "description": "A package containing utilities to test your serverless workloads", "author": { "name": "Amazon Web Services", diff --git a/packages/tracer/CHANGELOG.md b/packages/tracer/CHANGELOG.md index dd966667cf..b667c49a8e 100644 --- a/packages/tracer/CHANGELOG.md +++ b/packages/tracer/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.27.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.1...v2.27.0) (2025-09-24) + +**Note:** Version bump only for this package + ## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) **Note:** Version bump only for this package diff --git a/packages/tracer/package.json b/packages/tracer/package.json index 159f06bf75..ac27c2e654 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/tracer", - "version": "2.26.1", + "version": "2.27.0", "description": "The tracer package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -86,7 +86,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1", + "@aws-lambda-powertools/commons": "2.27.0", "aws-xray-sdk-core": "^3.10.3" }, "keywords": [ diff --git a/packages/validation/CHANGELOG.md b/packages/validation/CHANGELOG.md index 648f26c8cf..0354fa379f 100644 --- a/packages/validation/CHANGELOG.md +++ b/packages/validation/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.27.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.1...v2.27.0) (2025-09-24) + +**Note:** Version bump only for this package + ## [2.26.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.26.0...v2.26.1) (2025-09-15) **Note:** Version bump only for this package diff --git a/packages/validation/package.json b/packages/validation/package.json index fd725fe238..0aa16cd4b2 100644 --- a/packages/validation/package.json +++ b/packages/validation/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/validation", - "version": "2.26.1", + "version": "2.27.0", "description": "An utility to validate events and responses using JSON Schemas", "author": { "name": "Amazon Web Services", @@ -95,8 +95,8 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1", - "@aws-lambda-powertools/jmespath": "2.26.1", + "@aws-lambda-powertools/commons": "2.27.0", + "@aws-lambda-powertools/jmespath": "2.27.0", "ajv": "^8.17.1" }, "keywords": [ From 4daeaad3e6419b3a0fa531e13d4689cb31b5565b Mon Sep 17 00:00:00 2001 From: Swopnil Dangol Date: Wed, 24 Sep 2025 10:34:51 +0100 Subject: [PATCH 185/255] chore(ci): update layer ARN on documentation (#4535) Co-authored-by: Stefano Vozza --- docs/getting-started/lambda-layers.md | 88 +++++++++++++-------------- examples/app/cdk/example-stack.ts | 2 +- examples/app/template.yaml | 2 +- 3 files changed, 46 insertions(+), 46 deletions(-) diff --git a/docs/getting-started/lambda-layers.md b/docs/getting-started/lambda-layers.md index 9eb2f8058b..10821df67f 100644 --- a/docs/getting-started/lambda-layers.md +++ b/docs/getting-started/lambda-layers.md @@ -19,41 +19,41 @@ We publish the Lambda Layer for Powertools for AWS Lambda in all commercial regi | Region | Layer ARN | | ---------------- | ---------------------------------------------------------------------------------------------------------- | -| `us-east-1` | [arn:aws:lambda:us-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `us-east-2` | [arn:aws:lambda:us-east-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `us-west-1` | [arn:aws:lambda:us-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `us-west-2` | [arn:aws:lambda:us-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `ap-south-1` | [arn:aws:lambda:ap-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `ap-south-2` | [arn:aws:lambda:ap-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `ap-east-1` | [arn:aws:lambda:ap-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `ap-northeast-1` | [arn:aws:lambda:ap-northeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `ap-northeast-2` | [arn:aws:lambda:ap-northeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `ap-northeast-3` | [arn:aws:lambda:ap-northeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `ap-southeast-1` | [arn:aws:lambda:ap-southeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `ap-southeast-2` | [arn:aws:lambda:ap-southeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `ap-southeast-3` | [arn:aws:lambda:ap-southeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `ap-southeast-4` | [arn:aws:lambda:ap-southeast-4:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `ap-southeast-5` | [arn:aws:lambda:ap-southeast-5:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `ap-southeast-7` | [arn:aws:lambda:ap-southeast-7:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `eu-central-1` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `eu-central-2` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `eu-west-1` | [arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `eu-west-2` | [arn:aws:lambda:eu-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `eu-west-3` | [arn:aws:lambda:eu-west-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `eu-north-1` | [arn:aws:lambda:eu-north-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `eu-south-1` | [arn:aws:lambda:eu-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `eu-south-2` | [arn:aws:lambda:eu-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `ca-central-1` | [arn:aws:lambda:ca-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `ca-west-1` | [arn:aws:lambda:ca-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `sa-east-1` | [arn:aws:lambda:sa-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `af-south-1` | [arn:aws:lambda:af-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `me-south-1` | [arn:aws:lambda:me-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `me-central-1` | [arn:aws:lambda:me-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `il-central-1` | [arn:aws:lambda:il-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `mx-central-1` | [arn:aws:lambda:mx-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `us-gov-west-1` | [arn:aws-us-gov:lambda:us-gov-west-1:165093116878:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `us-gov-east-1` | [arn:aws-us-gov:lambda:us-gov-east-1:165087284144:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | -| `cn-north-1` | [arn:aws-aws-cn:lambda:cn-north-1:498634801083:layer:AWSLambdaPowertoolsTypeScriptV2:37](#){: .copyMe} | +| `us-east-1` | [arn:aws:lambda:us-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `us-east-2` | [arn:aws:lambda:us-east-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `us-west-1` | [arn:aws:lambda:us-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `us-west-2` | [arn:aws:lambda:us-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `ap-south-1` | [arn:aws:lambda:ap-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `ap-south-2` | [arn:aws:lambda:ap-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `ap-east-1` | [arn:aws:lambda:ap-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `ap-northeast-1` | [arn:aws:lambda:ap-northeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `ap-northeast-2` | [arn:aws:lambda:ap-northeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `ap-northeast-3` | [arn:aws:lambda:ap-northeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `ap-southeast-1` | [arn:aws:lambda:ap-southeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `ap-southeast-2` | [arn:aws:lambda:ap-southeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `ap-southeast-3` | [arn:aws:lambda:ap-southeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `ap-southeast-4` | [arn:aws:lambda:ap-southeast-4:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `ap-southeast-5` | [arn:aws:lambda:ap-southeast-5:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `ap-southeast-7` | [arn:aws:lambda:ap-southeast-7:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `eu-central-1` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `eu-central-2` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `eu-west-1` | [arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `eu-west-2` | [arn:aws:lambda:eu-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `eu-west-3` | [arn:aws:lambda:eu-west-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `eu-north-1` | [arn:aws:lambda:eu-north-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `eu-south-1` | [arn:aws:lambda:eu-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `eu-south-2` | [arn:aws:lambda:eu-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `ca-central-1` | [arn:aws:lambda:ca-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `ca-west-1` | [arn:aws:lambda:ca-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `sa-east-1` | [arn:aws:lambda:sa-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `af-south-1` | [arn:aws:lambda:af-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `me-south-1` | [arn:aws:lambda:me-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `me-central-1` | [arn:aws:lambda:me-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `il-central-1` | [arn:aws:lambda:il-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `mx-central-1` | [arn:aws:lambda:mx-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `us-gov-west-1` | [arn:aws-us-gov:lambda:us-gov-west-1:165093116878:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `us-gov-east-1` | [arn:aws-us-gov:lambda:us-gov-east-1:165087284144:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | +| `cn-north-1` | [arn:aws-aws-cn:lambda:cn-north-1:498634801083:layer:AWSLambdaPowertoolsTypeScriptV2:38](#){: .copyMe} | ### Lookup Layer ARN via AWS SSM Parameter Store @@ -71,7 +71,7 @@ Parameter: LastModifiedDate: '2025-02-11T11:08:45.070000+01:00' Name: /aws/service/powertools/typescript/generic/all/2.14.0 Type: String - Value: arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37 + Value: arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38 Version: 1 ``` @@ -91,7 +91,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi === "AWS CLI command to download Lambda Layer content" ```bash - aws lambda get-layer-version-by-arn --arn arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37 --region {aws::region} + aws lambda get-layer-version-by-arn --arn arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38 --region {aws::region} ``` === "AWS CLI output" @@ -104,7 +104,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi "CodeSize": 3548324 }, "LayerArn": "arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2", - "LayerVersionArn": "arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37", + "LayerVersionArn": "arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38", "Description": "Powertools for AWS Lambda (TypeScript) version 2.18.0", "CreatedDate": "2025-04-08T07:38:30.424+0000", "Version": 24, @@ -138,7 +138,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi const powertoolsLayer = LayerVersion.fromLayerVersionArn( this, 'PowertoolsLayer', - `arn:aws:lambda:${Stack.of(this).region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37` + `arn:aws:lambda:${Stack.of(this).region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38` ); new NodejsFunction(this, 'Function', { @@ -208,7 +208,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi Type: AWS::Serverless::Function Properties: Layers: - - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37 + - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38 ``` You can also use AWS SSM Parameter Store to dynamically add Powertools for AWS Lambda and resolve the Layer ARN from SSM Parameter Store in your code, allowing you to pin to `latest` or a specific Powertools for AWS Lambda version. @@ -247,7 +247,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi hello: handler: lambda_function.lambda_handler layers: - - arn:aws:lambda:${aws:region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37 + - arn:aws:lambda:${aws:region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38 ``` If you use `esbuild` to bundle your code, make sure to exclude `@aws-lambda-powertools/*` and `@aws-sdk/*` from being bundled since the packages are already present the layer: @@ -282,7 +282,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi role = ... handler = "index.handler" runtime = "nodejs22.x" - layers = ["arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37"] + layers = ["arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38"] source_code_hash = filebase64sha256("lambda_function_payload.zip") } ``` @@ -317,7 +317,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi const lambdaFunction = new aws.lambda.Function('function', { layers: [ - pulumi.interpolate`arn:aws:lambda:${aws.getRegionOutput().name}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37` + pulumi.interpolate`arn:aws:lambda:${aws.getRegionOutput().name}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38` ], code: new pulumi.asset.FileArchive('lambda_function_payload.zip'), tracingConfig: { @@ -341,7 +341,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi name: "my-function", layers: { "@aws-lambda-powertools/*": - "arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37", + "arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38", }, }); ``` diff --git a/examples/app/cdk/example-stack.ts b/examples/app/cdk/example-stack.ts index 0db50ab9fb..bef6bb588a 100644 --- a/examples/app/cdk/example-stack.ts +++ b/examples/app/cdk/example-stack.ts @@ -39,7 +39,7 @@ export class PowertoolsExampleStack extends Stack { 'powertools-layer', `arn:aws:lambda:${ Stack.of(this).region - }:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37` + }:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38` ); // Items table diff --git a/examples/app/template.yaml b/examples/app/template.yaml index c6d5051fff..c9b2419538 100644 --- a/examples/app/template.yaml +++ b/examples/app/template.yaml @@ -130,7 +130,7 @@ Resources: - DynamoDBReadPolicy: TableName: !Ref itemsTable Layers: - - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:37 + - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:38 Environment: Variables: TABLE_NAME: !Ref itemsTable From e155e72af3942b9fbc508cc3b59c19692045f57c Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Wed, 24 Sep 2025 11:54:04 +0200 Subject: [PATCH 186/255] chore: sanitize CI inputs via env var (#4528) --- .github/workflows/bootstrap_region.yml | 10 +++++-- .github/workflows/layer_balance.yml | 13 ++++++++-- .github/workflows/layers_partition_verify.yml | 20 +++++++++++--- .github/workflows/layers_partitions.yml | 22 ++++++++++------ .github/workflows/publish_layer.yml | 4 ++- .github/workflows/reusable_publish_docs.yml | 26 +++++++++++++------ .github/workflows/run-e2e-tests.yml | 5 +++- .github/workflows/update_ssm.yml | 7 ++--- 8 files changed, 78 insertions(+), 29 deletions(-) diff --git a/.github/workflows/bootstrap_region.yml b/.github/workflows/bootstrap_region.yml index f9ab180956..b0f879148f 100644 --- a/.github/workflows/bootstrap_region.yml +++ b/.github/workflows/bootstrap_region.yml @@ -65,10 +65,13 @@ jobs: mkdir -p build/project - id: cdk-project name: CDK Project + env: + REGION: ${{ inputs.region }} working-directory: build/project run: | + set -euo pipefail npx cdk init app --language=typescript - AWS_REGION="${{ inputs.region }}" npx cdk bootstrap + AWS_REGION="$REGION" npx cdk bootstrap copy_layers: name: Copy Layers @@ -101,4 +104,7 @@ jobs: name: Run Balance env: BALANCE_ROLE_ARN: ${{ secrets.BALANCE_ROLE_ARN }} - run: balance -read-region us-east-1 -write-region ${{ inputs.region }} -write-role $BALANCE_ROLE_ARN -layer-name AWSLambdaPowertoolsTypeScriptV2 -dry-run=false + REGION: ${{ inputs.region }} + run: | + set -euo pipefail + balance -read-region us-east-1 -write-region "$REGION" -write-role "$BALANCE_ROLE_ARN" -layer-name AWSLambdaPowertoolsTypeScriptV2 -dry-run=false diff --git a/.github/workflows/layer_balance.yml b/.github/workflows/layer_balance.yml index 1e6c6a7e89..06804a4b87 100644 --- a/.github/workflows/layer_balance.yml +++ b/.github/workflows/layer_balance.yml @@ -64,8 +64,17 @@ jobs: - id: run-balance-new-region name: Run Balance if: ${{ inputs.start_at == '' }} - run: balance -read-region us-east-1 -write-region ${{ inputs.region }} -write-role $BALANCE_ROLE_ARN -layer-name AWSLambdaPowertoolsTypeScriptV2 -dry-run=false + env: + REGION: ${{ inputs.region }} + run: | + set -euo pipefail + balance -read-region us-east-1 -write-region "$REGION" -write-role "$BALANCE_ROLE_ARN" -layer-name AWSLambdaPowertoolsTypeScriptV2 -dry-run=false - id: run-balance-existing name: Run Balance (Existing Region) if: ${{ inputs.start_at != '' }} - run: balance -read-region us-east-1 -start-at ${{ inputs.start_at }} -write-region ${{ inputs.region }} -write-role $BALANCE_ROLE_ARN -layer-name AWSLambdaPowertoolsTypeScriptV2 -dry-run=false + env: + REGION: ${{ inputs.region }} + START_AT: ${{ inputs.start_at }} + run: | + set -euo pipefail + balance -read-region us-east-1 -start-at "$START_AT" -write-region "$REGION" -write-role "$BALANCE_ROLE_ARN" -layer-name AWSLambdaPowertoolsTypeScriptV2 -dry-run=false diff --git a/.github/workflows/layers_partition_verify.yml b/.github/workflows/layers_partition_verify.yml index 7370d375f7..82eddb210e 100644 --- a/.github/workflows/layers_partition_verify.yml +++ b/.github/workflows/layers_partition_verify.yml @@ -90,9 +90,12 @@ jobs: aws-region: us-east-1 mask-aws-account-id: true - name: Output AWSLambdaPowertoolsTypeScriptV2 + env: + VERSION: ${{ inputs.version }} # fetch the specific layer version information from the us-east-1 commercial region run: | - aws --region us-east-1 lambda get-layer-version-by-arn --arn 'arn:aws:lambda:us-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:${{ inputs.version }}' > AWSLambdaPowertoolsTypeScriptV2.json + set -euo pipefail + aws --region us-east-1 lambda get-layer-version-by-arn --arn "arn:aws:lambda:us-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:${VERSION}" > AWSLambdaPowertoolsTypeScriptV2.json - name: Store Metadata uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: @@ -133,13 +136,22 @@ jobs: audience: ${{ needs.setup.outputs.aud }} - id: partition_version name: Partition Layer Version + env: + VERSION: ${{ inputs.version }} + PARTITION_VERSION: ${{ inputs.partition_version }} run: | - echo 'partition_version=$([[ -n "${{ inputs.partition_version}}" ]] && echo ${{ inputs.partition_version}} || echo ${{ inputs.version }} )' >> "$GITHUB_OUTPUT" + set -euo pipefail + if [ -n "${PARTITION_VERSION:-}" ]; then + echo "partition_version=${PARTITION_VERSION}" >> "$GITHUB_OUTPUT" + else + echo "partition_version=${VERSION}" >> "$GITHUB_OUTPUT" + fi - name: Verify Layer run: | - export layer_output='AWSLambdaPowertoolsTypeScriptV2-${{matrix.region}}.json' + set -euo pipefail + layer_output="AWSLambdaPowertoolsTypeScriptV2-${{ matrix.region }}.json" # Dynamic secret access is safe here - secrets are scoped per environment - aws --region ${{ matrix.region}} lambda get-layer-version-by-arn --arn "arn:${{ needs.setup.outputs.partition }}:lambda:${{ matrix.region}}:${{ secrets[format('AWS_ACCOUNT_{0}', steps.transform.outputs.CONVERTED_REGION)] }}:layer:AWSLambdaPowertoolsTypeScriptV2:${{ steps.partition_version.outputs.partition_version }}" > $layer_output + aws --region "${{ matrix.region }}" lambda get-layer-version-by-arn --arn "arn:${{ needs.setup.outputs.partition }}:lambda:${{ matrix.region }}:${{ secrets[format('AWS_ACCOUNT_{0}', steps.transform.outputs.CONVERTED_REGION)] }}:layer:AWSLambdaPowertoolsTypeScriptV2:${{ steps.partition_version.outputs.partition_version }}" > "$layer_output" REMOTE_SHA=$(jq -r '.Content.CodeSha256' $layer_output) LOCAL_SHA=$(jq -r '.Content.CodeSha256' AWSLambdaPowertoolsTypeScriptV2.json) test "$REMOTE_SHA" == "$LOCAL_SHA" && echo "SHA OK: ${LOCAL_SHA}" || exit 1 diff --git a/.github/workflows/layers_partitions.yml b/.github/workflows/layers_partitions.yml index 211e05ad13..246771a50b 100644 --- a/.github/workflows/layers_partitions.yml +++ b/.github/workflows/layers_partitions.yml @@ -99,9 +99,12 @@ jobs: aws-region: us-east-1 mask-aws-account-id: true - name: Grab Zip + env: + VERSION: ${{ inputs.version }} run: | - aws --region us-east-1 lambda get-layer-version-by-arn --arn arn:aws:lambda:us-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:${{ inputs.version }} --query 'Content.Location' | xargs curl -L -o AWSLambdaPowertoolsTypeScriptV2.zip - aws --region us-east-1 lambda get-layer-version-by-arn --arn arn:aws:lambda:us-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:${{ inputs.version }} > AWSLambdaPowertoolsTypeScriptV2.json + set -euo pipefail + aws --region us-east-1 lambda get-layer-version-by-arn --arn "arn:aws:lambda:us-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:${VERSION}" --query 'Content.Location' | xargs curl -L -o AWSLambdaPowertoolsTypeScriptV2.zip + aws --region us-east-1 lambda get-layer-version-by-arn --arn "arn:aws:lambda:us-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:${VERSION}" > AWSLambdaPowertoolsTypeScriptV2.json - name: Store Zip uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: @@ -158,9 +161,10 @@ jobs: - name: Create Layer id: create-layer run: | + set -euo pipefail cat AWSLambdaPowertoolsTypeScriptV2.json | jq '{"LayerName": "AWSLambdaPowertoolsTypeScriptV2", "Description": .Description, "CompatibleRuntimes": .CompatibleRuntimes, "LicenseInfo": .LicenseInfo}' > input.json - - LAYER_VERSION=$(aws --region ${{ matrix.region}} lambda publish-layer-version \ + + LAYER_VERSION=$(aws --region "${{ matrix.region }}" lambda publish-layer-version \ --zip-file fileb://./AWSLambdaPowertoolsTypeScriptV2.zip \ --cli-input-json file://./input.json \ --query 'Version' \ @@ -168,7 +172,7 @@ jobs: echo "LAYER_VERSION=$LAYER_VERSION" >> "$GITHUB_OUTPUT" - aws --region ${{ matrix.region}} lambda add-layer-version-permission \ + aws --region "${{ matrix.region }}" lambda add-layer-version-permission \ --layer-name 'AWSLambdaPowertoolsTypeScriptV2' \ --statement-id 'PublicLayer' \ --action lambda:GetLayerVersion \ @@ -182,17 +186,19 @@ jobs: - name: Verify Layer env: LAYER_VERSION: ${{ steps.create-layer.outputs.LAYER_VERSION }} + ENVIRONMENT: ${{ inputs.environment }} run: | - export layer_output='AWSLambdaPowertoolsTypeScriptV2-${{matrix.region}}.json' + set -euo pipefail + export layer_output="AWSLambdaPowertoolsTypeScriptV2-${{ matrix.region }}.json" # Dynamic secret access is safe here - secrets are scoped per environment - aws --region ${{ matrix.region}} lambda get-layer-version-by-arn --arn 'arn:${{ needs.setup.outputs.partition }}:lambda:${{ matrix.region}}:${{ secrets[format('AWS_ACCOUNT_{0}', steps.transform.outputs.CONVERTED_REGION)] }}:layer:AWSLambdaPowertoolsTypeScriptV2:${{ env.LAYER_VERSION }}' > $layer_output + aws --region "${{ matrix.region }}" lambda get-layer-version-by-arn --arn "arn:${{ needs.setup.outputs.partition }}:lambda:${{ matrix.region }}:${{ secrets[format('AWS_ACCOUNT_{0}', steps.transform.outputs.CONVERTED_REGION)] }}:layer:AWSLambdaPowertoolsTypeScriptV2:${LAYER_VERSION}" > "$layer_output" REMOTE_SHA=$(jq -r '.Content.CodeSha256' $layer_output) LOCAL_SHA=$(jq -r '.Content.CodeSha256' AWSLambdaPowertoolsTypeScriptV2.json) test "$REMOTE_SHA" == "$LOCAL_SHA" && echo "SHA OK: ${LOCAL_SHA}" || exit 1 REMOTE_DESCRIPTION=$(jq -r '.Description' $layer_output) LOCAL_DESCRIPTION=$(jq -r '.Description' AWSLambdaPowertoolsTypeScriptV2.json) test "$REMOTE_DESCRIPTION" == "$LOCAL_DESCRIPTION" && echo "Version number OK: ${LOCAL_DESCRIPTION}" || exit 1 - if [ "${{ inputs.environment }}" == "Prod" ]; then + if [ "$ENVIRONMENT" == "Prod" ]; then REMOTE_LAYER_VERSION=$(jq -r '.LayerVersionArn' $layer_output | sed 's/.*://') LOCAL_LAYER_VERSION=$(jq -r '.LayerVersionArn' AWSLambdaPowertoolsTypeScriptV2.json | sed 's/.*://') test "$REMOTE_LAYER_VERSION" == "$LOCAL_LAYER_VERSION" && echo "Layer Version number OK: ${LOCAL_LAYER_VERSION}" || exit 1 diff --git a/.github/workflows/publish_layer.yml b/.github/workflows/publish_layer.yml index 9f7bb569b3..35f4763a27 100644 --- a/.github/workflows/publish_layer.yml +++ b/.github/workflows/publish_layer.yml @@ -48,7 +48,9 @@ jobs: - name: Setup dependencies uses: aws-powertools/actions/.github/actions/cached-node-modules@29979bc5339bf54f76a11ac36ff67701986bb0f0 - name: CDK build - run: npm run cdk -w layers -- synth --context PowertoolsPackageVersion=${{ inputs.latest_published_version }} -o cdk.out + env: + LAYER_VERSION: ${{ inputs.latest_published_version }} + run: npm run cdk -w layers -- synth --context PowertoolsPackageVersion=$LAYER_VERSION -o cdk.out - name: Zip output run: zip -r cdk.out.zip layers/cdk.out - name: Archive CDK artifacts diff --git a/.github/workflows/reusable_publish_docs.yml b/.github/workflows/reusable_publish_docs.yml index 708175c164..b2f67a70bd 100644 --- a/.github/workflows/reusable_publish_docs.yml +++ b/.github/workflows/reusable_publish_docs.yml @@ -64,22 +64,29 @@ jobs: python-version: "3.12" - name: Install doc generation dependencies run: | + set -euo pipefail pip install --require-hashes -r docs/requirements.txt - name: Git refresh tip (detached mode) # Git Detached mode (release notes) doesn't have origin if: ${{ inputs.detached_mode }} run: | + set -euo pipefail git config pull.rebase true - git config remote.origin.url >&- || git remote add origin https://github.com/"$ORIGIN" + git config remote.origin.url >&- || git remote add origin "https://github.com/$ORIGIN" git pull origin "$BRANCH" env: BRANCH: ${{ inputs.git_ref }} - name: Normalize Version Number - run: echo "VERSION=$(echo ${{ inputs.version }} | sed 's/v//')" >> $GITHUB_ENV + env: + VERSION: ${{ inputs.version }} + run: | + set -euo pipefail + echo "VERSION=$(echo "$VERSION" | sed 's/v//')" >> "$GITHUB_ENV" - name: Build docs website and API reference env: ALIAS: ${{ inputs.alias }} run: | + set -euo pipefail rm -rf site mkdocs build - name: Configure AWS credentials @@ -99,18 +106,20 @@ jobs: ALIAS: ${{ inputs.alias }} AWS_DOCS_BUCKET: ${{ secrets.AWS_DOCS_BUCKET }} run: | + set -euo pipefail aws s3 sync \ site/ \ - s3://$AWS_DOCS_BUCKET/lambda-typescript/$VERSION/ + "s3://$AWS_DOCS_BUCKET/lambda-typescript/$VERSION/" - name: Deploy Docs (Alias) env: VERSION: ${{ inputs.version }} ALIAS: ${{ inputs.alias }} AWS_DOCS_BUCKET: ${{ secrets.AWS_DOCS_BUCKET }} run: | + set -euo pipefail aws s3 sync \ site/ \ - s3://$AWS_DOCS_BUCKET/lambda-typescript/$ALIAS/ + "s3://$AWS_DOCS_BUCKET/lambda-typescript/$ALIAS/" - name: Deploy Docs (Version JSON) env: VERSION: ${{ inputs.version }} @@ -129,11 +138,12 @@ jobs: # - if it's a new version number, we add it at position 0 in the array. # 4. Once done, we'll upload it back to S3. run: | + set -euo pipefail aws s3 cp \ - s3://$AWS_DOCS_BUCKET/lambda-typescript/versions.json \ + "s3://$AWS_DOCS_BUCKET/lambda-typescript/versions.json" \ versions_old.json - jq 'del(.[].aliases[] | select(. == "${{ env.ALIAS }}"))' < versions_old.json > versions_proc.json - jq '. as $o | [{"title": "${{ env.VERSION }}", "version": "${{ env.VERSION }}", "aliases": ["${{ env.ALIAS }}"] }] as $n | $n | if .[0].title | test("[a-z]+") or any($o[].title == $n[0].title;.) then [($o | .[] | select(.title == $n[0].title).aliases += $n[0].aliases | . )] else $n + $o end' < versions_proc.json > versions.json + jq --arg ALIAS "$ALIAS" 'del(.[].aliases[] | select(. == $ALIAS))' < versions_old.json > versions_proc.json + jq --arg VERSION "$VERSION" --arg ALIAS "$ALIAS" '. as $o | [{"title": $VERSION, "version": $VERSION, "aliases": [$ALIAS]}] as $n | $n | if .[0].title | test("[a-z]+") or any($o[].title == $n[0].title;.) then [($o | .[] | select(.title == $n[0].title).aliases += $n[0].aliases | . )] else $n + $o end' < versions_proc.json > versions.json aws s3 cp \ versions.json \ - s3://$AWS_DOCS_BUCKET/lambda-typescript/versions.json + "s3://$AWS_DOCS_BUCKET/lambda-typescript/versions.json" diff --git a/.github/workflows/run-e2e-tests.yml b/.github/workflows/run-e2e-tests.yml index 2a5c1f7f7b..6d28f1f807 100644 --- a/.github/workflows/run-e2e-tests.yml +++ b/.github/workflows/run-e2e-tests.yml @@ -44,8 +44,11 @@ jobs: # we checkout the PR at that point in time - name: Checkout PR code if: ${{ inputs.prNumber != '' }} + env: + PR_NUMBER: ${{ inputs.prNumber }} run: | - gh pr checkout ${{ inputs.prNumber }} + set -euo pipefail + gh pr checkout "$PR_NUMBER" - name: Setup Node.js uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: diff --git a/.github/workflows/update_ssm.yml b/.github/workflows/update_ssm.yml index ae7282b15e..157fa6ac55 100644 --- a/.github/workflows/update_ssm.yml +++ b/.github/workflows/update_ssm.yml @@ -129,13 +129,14 @@ jobs: mask-aws-account-id: true - id: write-version env: - prefix: ${{ inputs.environment == 'beta' && '/aws/service/powertools/beta' || '/aws/service/powertools' }} + PREFIX: ${{ inputs.environment == 'beta' && '/aws/service/powertools/beta' || '/aws/service/powertools' }} + PACKAGE_VERSION: ${{ inputs.package_version }} run: | - aws ssm put-parameter --name ${{ env.prefix }}/typescript/generic/all/${{ inputs.package_version }} --value "arn:aws:lambda:${{ matrix.region }}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:${{ inputs.layer-version }}" --type String --overwrite + aws ssm put-parameter --name "$PREFIX/typescript/generic/all/$PACKAGE_VERSION" --value "arn:aws:lambda:${{ matrix.region }}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:${{ inputs.layer-version }}" --type String --overwrite - id: write-latest if: inputs.write_latest == true env: prefix: ${{ inputs.environment == 'beta' && '/aws/service/powertools/beta' || '/aws/service/powertools' }} run: | - aws ssm put-parameter --name ${{ env.prefix }}/typescript/generic/all/latest --value "arn:aws:lambda:${{ matrix.region }}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:${{ inputs.layer-version }}" --type String --overwrite + aws ssm put-parameter --name "${{ env.prefix }}/typescript/generic/all/latest" --value "arn:aws:lambda:${{ matrix.region }}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:${{ inputs.layer-version }}" --type String --overwrite From 38b6e82a0d9f4f46bb5253ba5157487bbbb884df Mon Sep 17 00:00:00 2001 From: Swopnil Dangol Date: Thu, 25 Sep 2025 14:44:38 +0100 Subject: [PATCH 187/255] feat(event-handler): added `includeRouter` method to split routes (#4573) --- .../src/rest/ErrorHandlerRegistry.ts | 17 +++++++ .../src/rest/RouteHandlerRegistry.ts | 38 +++++++++++++- packages/event-handler/src/rest/Router.ts | 50 +++++++++++++++++-- packages/event-handler/src/rest/utils.ts | 13 +++++ .../unit/rest/Router/basic-routing.test.ts | 50 ++++++++++++++++++- .../tests/unit/rest/utils.test.ts | 20 +++++++- 6 files changed, 180 insertions(+), 8 deletions(-) diff --git a/packages/event-handler/src/rest/ErrorHandlerRegistry.ts b/packages/event-handler/src/rest/ErrorHandlerRegistry.ts index 2a68b72d53..3dd3bbc479 100644 --- a/packages/event-handler/src/rest/ErrorHandlerRegistry.ts +++ b/packages/event-handler/src/rest/ErrorHandlerRegistry.ts @@ -71,4 +71,21 @@ export class ErrorHandlerRegistry { return null; } + + /** + * Merges another {@link ErrorHandlerRegistry | `ErrorHandlerRegistry`} instance into the current instance. + * It takes the handlers from the provided registry and adds them to the current registry. + * + * Error handlers from the included router are merged with existing handlers. If handlers for the same error type exist in both routers, the included router's handler takes precedence. + * + * @param errorHandlerRegistry - The registry instance to merge with the current instance + */ + public merge(errorHandlerRegistry: ErrorHandlerRegistry): void { + for (const [ + errorConstructor, + errorHandler, + ] of errorHandlerRegistry.#handlers) { + this.register(errorConstructor, errorHandler); + } + } } diff --git a/packages/event-handler/src/rest/RouteHandlerRegistry.ts b/packages/event-handler/src/rest/RouteHandlerRegistry.ts index 0c338f141d..116b95b91e 100644 --- a/packages/event-handler/src/rest/RouteHandlerRegistry.ts +++ b/packages/event-handler/src/rest/RouteHandlerRegistry.ts @@ -8,8 +8,12 @@ import type { ValidationResult, } from '../types/rest.js'; import { ParameterValidationError } from './errors.js'; -import type { Route } from './Route.js'; -import { compilePath, validatePathPattern } from './utils.js'; +import { Route } from './Route.js'; +import { + compilePath, + resolvePrefixedPath, + validatePathPattern, +} from './utils.js'; class RouteHandlerRegistry { readonly #staticRoutes: Map = new Map(); @@ -193,6 +197,36 @@ class RouteHandlerRegistry { return null; } + + /** + * Merges another {@link RouteHandlerRegistry | `RouteHandlerRegistry`} instance into the current instance. + * It takes the static and dynamic routes from the provided registry and adds them to the current registry. + * + * Routes from the included router are added to the current router's registry. If a route with the same method and path already exists, the included router's route takes precedence. + * + * @param routeHandlerRegistry - The registry instance to merge with the current instance + * @param options - Configuration options for merging the router + * @param options.prefix - An optional prefix to be added to the paths defined in the router + */ + public merge( + routeHandlerRegistry: RouteHandlerRegistry, + options?: { prefix: Path } + ): void { + const routes = [ + ...routeHandlerRegistry.#staticRoutes.values(), + ...routeHandlerRegistry.#dynamicRoutes, + ]; + for (const route of routes) { + this.register( + new Route( + route.method as HttpMethod, + resolvePrefixedPath(route.path, options?.prefix), + route.handler, + route.middleware + ) + ); + } + } } export { RouteHandlerRegistry }; diff --git a/packages/event-handler/src/rest/Router.ts b/packages/event-handler/src/rest/Router.ts index cbff596d09..8ce3f5e191 100644 --- a/packages/event-handler/src/rest/Router.ts +++ b/packages/event-handler/src/rest/Router.ts @@ -41,6 +41,7 @@ import { isAPIGatewayProxyEvent, isAPIGatewayProxyResult, isHttpMethod, + resolvePrefixedPath, } from './utils.js'; class Router { @@ -293,10 +294,7 @@ class Router { public route(handler: RouteHandler, options: RestRouteOptions): void { const { method, path, middleware = [] } = options; const methods = Array.isArray(method) ? method : [method]; - let resolvedPath = path; - if (this.prefix) { - resolvedPath = path === '/' ? this.prefix : `${this.prefix}${path}`; - } + const resolvedPath = resolvePrefixedPath(path, this.prefix); for (const method of methods) { this.routeRegistry.register( @@ -551,6 +549,50 @@ class Router { handler ); } + + /** + * Merges the routes, context and middleware from the passed router instance into this router instance. + * + * **Override Behaviors:** + * - **Context**: Properties from the included router override existing properties with the same key in the current router. A warning is logged when conflicts occur. + * - **Routes**: Routes from the included router are added to the current router's registry. If a route with the same method and path already exists, the included router's route takes precedence. + * - **Error Handlers**: Error handlers from the included router are merged with existing handlers. If handlers for the same error type exist in both routers, the included router's handler takes precedence. + * - **Middleware**: Middleware from the included router is appended to the current router's middleware array. All middleware executes in registration order (current router's middleware first, then included router's middleware). + * + * @example + * ```typescript + * import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; + * + * const todosRouter = new Router(); + * + * todosRouter.get('/todos', async () => { + * // List API + * }); + * + * todosRouter.get('/todos/{todoId}', async () => { + * // Get API + * }); + * + * const app = new Router(); + * app.includeRouter(todosRouter); + * + * export const handler = async (event: unknown, context: Context) => { + * return app.resolve(event, context); + * }; + * ``` + * @param router - The `Router` from which to merge the routes, context and middleware + * @param options - Configuration options for merging the router + * @param options.prefix - An optional prefix to be added to the paths defined in the router + */ + public includeRouter(router: Router, options?: { prefix: Path }): void { + this.context = { + ...this.context, + ...router.context, + }; + this.routeRegistry.merge(router.routeRegistry, options); + this.errorHandlerRegistry.merge(router.errorHandlerRegistry); + this.middleware.push(...router.middleware); + } } export { Router }; diff --git a/packages/event-handler/src/rest/utils.ts b/packages/event-handler/src/rest/utils.ts index e8fbd1e5d0..eb587a0b7d 100644 --- a/packages/event-handler/src/rest/utils.ts +++ b/packages/event-handler/src/rest/utils.ts @@ -196,3 +196,16 @@ export const composeMiddleware = (middleware: Middleware[]): Middleware => { return result; }; }; + +/** + * Resolves a prefixed path by combining the provided path and prefix. + * + * @param path - The path to resolve + * @param prefix - The prefix to prepend to the path + */ +export const resolvePrefixedPath = (path: Path, prefix?: Path): Path => { + if (prefix) { + return path === '/' ? prefix : `${prefix}${path}`; + } + return path; +}; diff --git a/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts b/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts index d4dffadb44..a17ce1eb46 100644 --- a/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts @@ -1,5 +1,5 @@ import context from '@aws-lambda-powertools/testing-utils/context'; -import { describe, expect, it } from 'vitest'; +import { describe, expect, it, vi } from 'vitest'; import { HttpStatusCodes, HttpVerbs, @@ -144,4 +144,52 @@ describe('Class: Router - Basic Routing', () => { expect(JSON.parse(createResult.body).actualPath).toBe('/todos'); expect(JSON.parse(getResult.body).actualPath).toBe('/todos/1'); }); + + it('routes to the included router when using split routers', async () => { + // Prepare + const todoRouter = new Router({ logger: console }); + todoRouter.use(async ({ next }) => { + console.log('todoRouter middleware'); + await next(); + }); + todoRouter.get('/', async () => ({ api: 'listTodos' })); + todoRouter.notFound(async () => { + return { + error: 'Route not found', + }; + }); + const consoleLogSpy = vi.spyOn(console, 'log'); + const consoleWarnSpy = vi.spyOn(console, 'warn'); + + const app = new Router(); + app.use(async ({ next }) => { + console.log('app middleware'); + await next(); + }); + app.get('/todos', async () => ({ api: 'rootTodos' })); + app.get('/', async () => ({ api: 'root' })); + app.includeRouter(todoRouter, { prefix: '/todos' }); + + // Act + const rootResult = await app.resolve(createTestEvent('/', 'GET'), context); + const listTodosResult = await app.resolve( + createTestEvent('/todos', 'GET'), + context + ); + const notFoundResult = await app.resolve( + createTestEvent('/non-existent', 'GET'), + context + ); + + // Assert + expect(JSON.parse(rootResult.body).api).toEqual('root'); + expect(JSON.parse(listTodosResult.body).api).toEqual('listTodos'); + expect(JSON.parse(notFoundResult.body).error).toEqual('Route not found'); + expect(consoleLogSpy).toHaveBeenNthCalledWith(1, 'app middleware'); + expect(consoleLogSpy).toHaveBeenNthCalledWith(2, 'todoRouter middleware'); + expect(consoleWarnSpy).toHaveBeenNthCalledWith( + 1, + 'Handler for method: GET and path: /todos already exists. The previous handler will be replaced.' + ); + }); }); diff --git a/packages/event-handler/tests/unit/rest/utils.test.ts b/packages/event-handler/tests/unit/rest/utils.test.ts index 5082eb6608..50de2f4f03 100644 --- a/packages/event-handler/tests/unit/rest/utils.test.ts +++ b/packages/event-handler/tests/unit/rest/utils.test.ts @@ -9,7 +9,11 @@ import { isAPIGatewayProxyEvent, isAPIGatewayProxyResult, } from '../../../src/rest/index.js'; -import { compilePath, validatePathPattern } from '../../../src/rest/utils.js'; +import { + compilePath, + resolvePrefixedPath, + validatePathPattern, +} from '../../../src/rest/utils.js'; import type { Middleware, Path, @@ -567,4 +571,18 @@ describe('Path Utilities', () => { expect(result).toBeUndefined(); }); }); + + describe('resolvePrefixedPath', () => { + it.each([ + { path: '/test', prefix: '/prefix', expected: '/prefix/test' }, + { path: '/', prefix: '/prefix', expected: '/prefix' }, + { path: '/test', expected: '/test' }, + ])('resolves prefixed path', ({ path, prefix, expected }) => { + // Prepare & Act + const resolvedPath = resolvePrefixedPath(path as Path, prefix as Path); + + // Assert + expect(resolvedPath).toBe(expected); + }); + }); }); From 0ab1bd69b98358a4959a88411499da0add2e52e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 16:24:31 +0100 Subject: [PATCH 188/255] chore(deps): bump github/codeql-action from 3.30.3 to 3.30.4 (#4576) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Swopnil Dangol --- .github/workflows/ossf_scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ossf_scorecard.yml b/.github/workflows/ossf_scorecard.yml index 6b7f51f61a..a23689d416 100644 --- a/.github/workflows/ossf_scorecard.yml +++ b/.github/workflows/ossf_scorecard.yml @@ -43,6 +43,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@192325c86100d080feab897ff886c34abd4c83a3 # v3.29.5 + uses: github/codeql-action/upload-sarif@303c0aef88fc2fe5ff6d63d3b1596bfd83dfa1f9 # v3.29.5 with: sarif_file: results.sarif From 8c42446d6173c9dadda60bd1967d8c9c8eec4949 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Fri, 26 Sep 2025 15:08:12 +0200 Subject: [PATCH 189/255] ci: improve linting checks (#4545) Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Swopnil Dangol --- ...sable-run-linting-check-and-unit-tests.yml | 53 ++--- biome.json | 29 ++- docs/features/event-handler/appsync-events.md | 2 +- .../features/event-handler/appsync-graphql.md | 2 +- docs/features/event-handler/rest.md | 2 +- docs/features/tracer.md | 2 +- .../app/functions/process-items-stream.ts | 23 +- examples/app/package.json | 1 + .../batch/advancedTracingRecordHandler.ts | 2 +- examples/snippets/biome.json | 12 ++ .../errorHandlingWithBatchOfItems.ts | 6 +- .../appsync-graphql/advancedTestYourCode.ts | 2 +- .../appsync-graphql/exceptionHandling.ts | 2 +- .../exceptionHandlingResponse.json | 6 +- .../rest/samples/advanced_binary_req.json | 2 +- .../rest/samples/advanced_binary_res.json | 10 +- .../rest/samples/advanced_compress_req.json | 2 +- .../rest/samples/advanced_compress_res.json | 10 +- .../rest/samples/advanced_cors_per_route.json | 2 +- .../rest/samples/advanced_cors_simple.json | 2 +- .../rest/samples/advanced_error_debug.json | 2 +- .../rest/samples/advanced_error_prod.json | 2 +- .../advanced_fine_grained_responses.json | 2 +- .../samples/advanced_mw_early_return.json | 2 +- .../samples/advanced_mw_middleware_order.json | 2 +- .../gettingStarted_dynamic_routes.json | 2 +- .../rest/samples/gettingStarted_methods.json | 2 +- .../samples/gettingStarted_serialization.json | 2 +- .../getting-started/patterns-functional.ts | 2 +- examples/snippets/logger/basicUsage.ts | 2 +- .../snippets/logger/unserializableValues.ts | 6 +- examples/snippets/package.json | 3 +- .../parameters/customProviderVault.ts | 8 +- examples/snippets/tracer/basicUsage.ts | 8 +- .../snippets/tracer/captureMethodManual.ts | 27 +-- layers/package.json | 1 + package.json | 2 +- packages/batch/package.json | 3 +- packages/batch/src/BasePartialProcessor.ts | 4 +- packages/batch/src/BatchProcessorSync.ts | 2 +- packages/batch/tests/helpers/handlers.ts | 56 +++-- .../tests/unit/BasePartialProcessor.test.ts | 2 +- .../unit/SqsFifoPartialProcessor.test.ts | 2 +- .../tests/unit/processPartialResponse.test.ts | 12 +- packages/commons/package.json | 1 + packages/commons/src/Utility.ts | 6 +- packages/commons/src/envUtils.ts | 2 +- packages/commons/src/index.ts | 6 +- .../tests/types/LambdaInterface.test.ts | 3 +- .../commons/tests/unit/awsSdkUtils.test.ts | 4 +- packages/event-handler/package.json | 1 + .../src/appsync-events/Router.ts | 7 +- .../appsync-graphql/AppSyncGraphQLResolver.ts | 14 +- .../src/appsync-graphql/index.ts | 2 +- .../BedrockAgentFunctionResolver.ts | 2 +- packages/event-handler/src/rest/converters.ts | 26 ++- .../event-handler/src/rest/middleware/cors.ts | 1 + packages/event-handler/src/rest/utils.ts | 2 +- .../event-handler/src/types/bedrock-agent.ts | 7 +- packages/event-handler/src/types/rest.ts | 10 +- .../AppSyncEventsResolver.test.ts | 28 +-- .../AppSyncGraphQLResolver.test.ts | 111 +++++----- .../BedrockAgentFunctionResolver.test.ts | 24 +-- .../unit/rest/RouteHandlerRegistry.test.ts | 17 +- .../unit/rest/Router/basic-routing.test.ts | 16 +- .../tests/unit/rest/Router/decorators.test.ts | 72 +++---- .../unit/rest/Router/error-handling.test.ts | 8 +- .../tests/unit/rest/Router/middleware.test.ts | 34 +-- .../tests/unit/rest/converters.test.ts | 92 ++------ .../event-handler/tests/unit/rest/helpers.ts | 8 +- .../unit/rest/middleware/compress.test.ts | 14 +- .../tests/unit/rest/utils.test.ts | 12 +- packages/event-handler/typedoc.json | 1 + packages/idempotency/package.json | 1 + .../idempotency/src/IdempotencyHandler.ts | 16 +- .../idempotency/src/idempotencyDecorator.ts | 2 +- packages/idempotency/src/makeIdempotent.ts | 2 +- .../src/middleware/makeHandlerIdempotent.ts | 2 +- .../persistence/DynamoDBPersistenceLayer.ts | 12 +- .../src/types/IdempotencyOptions.ts | 2 - .../idempotentDecorator.test.FunctionCode.ts | 30 +-- ...makeHandlerIdempotent.test.FunctionCode.ts | 14 +- .../tests/e2e/makeHandlerIdempotent.test.ts | 14 +- .../e2e/makeIdempotent.test.FunctionCode.ts | 2 +- .../tests/unit/IdempotencyConfig.test.ts | 2 +- .../tests/unit/IdempotencyHandler.test.ts | 6 +- .../idempotency/tests/unit/deepSort.test.ts | 2 +- .../tests/unit/idempotencyDecorator.test.ts | 16 +- .../tests/unit/makeIdempotent.test.ts | 4 +- .../DynamoDbPersistenceLayer.test.ts | 6 +- packages/idempotency/vitest.config.ts | 4 +- packages/jmespath/package.json | 1 + packages/jmespath/src/Expression.ts | 5 +- packages/jmespath/src/Functions.ts | 72 +++---- packages/jmespath/src/Lexer.ts | 4 +- packages/jmespath/src/ParsedResult.ts | 4 +- packages/jmespath/src/Parser.ts | 65 ++++-- packages/jmespath/src/PowertoolsFunctions.ts | 9 +- packages/jmespath/src/TreeInterpreter.ts | 4 +- packages/jmespath/src/ast.ts | 68 +++--- packages/jmespath/src/constants.ts | 7 + packages/jmespath/src/envelopes.ts | 6 +- packages/jmespath/src/errors.ts | 13 +- packages/jmespath/src/search.ts | 6 +- packages/jmespath/src/types.ts | 4 +- packages/jmespath/src/utils.ts | 92 ++++---- packages/kafka/package.json | 1 + packages/kafka/tests/unit/consumer.test.ts | 6 + .../tests/unit/deserializer.avro.test.ts | 4 +- packages/logger/package.json | 1 + packages/logger/src/formatter/LogFormatter.ts | 2 +- packages/logger/src/middleware/middy.ts | 6 +- .../e2e/advancedUses.test.FunctionCode.ts | 6 +- .../basicFeatures.middy.test.FunctionCode.ts | 4 +- .../tests/e2e/basicFeatures.middy.test.ts | 20 +- .../childLogger.manual.test.FunctionCode.ts | 4 +- .../tests/e2e/childLogger.manual.test.ts | 8 +- .../e2e/logEventEnvVarSetting.middy.test.ts | 2 +- .../sampleRate.decorator.test.FunctionCode.ts | 2 + .../tests/e2e/sampleRate.decorator.test.ts | 4 +- packages/logger/tests/helpers/resources.ts | 2 +- .../tests/unit/injectLambdaContext.test.ts | 23 +- packages/logger/tests/unit/logBuffer.test.ts | 7 +- packages/logger/tests/unit/logEvent.test.ts | 2 + .../tests/unit/setPowertoolsLogData.test.ts | 44 ---- .../logger/tests/unit/workingWithkeys.test.ts | 4 +- packages/metrics/package.json | 1 + packages/metrics/src/Metrics.ts | 10 +- packages/metrics/src/middleware/middy.ts | 4 +- ...sicFeatures.decorator.test.functionCode.ts | 6 +- .../e2e/basicFeatures.decorators.test.ts | 2 +- .../basicFeatures.manual.test.functionCode.ts | 9 +- .../tests/e2e/basicFeatures.manual.test.ts | 2 +- .../metrics/tests/helpers/metricsUtils.ts | 2 +- .../metrics/tests/unit/logMetrics.test.ts | 21 +- packages/parameters/package.json | 1 + .../src/appconfig/AppConfigProvider.ts | 69 +++--- .../parameters/src/appconfig/getAppConfig.ts | 101 ++++----- .../src/dynamodb/DynamoDBProvider.ts | 89 ++++---- .../parameters/src/secrets/SecretsProvider.ts | 61 +++--- packages/parameters/src/secrets/getSecret.ts | 39 ++-- packages/parameters/src/ssm/SSMProvider.ts | 198 +++++++++--------- packages/parameters/src/ssm/getParameter.ts | 50 ++--- packages/parameters/src/ssm/getParameters.ts | 52 ++--- .../parameters/src/ssm/getParametersByName.ts | 50 ++--- packages/parameters/src/ssm/setParameter.ts | 27 +-- .../parameters/src/types/AppConfigProvider.ts | 77 ++++--- packages/parameters/src/types/BaseProvider.ts | 20 +- .../parameters/src/types/DynamoDBProvider.ts | 106 ++++++---- packages/parameters/src/types/SSMProvider.ts | 51 +++-- .../parameters/src/types/SecretsProvider.ts | 42 ++-- .../tests/e2e/appConfigProvider.class.test.ts | 14 +- .../tests/e2e/dynamoDBProvider.class.test.ts | 18 +- .../tests/e2e/secretsProvider.class.test.ts | 10 +- .../tests/e2e/ssmProvider.class.test.ts | 20 +- .../tests/unit/AppConfigProvider.test.ts | 10 +- .../tests/unit/DynamoDBProvider.test.ts | 6 +- .../parameters/tests/unit/SSMProvider.test.ts | 24 +-- .../tests/unit/SecretsProvider.test.ts | 6 +- .../tests/unit/setParameter.test.ts | 2 +- packages/parameters/typedoc.json | 19 +- packages/parser/package.json | 1 + packages/parser/src/envelopes/sns-sqs.ts | 6 +- packages/parser/src/parserDecorator.ts | 2 +- packages/parser/src/schemas/appsync-events.ts | 8 +- packages/parser/src/schemas/appsync.ts | 6 +- packages/parser/src/schemas/cognito.ts | 2 +- packages/parser/src/schemas/kafka.ts | 2 +- packages/parser/src/types/parser.ts | 2 +- packages/parser/tests/types/parser.test-d.ts | 2 +- .../tests/unit/parser.decorator.test.ts | 7 +- .../parser/tests/unit/parser.middy.test.ts | 6 +- packages/parser/tests/unit/parser.test.ts | 18 +- packages/testing/package.json | 1 + packages/testing/src/TestStack.ts | 3 + packages/testing/src/setupEnv.ts | 2 +- packages/testing/src/xray-traces-utils.ts | 2 +- packages/tracer/package.json | 1 + packages/tracer/src/Tracer.ts | 53 +++-- packages/tracer/src/middleware/middy.ts | 27 +-- .../tracer/src/provider/ProviderService.ts | 4 +- packages/tracer/src/types/Tracer.ts | 20 +- packages/tracer/tests/e2e/decorator.test.ts | 2 +- packages/tracer/tests/e2e/manual.test.ts | 2 +- packages/tracer/tests/helpers/mockRequests.ts | 5 +- .../tracer/tests/unit/ProviderService.test.ts | 20 +- packages/tracer/tests/unit/Tracer.test.ts | 25 ++- packages/tracer/tests/unit/middy.test.ts | 23 +- packages/tracer/vitest.config.ts | 4 +- packages/validation/package.json | 1 + packages/validation/src/middleware.ts | 4 +- .../validation/tests/unit/decorator.test.ts | 19 +- .../validation/tests/unit/middleware.test.ts | 2 +- 193 files changed, 1488 insertions(+), 1521 deletions(-) create mode 100644 examples/snippets/biome.json delete mode 100644 packages/logger/tests/unit/setPowertoolsLogData.test.ts diff --git a/.github/workflows/reusable-run-linting-check-and-unit-tests.yml b/.github/workflows/reusable-run-linting-check-and-unit-tests.yml index be605cb13b..61d0361b31 100644 --- a/.github/workflows/reusable-run-linting-check-and-unit-tests.yml +++ b/.github/workflows/reusable-run-linting-check-and-unit-tests.yml @@ -85,17 +85,20 @@ jobs: run: working-directory: examples/${{ matrix.example }} steps: - - name: Checkout code + - &checkout_code + name: Checkout code uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - - name: Setup NodeJS - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + - &setup_node + name: Setup Node.js + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version: 22 cache: "npm" - - name: Setup dependencies + - &setup_dependencies + name: Setup dependencies uses: aws-powertools/actions/.github/actions/cached-node-modules@29979bc5339bf54f76a11ac36ff67701986bb0f0 - name: Run linting - run: npm run lint + run: npm run lint:ci - name: Run tests run: npm t check-layer-publisher: @@ -103,17 +106,11 @@ jobs: env: NODE_ENV: dev steps: - - name: Checkout code - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - - name: Setup NodeJS - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 - with: - node-version: 22 - cache: "npm" - - name: Setup dependencies - uses: aws-powertools/actions/.github/actions/cached-node-modules@29979bc5339bf54f76a11ac36ff67701986bb0f0 + - *checkout_code + - *setup_node + - *setup_dependencies - name: Run linting - run: npm run lint -w layers + run: npm run lint:ci -w layers - name: Run tests run: npm run test:unit -w layers check-docs-snippets: @@ -121,30 +118,18 @@ jobs: env: NODE_ENV: dev steps: - - name: Checkout code - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - - name: Setup NodeJS - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 - with: - node-version: 22 - cache: "npm" - - name: Setup dependencies - uses: aws-powertools/actions/.github/actions/cached-node-modules@29979bc5339bf54f76a11ac36ff67701986bb0f0 + - *checkout_code + - *setup_node + - *setup_dependencies - name: Run linting - run: npm run lint -w examples/snippets + run: npm run lint:ci -w examples/snippets check-docs: runs-on: ubuntu-latest env: NODE_ENV: dev steps: - - name: Checkout code - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - - name: Setup NodeJS - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 - with: - node-version: 22 - cache: "npm" - - name: Setup dependencies - uses: aws-powertools/actions/.github/actions/cached-node-modules@29979bc5339bf54f76a11ac36ff67701986bb0f0 + - *checkout_code + - *setup_node + - *setup_dependencies - name: Run linting run: npm run lint:markdown diff --git a/biome.json b/biome.json index c675fdbf3b..2096e28b73 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,6 @@ { - "$schema": "https://biomejs.dev/schemas/2.0.6/schema.json", + "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", + "root": true, "assist": { "actions": { "source": { @@ -22,6 +23,32 @@ "useNumberNamespace": "error", "noInferrableTypes": "error", "noUselessElse": "error" + }, + "suspicious": { + "noTsIgnore": "error", + "noConfusingVoidType": "error", + "noDoubleEquals": "error", + "noGlobalIsNan": "error", + "noGlobalIsFinite": "error", + "useNumberToFixedDigitsArgument": "error", + "noPrototypeBuiltins": "error", + "noSkippedTests": "error", + "noFocusedTests": "error", + "noUnassignedVariables": "error", + "noVar": "error", + "useAdjacentOverloadSignatures": "error", + "useAwait": "error", + "useErrorMessage": "error", + "useIsArray": "error", + "useStaticResponseMethods": "error" + }, + "correctness": { + "useParseIntRadix": "error", + "useSingleJsDocAsterisk": "error", + "noUnusedVariables": "error", + "noUnusedPrivateClassMembers": "error", + "noUnusedImports": "error", + "noUnusedFunctionParameters": "error" } } }, diff --git a/docs/features/event-handler/appsync-events.md b/docs/features/event-handler/appsync-events.md index 58defee58e..a6398bbdd3 100644 --- a/docs/features/event-handler/appsync-events.md +++ b/docs/features/event-handler/appsync-events.md @@ -210,7 +210,7 @@ When processing batch of items with `aggregate` enabled, you must format the pay === "Error handling with batch of items" - ```typescript hl_lines="21-24" + ```typescript hl_lines="25-28" --8<-- "examples/snippets/event-handler/appsync-events/errorHandlingWithBatchOfItems.ts" ``` diff --git a/docs/features/event-handler/appsync-graphql.md b/docs/features/event-handler/appsync-graphql.md index 3cae9ed869..9112da2c01 100644 --- a/docs/features/event-handler/appsync-graphql.md +++ b/docs/features/event-handler/appsync-graphql.md @@ -176,7 +176,7 @@ You can use an AppSync JavaScript resolver or a VTL response mapping template to === "Exception Handling response" - ```json hl_lines="11 20" + ```json hl_lines="9 18" --8<-- "examples/snippets/event-handler/appsync-graphql/exceptionHandlingResponse.json" ``` diff --git a/docs/features/event-handler/rest.md b/docs/features/event-handler/rest.md index 136565eb2f..9fdfe3a46e 100644 --- a/docs/features/event-handler/rest.md +++ b/docs/features/event-handler/rest.md @@ -479,7 +479,7 @@ You can enable response compression by using the `compress` middleware. This wil === "Response" - ```json hl_lines="7-9 11 12" + ```json hl_lines="4-5 7-8" --8<-- "examples/snippets/event-handler/rest/samples/advanced_compress_res.json" ``` diff --git a/docs/features/tracer.md b/docs/features/tracer.md index 94c1081dd2..6cd6877e72 100644 --- a/docs/features/tracer.md +++ b/docs/features/tracer.md @@ -230,7 +230,7 @@ You can trace other class methods using the `captureMethod` decorator or any arb === "Manual" - ```typescript hl_lines="7-13 19 22 26-31" + ```typescript hl_lines="7-10 16 21 25 27" --8<-- "examples/snippets/tracer/captureMethodManual.ts" ``` diff --git a/examples/app/functions/process-items-stream.ts b/examples/app/functions/process-items-stream.ts index a8610f75ab..8a9da39348 100644 --- a/examples/app/functions/process-items-stream.ts +++ b/examples/app/functions/process-items-stream.ts @@ -83,16 +83,19 @@ export const handler = async ( event: DynamoDBStreamEvent, context: Context ): Promise => { - return tracer.provider.captureAsyncFunc('### handler', async (segment) => { - const result = await processPartialResponse( - event, - recordHandler, - processor, - { context } - ); + return (await tracer.provider.captureAsyncFunc( + '### handler', + async (segment) => { + const result = await processPartialResponse( + event, + recordHandler, + processor, + { context } + ); - segment?.close(); + segment?.close(); - return result; - }) as DynamoDBBatchResponse; + return result; + } + )) as DynamoDBBatchResponse; }; diff --git a/examples/app/package.json b/examples/app/package.json index 5912aa7d08..338dbebd36 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -13,6 +13,7 @@ "test": "npm run test:unit", "lint": "biome lint .", "lint:fix": "biome check --write .", + "lint:ci": "biome ci .", "test:unit": "export POWERTOOLS_DEV=true && vitest --run --silent", "test:e2e": "echo 'To be implemented ...'", "cdk": "cdk" diff --git a/examples/snippets/batch/advancedTracingRecordHandler.ts b/examples/snippets/batch/advancedTracingRecordHandler.ts index d92bb0d89a..fe330b30a5 100644 --- a/examples/snippets/batch/advancedTracingRecordHandler.ts +++ b/examples/snippets/batch/advancedTracingRecordHandler.ts @@ -22,7 +22,7 @@ const recordHandler = async (record: SQSRecord): Promise => { // do something with the item subsegment?.addMetadata('item', item); } catch (error) { - subsegment?.addError(error); + subsegment?.addError(error as Error); throw error; } } diff --git a/examples/snippets/biome.json b/examples/snippets/biome.json new file mode 100644 index 0000000000..6d29e1de97 --- /dev/null +++ b/examples/snippets/biome.json @@ -0,0 +1,12 @@ +{ + "$schema": "../../node_modules/@biomejs/biome/configuration_schema.json", + "extends": "//", + "root": false, + "linter": { + "rules": { + "suspicious": { + "useAwait": "off" + } + } + } +} diff --git a/examples/snippets/event-handler/appsync-events/errorHandlingWithBatchOfItems.ts b/examples/snippets/event-handler/appsync-events/errorHandlingWithBatchOfItems.ts index 9bf3b7024e..b4782946fe 100644 --- a/examples/snippets/event-handler/appsync-events/errorHandlingWithBatchOfItems.ts +++ b/examples/snippets/event-handler/appsync-events/errorHandlingWithBatchOfItems.ts @@ -18,9 +18,13 @@ app.onPublish( payload: { processed: true, original_payload: payload }, }); } catch (error) { + const errorString = + error instanceof Error + ? `${error.name} - ${error.message}` + : 'Unknown error'; returnValues.push({ id: payload.id, - error: `${error.name} - ${error.message}`, + error: errorString, }); } } diff --git a/examples/snippets/event-handler/appsync-graphql/advancedTestYourCode.ts b/examples/snippets/event-handler/appsync-graphql/advancedTestYourCode.ts index adf69ab2ee..06b8ac6f39 100644 --- a/examples/snippets/event-handler/appsync-graphql/advancedTestYourCode.ts +++ b/examples/snippets/event-handler/appsync-graphql/advancedTestYourCode.ts @@ -38,7 +38,7 @@ describe('Unit test for AppSync GraphQL Resolver', () => { const event = onGraphqlEventFactory('listLocations', 'Query'); // Act - const result = (await handler(event, {} as Context)) as Promise; + const result = (await handler(event, {} as Context)) as unknown[]; // Assess expect(result).toHaveLength(2); diff --git a/examples/snippets/event-handler/appsync-graphql/exceptionHandling.ts b/examples/snippets/event-handler/appsync-graphql/exceptionHandling.ts index fc354527e5..0979bf4863 100644 --- a/examples/snippets/event-handler/appsync-graphql/exceptionHandling.ts +++ b/examples/snippets/event-handler/appsync-graphql/exceptionHandling.ts @@ -1,6 +1,6 @@ +import { AssertionError } from 'node:assert'; import { AppSyncGraphQLResolver } from '@aws-lambda-powertools/event-handler/appsync-graphql'; import { Logger } from '@aws-lambda-powertools/logger'; -import { AssertionError } from 'node:assert'; import type { Context } from 'aws-lambda'; const logger = new Logger({ diff --git a/examples/snippets/event-handler/appsync-graphql/exceptionHandlingResponse.json b/examples/snippets/event-handler/appsync-graphql/exceptionHandlingResponse.json index 77c248e2f3..3ca50422a0 100644 --- a/examples/snippets/event-handler/appsync-graphql/exceptionHandlingResponse.json +++ b/examples/snippets/event-handler/appsync-graphql/exceptionHandlingResponse.json @@ -4,9 +4,7 @@ }, "errors": [ { - "path": [ - "createSomething" - ], + "path": ["createSomething"], "data": null, "errorType": "AssertionError", "errorInfo": null, @@ -20,4 +18,4 @@ "message": "This is an assertion Error" } ] -} \ No newline at end of file +} diff --git a/examples/snippets/event-handler/rest/samples/advanced_binary_req.json b/examples/snippets/event-handler/rest/samples/advanced_binary_req.json index 021832523b..83255cdf20 100644 --- a/examples/snippets/event-handler/rest/samples/advanced_binary_req.json +++ b/examples/snippets/event-handler/rest/samples/advanced_binary_req.json @@ -6,4 +6,4 @@ "resource": "/logo", "path": "/logo", "httpMethod": "GET" -} \ No newline at end of file +} diff --git a/examples/snippets/event-handler/rest/samples/advanced_binary_res.json b/examples/snippets/event-handler/rest/samples/advanced_binary_res.json index 371248a1a8..ebd77ef84f 100644 --- a/examples/snippets/event-handler/rest/samples/advanced_binary_res.json +++ b/examples/snippets/event-handler/rest/samples/advanced_binary_res.json @@ -1,13 +1,9 @@ { "body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjU2cHgiIGhlaWdodD0iMjU2cHgiIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIj4KICAgIDx0aXRsZT5BV1MgTGFtYmRhPC90aXRsZT4KICAgIDxkZWZzPgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMCUiIHkxPSIxMDAlIiB4Mj0iMTAwJSIgeTI9IjAlIiBpZD0ibGluZWFyR3JhZGllbnQtMSI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNDODUxMUIiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGOTkwMCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDwvZGVmcz4KICAgIDxnPgogICAgICAgIDxyZWN0IGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQtMSkiIHg9IjAiIHk9IjAiIHdpZHRoPSIyNTYiIGhlaWdodD0iMjU2Ij48L3JlY3Q+CiAgICAgICAgPHBhdGggZD0iTTg5LjYyNDExMjYsMjExLjIgTDQ5Ljg5MDMyNzcsMjExLjIgTDkzLjgzNTQ4MzIsMTE5LjM0NzIgTDExMy43NDcyOCwxNjAuMzM5MiBMODkuNjI0MTEyNiwyMTEuMiBaIE05Ni43MDI5MzU3LDExMC41Njk2IEM5Ni4xNjQwODU4LDEwOS40NjU2IDk1LjA0MTQ4MTMsMTA4Ljc2NDggOTMuODE2MjM4NCwxMDguNzY0OCBMOTMuODA2NjE2MywxMDguNzY0OCBDOTIuNTcxNzUxNCwxMDguNzY4IDkxLjQ0OTE0NjYsMTA5LjQ3NTIgOTAuOTE5OTE4NywxMTAuNTg1NiBMNDEuOTEzNDIwOCwyMTMuMDIwOCBDNDEuNDM4NzE5NywyMTQuMDEyOCA0MS41MDYwNzU4LDIxNS4xNzc2IDQyLjA5NjI0NTEsMjE2LjEwODggQzQyLjY3OTk5OTQsMjE3LjAzNjggNDMuNzA2MzgwNSwyMTcuNiA0NC44MDY1MzMxLDIxNy42IEw5MS42NTQ0MjMsMjE3LjYgQzkyLjg5NTcwMjcsMjE3LjYgOTQuMDIxNTE0OSwyMTYuODg2NCA5NC41NTM5NTAxLDIxNS43Njk2IEwxMjAuMjAzODU5LDE2MS42ODk2IEMxMjAuNjE3NjE5LDE2MC44MTI4IDEyMC42MTQ0MTIsMTU5Ljc5ODQgMTIwLjE4NzgyMiwxNTguOTI4IEw5Ni43MDI5MzU3LDExMC41Njk2IFogTTIwNy45ODUxMTcsMjExLjIgTDE2OC41MDc5MjgsMjExLjIgTDEwNS4xNzM3ODksNzguNjI0IEMxMDQuNjQ0NTYxLDc3LjUxMDQgMTAzLjUxNTU0MSw3Ni44IDEwMi4yNzc0NjksNzYuOCBMNzYuNDQ3OTQzLDc2LjggTDc2LjQ3NjgwOTksNDQuOCBMMTI3LjEwMzA2Niw0NC44IEwxOTAuMTQ1MzI4LDE3Ny4zNzI4IEMxOTAuNjc0NTU2LDE3OC40ODY0IDE5MS44MDM1NzUsMTc5LjIgMTkzLjA0MTY0NywxNzkuMiBMMjA3Ljk4NTExNywxNzkuMiBMMjA3Ljk4NTExNywyMTEuMiBaIE0yMTEuMTkyNTU4LDE3Mi44IEwxOTUuMDcxOTU4LDE3Mi44IEwxMzIuMDI5Njk2LDQwLjIyNzIgQzEzMS41MDA0NjgsMzkuMTEzNiAxMzAuMzcxNDQ5LDM4LjQgMTI5LjEzMDE2OSwzOC40IEw3My4yNzI1NzYsMzguNCBDNzEuNTA1Mjc1OCwzOC40IDcwLjA2ODM0MjEsMzkuODMwNCA3MC4wNjUxMzQ0LDQxLjU5NjggTDcwLjAyOTg1MjgsNzkuOTk2OCBDNzAuMDI5ODUyOCw4MC44NDggNzAuMzYzNDI2Niw4MS42NjA4IDcwLjk2OTYzMyw4Mi4yNjI0IEM3MS41Njk0MjQ2LDgyLjg2NCA3Mi4zODQxMTQ2LDgzLjIgNzMuMjM3Mjk0MSw4My4yIEwxMDAuMjUzNTczLDgzLjIgTDE2My41OTA5MiwyMTUuNzc2IEMxNjQuMTIzMzU1LDIxNi44ODk2IDE2NS4yNDU5NiwyMTcuNiAxNjYuNDg0MDMyLDIxNy42IEwyMTEuMTkyNTU4LDIxNy42IEMyMTIuOTY2Mjc0LDIxNy42IDIxNC40LDIxNi4xNjY0IDIxNC40LDIxNC40IEwyMTQuNCwxNzYgQzIxNC40LDE3NC4yMzM2IDIxMi45NjYyNzQsMTcyLjggMjExLjE5MjU1OCwxNzIuOCBMMjExLjE5MjU1OCwxNzIuOCBaIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg==", "multiValueHeaders": { - "Content-Type": [ - "image/png" - ], - "Content-Encoding": [ - "gzip" - ] + "Content-Type": ["image/png"], + "Content-Encoding": ["gzip"] }, "isBase64Encoded": true, "statusCode": 200 -} \ No newline at end of file +} diff --git a/examples/snippets/event-handler/rest/samples/advanced_compress_req.json b/examples/snippets/event-handler/rest/samples/advanced_compress_req.json index ed7979c17f..ae92174d01 100644 --- a/examples/snippets/event-handler/rest/samples/advanced_compress_req.json +++ b/examples/snippets/event-handler/rest/samples/advanced_compress_req.json @@ -5,4 +5,4 @@ "resource": "/todos/1", "path": "/todos/1", "httpMethod": "GET" -} \ No newline at end of file +} diff --git a/examples/snippets/event-handler/rest/samples/advanced_compress_res.json b/examples/snippets/event-handler/rest/samples/advanced_compress_res.json index c05f566de1..e25f5f6316 100644 --- a/examples/snippets/event-handler/rest/samples/advanced_compress_res.json +++ b/examples/snippets/event-handler/rest/samples/advanced_compress_res.json @@ -1,13 +1,9 @@ { "statusCode": 200, "multiValueHeaders": { - "Content-Type": [ - "application/json" - ], - "Content-Encoding": [ - "gzip" - ] + "Content-Type": ["application/json"], + "Content-Encoding": ["gzip"] }, "body": "H4sIAAAAAAACE42STU4DMQyFrxJl3QXln96AMyAW7sSDLCVxiJ0Kqerd8TCCUOgii1EmP/783pOPXjmw+N3L0TfB+hz8brvxtC5KGtHvfMCIkzZx0HT5MPmNnziViIr2dIYoeNr8Q1x3xHsjcVadIbkZJoq2RXU8zzQROLseQ9505NzeCNQdMJNBE+UmY4zbzjAJhWtlZ57sB84BWtul+rteH2HPlVgWARwjqXkxpklK5gmEHAQqJBMtFsGVygcKmNVRjG0wxvuzGF2L0dpVUOKMC3bfJNjJgWMrCuZk7cUp02AiD72D6WKHHwUDKbiJs6AZ0VZXKOUx4uNvzdxT+E4mLcMA+6G8nzrLQkaxkNEVrFKW2VGbJCoCY7q2V3+tiv5kGThyxfTecDWbgGz/NfYXhL6ePgF9PnFdPgMAAA==", "isBase64Encoded": true -} \ No newline at end of file +} diff --git a/examples/snippets/event-handler/rest/samples/advanced_cors_per_route.json b/examples/snippets/event-handler/rest/samples/advanced_cors_per_route.json index 12570fedfe..59a0cf594f 100644 --- a/examples/snippets/event-handler/rest/samples/advanced_cors_per_route.json +++ b/examples/snippets/event-handler/rest/samples/advanced_cors_per_route.json @@ -6,4 +6,4 @@ }, "body": "{\"status\":\"ok\"}", "isBase64Encoded": false -} \ No newline at end of file +} diff --git a/examples/snippets/event-handler/rest/samples/advanced_cors_simple.json b/examples/snippets/event-handler/rest/samples/advanced_cors_simple.json index 6980c59567..47b5f9e0a8 100644 --- a/examples/snippets/event-handler/rest/samples/advanced_cors_simple.json +++ b/examples/snippets/event-handler/rest/samples/advanced_cors_simple.json @@ -24,4 +24,4 @@ }, "body": "{\"todoId\":\"123\",\"task\":\"Example task\",\"completed\":false}", "isBase64Encoded": false -} \ No newline at end of file +} diff --git a/examples/snippets/event-handler/rest/samples/advanced_error_debug.json b/examples/snippets/event-handler/rest/samples/advanced_error_debug.json index a7b6ccaf54..f588ec46d4 100644 --- a/examples/snippets/event-handler/rest/samples/advanced_error_debug.json +++ b/examples/snippets/event-handler/rest/samples/advanced_error_debug.json @@ -6,4 +6,4 @@ "details": { "errorName": "Name of the error class" } -} \ No newline at end of file +} diff --git a/examples/snippets/event-handler/rest/samples/advanced_error_prod.json b/examples/snippets/event-handler/rest/samples/advanced_error_prod.json index 7a3a12425d..cfe5a784fa 100644 --- a/examples/snippets/event-handler/rest/samples/advanced_error_prod.json +++ b/examples/snippets/event-handler/rest/samples/advanced_error_prod.json @@ -2,4 +2,4 @@ "statusCode": 500, "error": "Internal Server Error", "message": "Internal Server Error" -} \ No newline at end of file +} diff --git a/examples/snippets/event-handler/rest/samples/advanced_fine_grained_responses.json b/examples/snippets/event-handler/rest/samples/advanced_fine_grained_responses.json index 3b4f079a6a..35769b0995 100644 --- a/examples/snippets/event-handler/rest/samples/advanced_fine_grained_responses.json +++ b/examples/snippets/event-handler/rest/samples/advanced_fine_grained_responses.json @@ -6,4 +6,4 @@ "Location": "/todos/123" }, "isBase64Encoded": false -} \ No newline at end of file +} diff --git a/examples/snippets/event-handler/rest/samples/advanced_mw_early_return.json b/examples/snippets/event-handler/rest/samples/advanced_mw_early_return.json index 75f76e9c68..7424d79a2d 100644 --- a/examples/snippets/event-handler/rest/samples/advanced_mw_early_return.json +++ b/examples/snippets/event-handler/rest/samples/advanced_mw_early_return.json @@ -5,4 +5,4 @@ "Content-Type": "application/json" }, "isBase64Encoded": false -} \ No newline at end of file +} diff --git a/examples/snippets/event-handler/rest/samples/advanced_mw_middleware_order.json b/examples/snippets/event-handler/rest/samples/advanced_mw_middleware_order.json index 0135c632cd..6651449b14 100644 --- a/examples/snippets/event-handler/rest/samples/advanced_mw_middleware_order.json +++ b/examples/snippets/event-handler/rest/samples/advanced_mw_middleware_order.json @@ -7,4 +7,4 @@ "x-post-processed-by": "global-middleware" }, "isBase64Encoded": false -} \ No newline at end of file +} diff --git a/examples/snippets/event-handler/rest/samples/gettingStarted_dynamic_routes.json b/examples/snippets/event-handler/rest/samples/gettingStarted_dynamic_routes.json index dd5727cc1e..f9da1c31a4 100644 --- a/examples/snippets/event-handler/rest/samples/gettingStarted_dynamic_routes.json +++ b/examples/snippets/event-handler/rest/samples/gettingStarted_dynamic_routes.json @@ -2,4 +2,4 @@ "resource": "/todos/{id}", "path": "/todos/1", "httpMethod": "GET" -} \ No newline at end of file +} diff --git a/examples/snippets/event-handler/rest/samples/gettingStarted_methods.json b/examples/snippets/event-handler/rest/samples/gettingStarted_methods.json index 7be85e3400..9da1671479 100644 --- a/examples/snippets/event-handler/rest/samples/gettingStarted_methods.json +++ b/examples/snippets/event-handler/rest/samples/gettingStarted_methods.json @@ -3,4 +3,4 @@ "path": "/todos", "httpMethod": "POST", "body": "{\"title\": \"foo\", \"userId\": 1, \"completed\": false}" -} \ No newline at end of file +} diff --git a/examples/snippets/event-handler/rest/samples/gettingStarted_serialization.json b/examples/snippets/event-handler/rest/samples/gettingStarted_serialization.json index 12f3f9bdf1..5f70d19b32 100644 --- a/examples/snippets/event-handler/rest/samples/gettingStarted_serialization.json +++ b/examples/snippets/event-handler/rest/samples/gettingStarted_serialization.json @@ -5,4 +5,4 @@ }, "body": "{'message':'pong'}", "isBase64Encoded": false -} \ No newline at end of file +} diff --git a/examples/snippets/getting-started/patterns-functional.ts b/examples/snippets/getting-started/patterns-functional.ts index ad3a752ae5..80ec55db5d 100644 --- a/examples/snippets/getting-started/patterns-functional.ts +++ b/examples/snippets/getting-started/patterns-functional.ts @@ -18,7 +18,7 @@ export const handler = async (event: unknown, context: Context) => { throw new Error('An error occurred'); } catch (error) { logger.error('Error occurred', { error }); - tracer.addErrorAsMetadata(error); + tracer.addErrorAsMetadata(error as Error); throw error; } finally { subsegment?.close(); diff --git a/examples/snippets/logger/basicUsage.ts b/examples/snippets/logger/basicUsage.ts index 0d96caaf00..ad36be0c87 100644 --- a/examples/snippets/logger/basicUsage.ts +++ b/examples/snippets/logger/basicUsage.ts @@ -2,6 +2,6 @@ import { Logger } from '@aws-lambda-powertools/logger'; const logger = new Logger({ serviceName: 'serverlessAirline' }); -export const handler = async (_event, _context): Promise => { +export const handler = async () => { logger.info('Hello World'); }; diff --git a/examples/snippets/logger/unserializableValues.ts b/examples/snippets/logger/unserializableValues.ts index 0a5ff0e2c7..30851b947c 100644 --- a/examples/snippets/logger/unserializableValues.ts +++ b/examples/snippets/logger/unserializableValues.ts @@ -1,12 +1,12 @@ import { Logger } from '@aws-lambda-powertools/logger'; -import type { CustomReplacerFn } from '@aws-lambda-powertools/logger/types'; +import type { CustomJsonReplacerFn } from '@aws-lambda-powertools/logger/types'; -const jsonReplacerFn: CustomReplacerFn = (_: string, value: unknown) => +const jsonReplacerFn: CustomJsonReplacerFn = (_: string, value: unknown) => value instanceof Set ? [...value] : value; const logger = new Logger({ serviceName: 'serverlessAirline', jsonReplacerFn }); -export const handler = async (): Promise => { +export const handler = async () => { logger.info('Serialize with custom serializer', { serializedValue: new Set([1, 2, 3]), }); diff --git a/examples/snippets/package.json b/examples/snippets/package.json index 333273bd6c..0af61ca5b1 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -12,7 +12,8 @@ "test:e2e": "echo 'Not Applicable'", "build": "echo 'Not Applicable'", "lint": "biome lint .", - "lint:fix": "biome check --write ." + "lint:fix": "biome check --write .", + "lint:ci": "biome ci ." }, "license": "MIT-0", "repository": { diff --git a/examples/snippets/parameters/customProviderVault.ts b/examples/snippets/parameters/customProviderVault.ts index 0bbae8252b..5c2e02a6d9 100644 --- a/examples/snippets/parameters/customProviderVault.ts +++ b/examples/snippets/parameters/customProviderVault.ts @@ -31,13 +31,11 @@ class HashiCorpVaultProvider extends BaseProvider { /** * Retrieve a secret from HashiCorp Vault. * - * You can customize the retrieval of the secret by passing options to the function: - * * `maxAge` - The maximum age of the value in cache before fetching a new one (in seconds) (default: 5) - * * `forceFetch` - Whether to always fetch a new value from the store regardless if already available in cache - * * `sdkOptions` - Extra options to pass to the HashiCorp Vault SDK, e.g. `mount` or `version` - * * @param name - The name of the secret * @param options - Options to customize the retrieval of the secret + * @param options.maxAge - The maximum age of the value in cache before fetching a new one (in seconds) (default: 5) + * @param options.forceFetch - Whether to always fetch a new value from the store regardless if already available in cache + * @param options.sdkOptions - Extra options to pass to the HashiCorp Vault SDK, e.g. `mount` or `version` */ public async get>( name: string, diff --git a/examples/snippets/tracer/basicUsage.ts b/examples/snippets/tracer/basicUsage.ts index 8f00dc4c7c..5495101763 100644 --- a/examples/snippets/tracer/basicUsage.ts +++ b/examples/snippets/tracer/basicUsage.ts @@ -2,6 +2,10 @@ import { Tracer } from '@aws-lambda-powertools/tracer'; const tracer = new Tracer({ serviceName: 'serverlessAirline' }); -export const handler = async (_event, _context): Promise => { - tracer.getSegment(); +export const handler = async () => { + const segment = tracer.getSegment(); + const subsegment = segment?.addNewSubsegment('subsegment'); + subsegment?.addAnnotation('annotationKey', 'annotationValue'); + subsegment?.addMetadata('metadataKey', { foo: 'bar' }); + subsegment?.close(); }; diff --git a/examples/snippets/tracer/captureMethodManual.ts b/examples/snippets/tracer/captureMethodManual.ts index d440745cef..76f4a8a7bf 100644 --- a/examples/snippets/tracer/captureMethodManual.ts +++ b/examples/snippets/tracer/captureMethodManual.ts @@ -6,31 +6,26 @@ const tracer = new Tracer({ serviceName: 'serverlessAirline' }); const getChargeId = async (): Promise => { const parentSubsegment = tracer.getSegment(); // This is the subsegment currently active let subsegment: Subsegment | undefined; - if (parentSubsegment) { - // Create subsegment for the function & set it as active - subsegment = parentSubsegment.addNewSubsegment('### chargeId'); - tracer.setSegment(subsegment); - } + subsegment = parentSubsegment?.addNewSubsegment('### chargeId'); + subsegment && tracer.setSegment(subsegment); - let res: unknown; try { - /* ... */ + const res = { chargeId: '1234' }; + // Add the response as metadata tracer.addResponseAsMetadata(res, 'chargeId'); + + return res; } catch (err) { // Add the error as metadata tracer.addErrorAsMetadata(err as Error); throw err; + } finally { + // Close subsegment + subsegment?.close(); + // Set the facade segment as active again, it'll be closed automatically + parentSubsegment && tracer.setSegment(parentSubsegment); } - - if (parentSubsegment && subsegment) { - // Close subsegment (the AWS Lambda one is closed automatically) - subsegment.close(); - // Set the facade segment as active again - tracer.setSegment(parentSubsegment); - } - - return res; }; export const handler = async ( diff --git a/layers/package.json b/layers/package.json index 225068157d..d8bdebfae9 100644 --- a/layers/package.json +++ b/layers/package.json @@ -20,6 +20,7 @@ "package": "echo 'Not applicable'", "lint": "biome lint .", "lint:fix": "biome check --write .", + "lint:ci": "biome ci .", "createLayerFolder": "cdk synth --context BuildFromLocal=true" }, "repository": { diff --git a/package.json b/package.json index 732b0b4f5b..788d8d8c03 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "vitest": "^3.0.9" }, "lint-staged": { - "*.{js,ts}": "biome check --write", + "*.{js,ts,json}": "biome check --write --no-errors-on-unmatched", "*.md": "markdownlint-cli2 --fix" }, "engines": { diff --git a/packages/batch/package.json b/packages/batch/package.json index e1da30bfee..ae2ba0818c 100644 --- a/packages/batch/package.json +++ b/packages/batch/package.json @@ -22,6 +22,7 @@ "build": "npm run build:esm & npm run build:cjs", "lint": "biome lint .", "lint:fix": "biome check --write .", + "lint:ci": "biome ci .", "prepack": "node ../../.github/scripts/release_patch_package_json.js ." }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/batch#readme", @@ -89,4 +90,4 @@ "@aws-lambda-powertools/testing-utils": "file:../testing", "zod": "^4.1.11" } -} \ No newline at end of file +} diff --git a/packages/batch/src/BasePartialProcessor.ts b/packages/batch/src/BasePartialProcessor.ts index 23b7cdc9cc..da09f22557 100644 --- a/packages/batch/src/BasePartialProcessor.ts +++ b/packages/batch/src/BasePartialProcessor.ts @@ -239,9 +239,7 @@ abstract class BasePartialProcessor { /** * Processes records in parallel using `Promise.all`. */ - async #processRecordsInParallel(): Promise< - (SuccessResponse | FailureResponse)[] - > { + #processRecordsInParallel(): Promise<(SuccessResponse | FailureResponse)[]> { return Promise.all( this.records.map((record) => this.processRecord(record)) ); diff --git a/packages/batch/src/BatchProcessorSync.ts b/packages/batch/src/BatchProcessorSync.ts index a3613a3d51..45f47a6e21 100644 --- a/packages/batch/src/BatchProcessorSync.ts +++ b/packages/batch/src/BatchProcessorSync.ts @@ -88,7 +88,7 @@ import type { BaseRecord, FailureResponse, SuccessResponse } from './types.js'; * * @param _record The record to be processed */ - public async processRecord( + public processRecord( _record: BaseRecord ): Promise { throw new BatchProcessingError('Not implemented. Use process() instead.'); diff --git a/packages/batch/tests/helpers/handlers.ts b/packages/batch/tests/helpers/handlers.ts index 24dff02799..5f0b63eb88 100644 --- a/packages/batch/tests/helpers/handlers.ts +++ b/packages/batch/tests/helpers/handlers.ts @@ -1,4 +1,6 @@ +import { setTimeout } from 'node:timers/promises'; import type { + AttributeValue, Context, DynamoDBRecord, KinesisStreamRecord, @@ -8,19 +10,25 @@ import type { const sqsRecordHandler = (record: SQSRecord): string => { const body = record.body; if (body.includes('fail')) { - throw Error('Failed to process record.'); + throw new Error('Failed to process record.'); } return body; }; -const asyncSqsRecordHandler = async (record: SQSRecord): Promise => - Promise.resolve(sqsRecordHandler(record)); +const asyncSqsRecordHandler = async (record: SQSRecord): Promise => { + const body = record.body; + if (body.includes('fail')) { + throw new Error('Failed to process record.'); + } + await setTimeout(1); // simulate some processing time + return body; +}; const kinesisRecordHandler = (record: KinesisStreamRecord): string => { const body = record.kinesis.data; if (body.includes('fail')) { - throw Error('Failed to process record.'); + throw new Error('Failed to process record.'); } return body; @@ -28,12 +36,19 @@ const kinesisRecordHandler = (record: KinesisStreamRecord): string => { const asyncKinesisRecordHandler = async ( record: KinesisStreamRecord -): Promise => Promise.resolve(kinesisRecordHandler(record)); +): Promise => { + const body = record.kinesis.data; + if (body.includes('fail')) { + throw new Error('Failed to process record.'); + } + await setTimeout(1); // simulate some processing time + return body; +}; -const dynamodbRecordHandler = (record: DynamoDBRecord): object => { +const dynamodbRecordHandler = (record: DynamoDBRecord): AttributeValue => { const body = record.dynamodb?.NewImage?.Message || { S: 'fail' }; if (body.S?.includes('fail')) { - throw Error('Failed to process record.'); + throw new Error('Failed to process record.'); } return body; @@ -41,17 +56,24 @@ const dynamodbRecordHandler = (record: DynamoDBRecord): object => { const asyncDynamodbRecordHandler = async ( record: DynamoDBRecord -): Promise => { - return Promise.resolve(dynamodbRecordHandler(record)); +): Promise => { + const body = record.dynamodb?.NewImage?.Message || { S: 'fail' }; + if (body.S?.includes('fail')) { + throw new Error('Failed to process record.'); + } + await setTimeout(1); // simulate some processing time + return body; }; const handlerWithContext = (record: SQSRecord, context: Context): string => { try { if (context.getRemainingTimeInMillis() === 0) { - throw Error('No time remaining.'); + throw new Error('No time remaining.'); } } catch { - throw Error(`Context possibly malformed. Displaying context:\n${context}`); + throw new Error( + `Context possibly malformed. Displaying context:\n${context}` + ); } return record.body; @@ -61,7 +83,17 @@ const asyncHandlerWithContext = async ( record: SQSRecord, context: Context ): Promise => { - return Promise.resolve(handlerWithContext(record, context)); + try { + if (context.getRemainingTimeInMillis() === 0) { + throw new Error('No time remaining.'); + } + } catch { + throw new Error( + `Context possibly malformed. Displaying context:\n${context}` + ); + } + await setTimeout(1); // simulate some processing time + return record.body; }; export { diff --git a/packages/batch/tests/unit/BasePartialProcessor.test.ts b/packages/batch/tests/unit/BasePartialProcessor.test.ts index 6c5421c01b..5e61ebe294 100644 --- a/packages/batch/tests/unit/BasePartialProcessor.test.ts +++ b/packages/batch/tests/unit/BasePartialProcessor.test.ts @@ -25,7 +25,7 @@ describe('Class: BasePartialBatchProcessor', () => { super(EventType.SQS); } - public async processRecord( + public processRecord( _record: BaseRecord ): Promise { throw new Error('Not implemented'); diff --git a/packages/batch/tests/unit/SqsFifoPartialProcessor.test.ts b/packages/batch/tests/unit/SqsFifoPartialProcessor.test.ts index 6071464039..a4b55da062 100644 --- a/packages/batch/tests/unit/SqsFifoPartialProcessor.test.ts +++ b/packages/batch/tests/unit/SqsFifoPartialProcessor.test.ts @@ -186,7 +186,7 @@ describe('SQS FIFO Processors', () => { }); } - it('continues processing and moves to the next group when `skipGroupOnError` is true', async () => { + it('continues processing and moves to the next group when `skipGroupOnError` is true', () => { // Prepare const firstRecord = sqsRecordFactory('fail', '1'); const secondRecord = sqsRecordFactory('success', '2'); diff --git a/packages/batch/tests/unit/processPartialResponse.test.ts b/packages/batch/tests/unit/processPartialResponse.test.ts index d9c6d56a20..60b6a31cb4 100644 --- a/packages/batch/tests/unit/processPartialResponse.test.ts +++ b/packages/batch/tests/unit/processPartialResponse.test.ts @@ -36,10 +36,10 @@ describe('Function: processPartialResponse()', () => { context, }; - const handlerWithSqsEvent = async ( + const handlerWithSqsEvent = ( event: SQSEvent, options: BatchProcessingOptions - ) => { + ): Promise => { const processor = new BatchProcessor(EventType.SQS); const handler = async ( @@ -51,10 +51,10 @@ describe('Function: processPartialResponse()', () => { return handler(event, context); }; - const handlerWithKinesisEvent = async ( + const handlerWithKinesisEvent = ( event: KinesisStreamEvent, options: BatchProcessingOptions - ) => { + ): Promise => { const processor = new BatchProcessor(EventType.KinesisDataStreams); const handler = async ( @@ -71,10 +71,10 @@ describe('Function: processPartialResponse()', () => { return handler(event, context); }; - const handlerWithDynamoDBEvent = async ( + const handlerWithDynamoDBEvent = ( event: DynamoDBStreamEvent, options: BatchProcessingOptions - ) => { + ): Promise => { const processor = new BatchProcessor(EventType.DynamoDBStreams); const handler = async ( diff --git a/packages/commons/package.json b/packages/commons/package.json index 3f93b3f614..5d4bb706b8 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -21,6 +21,7 @@ "build": "npm run build:esm & npm run build:cjs", "lint": "biome lint .", "lint:fix": "biome check --write .", + "lint:ci": "biome ci .", "prepack": "node ../../.github/scripts/release_patch_package_json.js ." }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/commons#readme", diff --git a/packages/commons/src/Utility.ts b/packages/commons/src/Utility.ts index 89f1dbd03d..4f21aab7ae 100644 --- a/packages/commons/src/Utility.ts +++ b/packages/commons/src/Utility.ts @@ -10,9 +10,9 @@ * To learn more about the Lambda execution environment lifecycle, see the [Execution environment section](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-context.html) of the AWS Lambda documentation. * * As a Powertools for AWS Lambda (TypeScript) user you probably won't be using this class directly, in fact if you use other Powertools for AWS utilities the cold start heuristic found here is already used to: - * * Add a `coldStart` key to the structured logs when injecting context information in `Logger` - * * Emit a metric during a cold start function invocation in `Metrics` - * * Annotate the invocation segment with a `coldStart` key in `Tracer` + * - Add a `coldStart` key to the structured logs when injecting context information in `Logger` + * - Emit a metric during a cold start function invocation in `Metrics` + * - Annotate the invocation segment with a `coldStart` key in `Tracer` * * If you want to use this logic in your own utilities, `Utility` provides two methods: * diff --git a/packages/commons/src/envUtils.ts b/packages/commons/src/envUtils.ts index b9848dc993..cfc4b2adfa 100644 --- a/packages/commons/src/envUtils.ts +++ b/packages/commons/src/envUtils.ts @@ -107,7 +107,7 @@ const getNumberFromEnv = ({ const parsedValue = Number(value); if (Number.isNaN(parsedValue)) { - throw new Error(`Environment variable ${key} must be a number`); + throw new TypeError(`Environment variable ${key} must be a number`); } return parsedValue; diff --git a/packages/commons/src/index.ts b/packages/commons/src/index.ts index f4eb6ce10b..aed1788618 100644 --- a/packages/commons/src/index.ts +++ b/packages/commons/src/index.ts @@ -1,10 +1,10 @@ import { PT_VERSION } from './version.js'; const env = process.env.AWS_EXECUTION_ENV || 'NA'; -if (!process.env.AWS_SDK_UA_APP_ID) { - process.env.AWS_SDK_UA_APP_ID = `PT/NO-OP/${PT_VERSION}/PTEnv/${env}`; -} else { +if (process.env.AWS_SDK_UA_APP_ID) { process.env.AWS_SDK_UA_APP_ID = `${process.env.AWS_SDK_UA_APP_ID}/PT/NO-OP/${PT_VERSION}/PTEnv/${env}`; +} else { + process.env.AWS_SDK_UA_APP_ID = `PT/NO-OP/${PT_VERSION}/PTEnv/${env}`; } export { addUserAgentMiddleware, isSdkClient } from './awsSdkUtils.js'; diff --git a/packages/commons/tests/types/LambdaInterface.test.ts b/packages/commons/tests/types/LambdaInterface.test.ts index 5b50d083fe..75be898c11 100644 --- a/packages/commons/tests/types/LambdaInterface.test.ts +++ b/packages/commons/tests/types/LambdaInterface.test.ts @@ -21,11 +21,12 @@ describe('Type: LambdaInterface', () => { expectTypeOf(lambda.handler).toBeFunction(); }); - it('works with an async handler', async () => { + it('works with an async handler', () => { // Prepare class Lambda implements LambdaInterface { public async handler(_event: unknown, context: Context) { context.getRemainingTimeInMillis(); + await new Promise((r) => setTimeout(r, 1)); return 'Hello World'; } } diff --git a/packages/commons/tests/unit/awsSdkUtils.test.ts b/packages/commons/tests/unit/awsSdkUtils.test.ts index 2029c2ecc7..5223605292 100644 --- a/packages/commons/tests/unit/awsSdkUtils.test.ts +++ b/packages/commons/tests/unit/awsSdkUtils.test.ts @@ -28,7 +28,7 @@ describe('Helpers: awsSdk', () => { expect(console.warn).toHaveBeenCalledTimes(1); }); - it('should return and do nothing if the client already has a Powertools UA middleware', async () => { + it('should return and do nothing if the client already has a Powertools UA middleware', () => { // Prepare const client = { middlewareStack: { @@ -51,7 +51,7 @@ describe('Helpers: awsSdk', () => { expect(client.middlewareStack.addRelativeTo).toHaveBeenCalledTimes(0); }); - it('should call the function to add the middleware with the correct arguments', async () => { + it('should call the function to add the middleware with the correct arguments', () => { // Prepare const client = { middlewareStack: { diff --git a/packages/event-handler/package.json b/packages/event-handler/package.json index 2bbfcf4357..8b6e8bcc6d 100644 --- a/packages/event-handler/package.json +++ b/packages/event-handler/package.json @@ -22,6 +22,7 @@ "build": "npm run build:esm & npm run build:cjs", "lint": "biome lint .", "lint:fix": "biome check --write .", + "lint:ci": "biome ci .", "prepack": "node ../../.github/scripts/release_patch_package_json.js ." }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript#readme", diff --git a/packages/event-handler/src/appsync-events/Router.ts b/packages/event-handler/src/appsync-events/Router.ts index 38e189d65d..1298c82937 100644 --- a/packages/event-handler/src/appsync-events/Router.ts +++ b/packages/event-handler/src/appsync-events/Router.ts @@ -1,6 +1,9 @@ import type { GenericLogger } from '@aws-lambda-powertools/commons/types'; import { isRecord } from '@aws-lambda-powertools/commons/typeutils'; -import { getStringFromEnv, isDevMode } from '@aws-lambda-powertools/commons/utils/env'; +import { + getStringFromEnv, + isDevMode, +} from '@aws-lambda-powertools/commons/utils/env'; import type { OnPublishHandler, OnSubscribeHandler, @@ -31,7 +34,7 @@ class Router { * Whether the router is running in development mode. */ protected readonly isDev: boolean = false; - + public constructor(options?: RouterOptions) { const alcLogLevel = getStringFromEnv({ key: 'AWS_LAMBDA_LOG_LEVEL', diff --git a/packages/event-handler/src/appsync-graphql/AppSyncGraphQLResolver.ts b/packages/event-handler/src/appsync-graphql/AppSyncGraphQLResolver.ts index a338ef9c5b..6aede4c554 100644 --- a/packages/event-handler/src/appsync-graphql/AppSyncGraphQLResolver.ts +++ b/packages/event-handler/src/appsync-graphql/AppSyncGraphQLResolver.ts @@ -152,11 +152,7 @@ class AppSyncGraphQLResolver extends Router { * @param context - The AWS Lambda context object. * @param options - Optional parameters for the resolver, such as the scope of the handler. */ - public async resolve( - event: unknown, - context: Context, - options?: ResolveOptions - ): Promise { + public resolve(event: unknown, context: Context, options?: ResolveOptions) { if (Array.isArray(event)) { if (event.some((e) => !isAppSyncGraphQLEvent(e))) { this.logger.warn( @@ -194,10 +190,10 @@ class AppSyncGraphQLResolver extends Router { * @param options - Optional resolve options for customizing resolver behavior. */ async #withErrorHandling( - fn: () => Promise, + fn: () => unknown, event: AppSyncResolverEvent>, options?: ResolveOptions - ): Promise { + ) { try { return await fn(); } catch (error) { @@ -377,11 +373,11 @@ class AppSyncGraphQLResolver extends Router { * @param options - Optional parameters for the resolver, such as the scope of the handler. * @throws {ResolverNotFoundException} If no resolver is registered for the given field and type. */ - async #executeSingleResolver( + #executeSingleResolver( event: AppSyncResolverEvent>, context: Context, options?: ResolveOptions - ): Promise { + ): unknown { const { fieldName, parentTypeName: typeName } = event.info; const resolverHandlerOptions = this.resolverRegistry.resolve( diff --git a/packages/event-handler/src/appsync-graphql/index.ts b/packages/event-handler/src/appsync-graphql/index.ts index 9fe91122f4..bffc35bad1 100644 --- a/packages/event-handler/src/appsync-graphql/index.ts +++ b/packages/event-handler/src/appsync-graphql/index.ts @@ -1,7 +1,7 @@ export { AppSyncGraphQLResolver } from './AppSyncGraphQLResolver.js'; export { - ResolverNotFoundException, InvalidBatchResponseException, + ResolverNotFoundException, } from './errors.js'; export { awsDate, diff --git a/packages/event-handler/src/bedrock-agent/BedrockAgentFunctionResolver.ts b/packages/event-handler/src/bedrock-agent/BedrockAgentFunctionResolver.ts index 5211ddade3..37e186dc69 100644 --- a/packages/event-handler/src/bedrock-agent/BedrockAgentFunctionResolver.ts +++ b/packages/event-handler/src/bedrock-agent/BedrockAgentFunctionResolver.ts @@ -146,7 +146,7 @@ class BedrockAgentFunctionResolver { public tool>( fn: ToolFunction, config: Configuration - ): undefined { + ) { const { name } = config; if (this.#tools.has(name)) { this.#logger.warn( diff --git a/packages/event-handler/src/rest/converters.ts b/packages/event-handler/src/rest/converters.ts index d47302ebf6..56c4271d0b 100644 --- a/packages/event-handler/src/rest/converters.ts +++ b/packages/event-handler/src/rest/converters.ts @@ -29,18 +29,16 @@ const createBody = (body: string | null, isBase64Encoded: boolean) => { * @param event - The API Gateway proxy event * @returns A Web API Request object */ -export const proxyEventToWebRequest = ( - event: APIGatewayProxyEvent -): Request => { +const proxyEventToWebRequest = (event: APIGatewayProxyEvent): Request => { const { httpMethod, path } = event; const { domainName } = event.requestContext; const headers = new Headers(); - for (const [name, value] of Object.entries(event.headers ?? {})) { - if (value != null) headers.set(name, value); + for (const [name, value] of Object.entries(event.headers)) { + if (value !== undefined) headers.set(name, value); } - for (const [name, values] of Object.entries(event.multiValueHeaders ?? {})) { + for (const [name, values] of Object.entries(event.multiValueHeaders)) { for (const value of values ?? []) { const headerValue = headers.get(name); if (!headerValue?.includes(value)) { @@ -79,7 +77,7 @@ export const proxyEventToWebRequest = ( * @param response - The Web API Response object * @returns An API Gateway proxy result */ -export const webResponseToProxyResult = async ( +const webResponseToProxyResult = async ( response: Response ): Promise => { const headers: Record = {}; @@ -136,10 +134,9 @@ export const webResponseToProxyResult = async ( * Handles APIGatewayProxyResult, Response objects, and plain objects. * * @param response - The handler response (APIGatewayProxyResult, Response, or plain object) - * @param headers - Optional headers to be included in the response - * @returns A Web API Response object + * @param resHeaders - Optional headers to be included in the response */ -export const handlerResultToWebResponse = ( +const handlerResultToWebResponse = ( response: HandlerResponse, resHeaders?: Headers ): Response => { @@ -188,7 +185,7 @@ export const handlerResultToWebResponse = ( * @param statusCode - The response status code to return * @returns An API Gateway proxy result */ -export const handlerResultToProxyResult = async ( +const handlerResultToProxyResult = async ( response: HandlerResponse, statusCode: HttpStatusCode = HttpStatusCodes.OK ): Promise => { @@ -205,3 +202,10 @@ export const handlerResultToProxyResult = async ( isBase64Encoded: false, }; }; + +export { + proxyEventToWebRequest, + webResponseToProxyResult, + handlerResultToWebResponse, + handlerResultToProxyResult, +}; diff --git a/packages/event-handler/src/rest/middleware/cors.ts b/packages/event-handler/src/rest/middleware/cors.ts index 25c780e39b..3a7d9b5f55 100644 --- a/packages/event-handler/src/rest/middleware/cors.ts +++ b/packages/event-handler/src/rest/middleware/cors.ts @@ -35,6 +35,7 @@ import { * })); * ``` * + * @param options - Configuration options for CORS * @param options.origin - The origin to allow requests from * @param options.allowMethods - The HTTP methods to allow * @param options.allowHeaders - The headers to allow diff --git a/packages/event-handler/src/rest/utils.ts b/packages/event-handler/src/rest/utils.ts index eb587a0b7d..ca41f0a5a7 100644 --- a/packages/event-handler/src/rest/utils.ts +++ b/packages/event-handler/src/rest/utils.ts @@ -150,7 +150,7 @@ export const isAPIGatewayProxyResult = ( * ``` */ export const composeMiddleware = (middleware: Middleware[]): Middleware => { - return async ({ reqCtx, next }): Promise => { + return async ({ reqCtx, next }) => { let index = -1; let result: HandlerResponse | undefined; diff --git a/packages/event-handler/src/types/bedrock-agent.ts b/packages/event-handler/src/types/bedrock-agent.ts index c649e1200d..8d99735cef 100644 --- a/packages/event-handler/src/types/bedrock-agent.ts +++ b/packages/event-handler/src/types/bedrock-agent.ts @@ -51,7 +51,10 @@ type ToolFunction> = ( event: BedrockAgentFunctionEvent; context: Context; } -) => Promise; +) => + | Promise + | JSONValue + | BedrockFunctionResponse; /** * Tool in the Bedrock Agent Function Resolver. @@ -159,7 +162,7 @@ type ResolverOptions = { * * When no logger is provided, we'll only log warnings and errors using the global `console` object. */ - logger?: GenericLogger; + logger?: Pick; }; export type { diff --git a/packages/event-handler/src/types/rest.ts b/packages/event-handler/src/types/rest.ts index 1c9925ce22..b7a0d2e21e 100644 --- a/packages/event-handler/src/types/rest.ts +++ b/packages/event-handler/src/types/rest.ts @@ -24,12 +24,13 @@ type ErrorHandler = ( ) => Promise; interface ErrorConstructor { + // biome-ignore lint/suspicious/noExplicitAny: this is a generic type that is intentionally open new (...args: any[]): T; prototype: T; } /** - * Options for the {@link Router} class + * Options for the {@link Router | `Router``} class */ type RestRouterOptions = { /** @@ -57,7 +58,7 @@ type HandlerResponse = Response | JSONObject; type RouteHandler = ( reqCtx: RequestContext -) => Promise; +) => Promise | TReturn; type HttpMethod = keyof typeof HttpVerbs; @@ -78,12 +79,14 @@ type RestRouteOptions = { middleware?: Middleware[]; }; +// biome-ignore lint/suspicious/noConfusingVoidType: To ensure next function is awaited type NextFunction = () => Promise; type Middleware = (args: { reqCtx: RequestContext; next: NextFunction; -}) => Promise; + // biome-ignore lint/suspicious/noConfusingVoidType: To ensure next function is awaited +}) => Promise; type RouteRegistryOptions = { /** @@ -176,4 +179,5 @@ export type { RouteRegistryOptions, ValidationResult, CompressionOptions, + NextFunction, }; diff --git a/packages/event-handler/tests/unit/appsync-events/AppSyncEventsResolver.test.ts b/packages/event-handler/tests/unit/appsync-events/AppSyncEventsResolver.test.ts index 16da12ce63..512ff7a095 100644 --- a/packages/event-handler/tests/unit/appsync-events/AppSyncEventsResolver.test.ts +++ b/packages/event-handler/tests/unit/appsync-events/AppSyncEventsResolver.test.ts @@ -87,7 +87,7 @@ describe('Class: AppSyncEventsResolver', () => { public scope = 'scoped'; @app.onPublish('/foo', { aggregate }) - public async handleFoo(payloads: OnPublishAggregatePayload) { + public handleFoo(payloads: OnPublishAggregatePayload) { return payloads.map((payload) => { return { id: payload.id, @@ -97,15 +97,15 @@ describe('Class: AppSyncEventsResolver', () => { } @app.onPublish('/bar') - public async handleBar(payload: string) { + public handleBar(payload: string) { return `${this.scope} ${payload}`; } - public async handler(event: unknown, context: Context) { + public handler(event: unknown, context: Context) { return this.stuff(event, context); } - async stuff(event: unknown, context: Context) { + stuff(event: unknown, context: Context) { return app.resolve(event, context, { scope: this }); } } @@ -146,15 +146,15 @@ describe('Class: AppSyncEventsResolver', () => { public scope = 'scoped'; @app.onSubscribe('/foo') - public async handleFoo(payload: AppSyncEventsSubscribeEvent) { + public handleFoo(payload: AppSyncEventsSubscribeEvent) { console.debug(`${this.scope} ${payload.info.channel.path}`); } - public async handler(event: unknown, context: Context) { + public handler(event: unknown, context: Context) { return this.stuff(event, context); } - async stuff(event: unknown, context: Context) { + stuff(event: unknown, context: Context) { return app.resolve(event, context, { scope: this }); } } @@ -222,7 +222,7 @@ describe('Class: AppSyncEventsResolver', () => { async ({ error, message }) => { // Prepare const app = new AppSyncEventsResolver({ logger: console }); - app.onSubscribe('/foo', async () => { + app.onSubscribe('/foo', () => { throw error; }); @@ -242,7 +242,7 @@ describe('Class: AppSyncEventsResolver', () => { it('throws an UnauthorizedException when thrown by the handler', async () => { // Prepare const app = new AppSyncEventsResolver({ logger: console }); - app.onSubscribe('/foo', async () => { + app.onSubscribe('/foo', () => { throw new UnauthorizedException('nah'); }); @@ -258,7 +258,7 @@ describe('Class: AppSyncEventsResolver', () => { it('returns the response of the onPublish handler', async () => { // Prepare const app = new AppSyncEventsResolver({ logger: console }); - app.onPublish('/foo', async (payload) => { + app.onPublish('/foo', (payload) => { if (payload === 'foo') { return true; } @@ -303,7 +303,7 @@ describe('Class: AppSyncEventsResolver', () => { const app = new AppSyncEventsResolver({ logger: console }); app.onPublish( '/foo', - async (payloads) => { + (payloads) => { return payloads.map((payload) => ({ id: payload.id, payload: true, @@ -353,7 +353,7 @@ describe('Class: AppSyncEventsResolver', () => { const app = new AppSyncEventsResolver({ logger: console }); app.onPublish( '/foo', - async () => { + () => { throw new Error('Error in handler'); }, { aggregate: true } @@ -379,7 +379,7 @@ describe('Class: AppSyncEventsResolver', () => { const app = new AppSyncEventsResolver({ logger: console }); app.onPublish( '/foo', - async () => { + () => { throw new UnauthorizedException('nah'); }, { aggregate: true } @@ -400,7 +400,7 @@ describe('Class: AppSyncEventsResolver', () => { const app = new AppSyncEventsResolver(); app.onPublish( '/foo', - async () => { + () => { throw new Error('Error in handler'); }, { aggregate: true } diff --git a/packages/event-handler/tests/unit/appsync-graphql/AppSyncGraphQLResolver.test.ts b/packages/event-handler/tests/unit/appsync-graphql/AppSyncGraphQLResolver.test.ts index 06b653fcd9..1100a41005 100644 --- a/packages/event-handler/tests/unit/appsync-graphql/AppSyncGraphQLResolver.test.ts +++ b/packages/event-handler/tests/unit/appsync-graphql/AppSyncGraphQLResolver.test.ts @@ -93,7 +93,7 @@ describe('Class: AppSyncGraphQLResolver', () => { // Prepare const app = new AppSyncGraphQLResolver({ logger: console }); app.resolver<{ id: string }>( - async ({ id }) => { + ({ id }) => { return { id, title: 'Post Title', @@ -123,7 +123,7 @@ describe('Class: AppSyncGraphQLResolver', () => { // Prepare const app = new AppSyncGraphQLResolver({ logger: console }); app.resolver<{ title: string; content: string }>( - async ({ title, content }) => { + ({ title, content }) => { return { id: '123', title, @@ -166,7 +166,7 @@ describe('Class: AppSyncGraphQLResolver', () => { const app = new AppSyncGraphQLResolver(); app.onMutation<{ title: string; content: string }>( 'addPost', - async ({ title, content }) => { + ({ title, content }) => { return { id: '123', title, @@ -196,16 +196,13 @@ describe('Class: AppSyncGraphQLResolver', () => { it('resolver function has access to event and context', async () => { // Prepare const app = new AppSyncGraphQLResolver({ logger: console }); - app.onQuery<{ id: string }>( - 'getPost', - async ({ id }, { event, context }) => { - return { - id, - event, - context, - }; - } - ); + app.onQuery<{ id: string }>('getPost', ({ id }, { event, context }) => { + return { + id, + event, + context, + }; + }); // Act const event = onGraphqlEventFactory('getPost', 'Query', { id: '123' }); @@ -227,7 +224,7 @@ describe('Class: AppSyncGraphQLResolver', () => { public scope = 'scoped'; @app.onQuery('getPost') - public async handleGetPost({ id }: { id: string }) { + public handleGetPost({ id }: { id: string }) { return { id, scope: `${this.scope} id=${id}`, @@ -235,7 +232,7 @@ describe('Class: AppSyncGraphQLResolver', () => { } @app.onMutation('addPost') - public async handleAddPost({ + public handleAddPost({ title, content, }: { @@ -250,11 +247,11 @@ describe('Class: AppSyncGraphQLResolver', () => { }; } - public async handler(event: unknown, context: Context) { + public handler(event: unknown, context: Context) { return this.stuff(event, context); } - async stuff(event: unknown, context: Context) { + stuff(event: unknown, context: Context) { return app.resolve(event, context, { scope: this }); } } @@ -295,9 +292,7 @@ describe('Class: AppSyncGraphQLResolver', () => { public scope = 'scoped'; @app.batchResolver({ fieldName: 'batchGet' }) - public async handleBatchGet( - events: AppSyncResolverEvent<{ id: number }>[] - ) { + public handleBatchGet(events: AppSyncResolverEvent<{ id: number }>[]) { const ids = events.map((event) => event.arguments.id); return ids.map((id) => ({ id, @@ -305,7 +300,7 @@ describe('Class: AppSyncGraphQLResolver', () => { })); } - public async handler(event: unknown, context: Context) { + public handler(event: unknown, context: Context) { return app.resolve(event, context, { scope: this }); } } @@ -351,14 +346,14 @@ describe('Class: AppSyncGraphQLResolver', () => { throwOnError, aggregate: false, }) - public async handleBatchGet({ id }: { id: string }) { + public handleBatchGet({ id }: { id: string }) { return { id, scope: `${this.scope} id=${id} throwOnError=${throwOnError} aggregate=false`, }; } - public async handler(event: unknown, context: Context) { + public handler(event: unknown, context: Context) { return app.resolve(event, context, { scope: this }); } } @@ -395,7 +390,7 @@ describe('Class: AppSyncGraphQLResolver', () => { class Lambda { @app.resolver({ fieldName: 'getPost' }) - public async handleGetPost({ id }: { id: string }) { + public handleGetPost({ id }: { id: string }) { return { id, title: 'Post Title', @@ -403,7 +398,7 @@ describe('Class: AppSyncGraphQLResolver', () => { }; } - public async handler(event: unknown, context: Context) { + public handler(event: unknown, context: Context) { return app.resolve(event, context, { scope: this }); } } @@ -445,7 +440,7 @@ describe('Class: AppSyncGraphQLResolver', () => { // Prepare const app = new AppSyncGraphQLResolver({ logger: console }); app.resolver( - async () => { + () => { throw error; }, { @@ -677,9 +672,7 @@ describe('Class: AppSyncGraphQLResolver', () => { @app.onBatchQuery('batchGet', { throwOnError, }) - public async handleBatchGet( - events: AppSyncResolverEvent<{ id: number }>[] - ) { + public handleBatchGet(events: AppSyncResolverEvent<{ id: number }>[]) { const ids = events.map((event) => event.arguments.id); return ids.map((id) => ({ id, @@ -690,13 +683,11 @@ describe('Class: AppSyncGraphQLResolver', () => { @app.onBatchMutation('batchPut', { throwOnError, }) - public async handleBatchPut( - _events: AppSyncResolverEvent<{ id: number }>[] - ) { + public handleBatchPut(_events: AppSyncResolverEvent<{ id: number }>[]) { return [this.scope, this.scope]; } - public async handler(event: unknown, context: Context) { + public handler(event: unknown, context: Context) { return app.resolve(event, context, { scope: this }); } } @@ -776,9 +767,9 @@ describe('Class: AppSyncGraphQLResolver', () => { errorName: err.constructor.name, })); - app.onQuery('getUser', async () => { + app.onQuery('getUser', () => { throw errorClass === AggregateError - ? new errorClass([new Error()], message) + ? new errorClass([new Error('test error')], message) : new errorClass(message); }); @@ -800,7 +791,7 @@ describe('Class: AppSyncGraphQLResolver', () => { // Prepare const app = new AppSyncGraphQLResolver(); - app.exceptionHandler(ValidationError, async (error) => { + app.exceptionHandler(ValidationError, (error) => { return { message: 'Validation failed', details: error.message, @@ -808,7 +799,7 @@ describe('Class: AppSyncGraphQLResolver', () => { }; }); - app.exceptionHandler(NotFoundError, async (error) => { + app.exceptionHandler(NotFoundError, (error) => { return { message: 'Resource not found', details: error.message, @@ -816,7 +807,7 @@ describe('Class: AppSyncGraphQLResolver', () => { }; }); - app.onQuery<{ id: string }>('getUser', async ({ id }) => { + app.onQuery<{ id: string }>('getUser', ({ id }) => { if (!id) { throw new ValidationError('User ID is required'); } @@ -853,7 +844,7 @@ describe('Class: AppSyncGraphQLResolver', () => { // Prepare const app = new AppSyncGraphQLResolver(); - app.exceptionHandler(Error, async (error) => { + app.exceptionHandler(Error, (error) => { return { message: 'Generic error occurred', details: error.message, @@ -861,7 +852,7 @@ describe('Class: AppSyncGraphQLResolver', () => { }; }); - app.exceptionHandler(ValidationError, async (error) => { + app.exceptionHandler(ValidationError, (error) => { return { message: 'Validation failed', details: error.message, @@ -869,7 +860,7 @@ describe('Class: AppSyncGraphQLResolver', () => { }; }); - app.onQuery('getUser', async () => { + app.onQuery('getUser', () => { throw new ValidationError('Specific validation error'); }); @@ -891,7 +882,7 @@ describe('Class: AppSyncGraphQLResolver', () => { // Prepare const app = new AppSyncGraphQLResolver(); - app.exceptionHandler(AssertionError, async (error) => { + app.exceptionHandler(AssertionError, (error) => { return { message: 'Validation failed', details: error.message, @@ -899,7 +890,7 @@ describe('Class: AppSyncGraphQLResolver', () => { }; }); - app.onQuery('getUser', async () => { + app.onQuery('getUser', () => { throw new DatabaseError('Database connection failed'); }); @@ -920,11 +911,11 @@ describe('Class: AppSyncGraphQLResolver', () => { const app = new AppSyncGraphQLResolver({ logger: console }); const errorToBeThrown = new Error('Exception handler failed'); - app.exceptionHandler(ValidationError, async () => { + app.exceptionHandler(ValidationError, () => { throw errorToBeThrown; }); - app.onQuery('getUser', async () => { + app.onQuery('getUser', () => { throw new ValidationError('Original error'); }); @@ -962,7 +953,7 @@ describe('Class: AppSyncGraphQLResolver', () => { }; }); - app.onQuery('getUser', async () => { + app.onQuery('getUser', () => { throw new ValidationError('Sync error test'); }); @@ -984,7 +975,7 @@ describe('Class: AppSyncGraphQLResolver', () => { // Prepare const app = new AppSyncGraphQLResolver(); - app.exceptionHandler(RangeError, async (error) => { + app.exceptionHandler(RangeError, (error) => { return { message: 'This should not be called', details: error.message, @@ -1009,7 +1000,7 @@ describe('Class: AppSyncGraphQLResolver', () => { public readonly scope = 'scoped'; @app.exceptionHandler(ValidationError) - async handleValidationError(error: ValidationError) { + handleValidationError(error: ValidationError) { return { message: 'Decorator validation failed', details: error.message, @@ -1029,7 +1020,7 @@ describe('Class: AppSyncGraphQLResolver', () => { } @app.onQuery('getUser') - async getUser({ id, name }: { id: string; name: string }) { + getUser({ id, name }: { id: string; name: string }) { if (!id) { throw new ValidationError('Decorator error test'); } @@ -1039,7 +1030,7 @@ describe('Class: AppSyncGraphQLResolver', () => { return { id, name }; } - async handler(event: unknown, context: Context) { + handler(event: unknown, context: Context) { return app.resolve(event, context, { scope: this, }); @@ -1078,7 +1069,7 @@ describe('Class: AppSyncGraphQLResolver', () => { // Prepare const app = new AppSyncGraphQLResolver({ logger: console }); - app.exceptionHandler([ValidationError, NotFoundError], async (error) => { + app.exceptionHandler([ValidationError, NotFoundError], (error) => { return { message: 'User service error', details: error.message, @@ -1087,7 +1078,7 @@ describe('Class: AppSyncGraphQLResolver', () => { }; }); - app.onQuery<{ id: string }>('getId', async ({ id }) => { + app.onQuery<{ id: string }>('getId', ({ id }) => { if (!id) { throw new ValidationError('User ID is required for retrieval'); } @@ -1146,7 +1137,7 @@ describe('Class: AppSyncGraphQLResolver', () => { public readonly serviceName = 'OrderService'; @app.exceptionHandler([ValidationError, NotFoundError]) - async handleOrderErrors(error: ValidationError | NotFoundError) { + handleOrderErrors(error: ValidationError | NotFoundError) { return { message: `${this.serviceName} encountered an error`, details: error.message, @@ -1157,7 +1148,7 @@ describe('Class: AppSyncGraphQLResolver', () => { } @app.onQuery('getOrder') - async getOrderById({ orderId }: { orderId: string }) { + getOrderById({ orderId }: { orderId: string }) { if (!orderId) { throw new ValidationError('Order ID is required'); } @@ -1170,7 +1161,7 @@ describe('Class: AppSyncGraphQLResolver', () => { return { orderId, status: 'found', service: this.serviceName }; } - async handler(event: unknown, context: Context) { + handler(event: unknown, context: Context) { const resolved = app.resolve(event, context, { scope: this, }); @@ -1228,7 +1219,7 @@ describe('Class: AppSyncGraphQLResolver', () => { // Prepare const app = new AppSyncGraphQLResolver(); - app.exceptionHandler([ValidationError, TypeError], async (error) => { + app.exceptionHandler([ValidationError, TypeError], (error) => { return { message: 'Payment validation error', details: error.message, @@ -1237,7 +1228,7 @@ describe('Class: AppSyncGraphQLResolver', () => { }; }); - app.exceptionHandler(ValidationError, async (error) => { + app.exceptionHandler(ValidationError, (error) => { return { message: 'Specific payment validation error', details: error.message, @@ -1248,7 +1239,7 @@ describe('Class: AppSyncGraphQLResolver', () => { app.onQuery<{ amount: number; currency: string }>( 'getPayment', - async ({ amount, currency }) => { + ({ amount, currency }) => { if (!amount || amount <= 0) { throw new ValidationError('Invalid payment amount'); } @@ -1304,14 +1295,14 @@ describe('Class: AppSyncGraphQLResolver', () => { // Prepare const app = new AppSyncGraphQLResolver({ logger: console }); - app.exceptionHandler([], async (error) => { + app.exceptionHandler([], (error) => { return { message: 'This should never be called', details: error.message, }; }); - app.onQuery<{ requestId: string }>('getId', async ({ requestId }) => { + app.onQuery<{ requestId: string }>('getId', ({ requestId }) => { if (requestId === 'validation-error') { throw new ValidationError('Invalid request format'); } diff --git a/packages/event-handler/tests/unit/bedrock-agent/BedrockAgentFunctionResolver.test.ts b/packages/event-handler/tests/unit/bedrock-agent/BedrockAgentFunctionResolver.test.ts index 1b21f6694c..ae2e34b452 100644 --- a/packages/event-handler/tests/unit/bedrock-agent/BedrockAgentFunctionResolver.test.ts +++ b/packages/event-handler/tests/unit/bedrock-agent/BedrockAgentFunctionResolver.test.ts @@ -82,7 +82,7 @@ describe('Class: BedrockAgentFunctionResolver', () => { const app = new BedrockAgentFunctionResolver(); app.tool( - async (params: { arg: string }) => { + (params: { arg: string }) => { return params.arg; }, { @@ -101,7 +101,7 @@ describe('Class: BedrockAgentFunctionResolver', () => { const app = new BedrockAgentFunctionResolver(); app.tool( - async (params: { arg: string }) => { + (params: { arg: string }) => { return params.arg; }, { @@ -132,7 +132,7 @@ describe('Class: BedrockAgentFunctionResolver', () => { ]); app.tool( - async (params: { a: number; b: number }) => { + (params: { a: number; b: number }) => { return params.a + params.b; }, { @@ -148,7 +148,7 @@ describe('Class: BedrockAgentFunctionResolver', () => { ); app.tool( - async (params: { a: number; b: number }) => { + (params: { a: number; b: number }) => { return params.a * params.b; }, { @@ -176,7 +176,7 @@ describe('Class: BedrockAgentFunctionResolver', () => { const app = new BedrockAgentFunctionResolver({ logger }); app.tool( - async (params: { arg: string }) => { + (params: { arg: string }) => { return params.arg; }, { @@ -186,7 +186,7 @@ describe('Class: BedrockAgentFunctionResolver', () => { ); app.tool( - async (params: { arg: string }) => { + (params: { arg: string }) => { return params.arg; }, { @@ -196,8 +196,8 @@ describe('Class: BedrockAgentFunctionResolver', () => { ); app.tool( - async (_params) => { - throw new Error(); + () => { + throw new Error('test error'); }, { name: 'error', @@ -220,7 +220,7 @@ describe('Class: BedrockAgentFunctionResolver', () => { const app = new BedrockAgentFunctionResolver(); app.tool( - async (_params, options) => { + (_params, options) => { return options?.event; }, { @@ -332,7 +332,7 @@ describe('Class: BedrockAgentFunctionResolver', () => { const app = new BedrockAgentFunctionResolver(); app.tool( - async () => { + () => { return new BedrockFunctionResponse({ body: 'I am not sure', responseState: 'REPROMPT', @@ -535,7 +535,7 @@ describe('Class: BedrockAgentFunctionResolver', () => { const app = new BedrockAgentFunctionResolver(); app.tool( - async (_params, _options) => { + (_params, _options) => { throw toThrow; }, { @@ -564,7 +564,7 @@ describe('Class: BedrockAgentFunctionResolver', () => { const app = new BedrockAgentFunctionResolver(); app.tool( - async (params, _options) => { + (params, _options) => { return `Hello, ${params.name}!`; }, { diff --git a/packages/event-handler/tests/unit/rest/RouteHandlerRegistry.test.ts b/packages/event-handler/tests/unit/rest/RouteHandlerRegistry.test.ts index 42dccf5f24..f27671fd38 100644 --- a/packages/event-handler/tests/unit/rest/RouteHandlerRegistry.test.ts +++ b/packages/event-handler/tests/unit/rest/RouteHandlerRegistry.test.ts @@ -1,5 +1,8 @@ import { describe, expect, it } from 'vitest'; -import { HttpVerbs } from '../../../src/rest/index.js'; +import { + HttpVerbs, + ParameterValidationError, +} from '../../../src/rest/index.js'; import { Route } from '../../../src/rest/Route.js'; import { RouteHandlerRegistry } from '../../../src/rest/RouteHandlerRegistry.js'; import type { Path } from '../../../src/types/rest.js'; @@ -570,20 +573,20 @@ describe('Class: RouteHandlerRegistry', () => { it('throws ParameterValidationError with multiple error messages for multiple invalid parameters', () => { // Prepare const registry = new RouteHandlerRegistry({ logger: console }); - const handler = async () => ({ message: 'test' }); + const handler = () => ({ message: 'test' }); registry.register( new Route(HttpVerbs.GET, '/api/:version/:resource/:id', handler) ); // Act & Assess - expect(async () => { + expect(() => { registry.resolve(HttpVerbs.GET, '/api/%20/users/%20'); - }).rejects.toMatchObject({ - issues: [ + }).toThrow( + new ParameterValidationError([ "Parameter 'version' cannot be empty", "Parameter 'id' cannot be empty", - ], - }); + ]) + ); }); }); }); diff --git a/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts b/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts index a17ce1eb46..a2de67e709 100644 --- a/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts @@ -89,7 +89,7 @@ describe('Class: Router - Basic Routing', () => { const app = new Router(); const testEvent = createTestEvent('/test', 'GET'); - app.get('/test', async (reqCtx) => { + app.get('/test', (reqCtx) => { return { hasRequest: reqCtx.req instanceof Request, hasEvent: reqCtx.event === testEvent, @@ -107,7 +107,7 @@ describe('Class: Router - Basic Routing', () => { expect(actual.hasContext).toBe(true); }); - it('throws an internal server error for non-API Gateway events', async () => { + it('throws an internal server error for non-API Gateway events', () => { // Prepare const app = new Router(); const nonApiGatewayEvent = { Records: [] }; // SQS-like event @@ -123,10 +123,10 @@ describe('Class: Router - Basic Routing', () => { const app = new Router({ prefix: '/todos', }); - app.post('/', async () => { + app.post('/', () => { return { actualPath: '/todos' }; }); - app.get('/:todoId', async (reqCtx) => { + app.get('/:todoId', (reqCtx) => { return { actualPath: `/todos/${reqCtx.params.todoId}` }; }); @@ -153,11 +153,9 @@ describe('Class: Router - Basic Routing', () => { await next(); }); todoRouter.get('/', async () => ({ api: 'listTodos' })); - todoRouter.notFound(async () => { - return { - error: 'Route not found', - }; - }); + todoRouter.notFound(async () => ({ + error: 'Route not found', + })); const consoleLogSpy = vi.spyOn(console, 'log'); const consoleWarnSpy = vi.spyOn(console, 'warn'); diff --git a/packages/event-handler/tests/unit/rest/Router/decorators.test.ts b/packages/event-handler/tests/unit/rest/Router/decorators.test.ts index 0528e7a963..98c0ab7c5b 100644 --- a/packages/event-handler/tests/unit/rest/Router/decorators.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/decorators.test.ts @@ -17,41 +17,41 @@ describe('Class: Router - Decorators', () => { class Lambda { @app.get('/test') - public async getTest() { + public getTest() { return { result: 'get-test' }; } @app.post('/test') - public async postTest() { + public postTest() { return { result: 'post-test' }; } @app.put('/test') - public async putTest() { + public putTest() { return { result: 'put-test' }; } @app.patch('/test') - public async patchTest() { + public patchTest() { return { result: 'patch-test' }; } @app.delete('/test') - public async deleteTest() { + public deleteTest() { return { result: 'delete-test' }; } @app.head('/test') - public async headTest() { + public headTest() { return { result: 'head-test' }; } @app.options('/test') - public async optionsTest() { + public optionsTest() { return { result: 'options-test' }; } - public async handler(event: unknown, _context: Context) { + public handler(event: unknown, _context: Context) { return app.resolve(event, _context); } } @@ -96,12 +96,12 @@ describe('Class: Router - Decorators', () => { public scope = 'class-scope'; @app.get('/test', [middleware]) - public async getTest() { + public getTest() { executionOrder.push('handler'); return { result: `${this.scope}: decorator-with-middleware` }; } - public async handler(event: unknown, _context: Context) { + public handler(event: unknown, _context: Context) { return app.resolve(event, _context, { scope: this }); } } @@ -149,41 +149,41 @@ describe('Class: Router - Decorators', () => { class Lambda { @app.get('/test', [middleware]) - public async getTest() { + public getTest() { return { result: 'get-decorator-middleware' }; } @app.post('/test', [middleware]) - public async postTest() { + public postTest() { return { result: 'post-decorator-middleware' }; } @app.put('/test', [middleware]) - public async putTest() { + public putTest() { return { result: 'put-decorator-middleware' }; } @app.patch('/test', [middleware]) - public async patchTest() { + public patchTest() { return { result: 'patch-decorator-middleware' }; } @app.delete('/test', [middleware]) - public async deleteTest() { + public deleteTest() { return { result: 'delete-decorator-middleware' }; } @app.head('/test', [middleware]) - public async headTest() { + public headTest() { return { result: 'head-decorator-middleware' }; } @app.options('/test', [middleware]) - public async optionsTest() { + public optionsTest() { return { result: 'options-decorator-middleware' }; } - public async handler(event: unknown, _context: Context) { + public handler(event: unknown, _context: Context) { return app.resolve(event, _context); } } @@ -218,7 +218,7 @@ describe('Class: Router - Decorators', () => { class Lambda { @app.errorHandler(BadRequestError) - public async handleBadRequest(error: BadRequestError) { + public handleBadRequest(error: BadRequestError) { return { statusCode: HttpStatusCodes.BAD_REQUEST, error: 'Bad Request', @@ -227,11 +227,11 @@ describe('Class: Router - Decorators', () => { } @app.get('/test') - public async getTest() { + public getTest() { throw new BadRequestError('test error'); } - public async handler(event: unknown, _context: Context) { + public handler(event: unknown, _context: Context) { return app.resolve(event, _context); } } @@ -265,7 +265,7 @@ describe('Class: Router - Decorators', () => { public scope = 'scoped'; @app.notFound() - public async handleNotFound(error: NotFoundError) { + public handleNotFound(error: NotFoundError) { return { statusCode: HttpStatusCodes.NOT_FOUND, error: 'Not Found', @@ -273,7 +273,7 @@ describe('Class: Router - Decorators', () => { }; } - public async handler(event: unknown, _context: Context) { + public handler(event: unknown, _context: Context) { return app.resolve(event, _context, { scope: this }); } } @@ -306,7 +306,7 @@ describe('Class: Router - Decorators', () => { class Lambda { @app.methodNotAllowed() - public async handleMethodNotAllowed(error: MethodNotAllowedError) { + public handleMethodNotAllowed(error: MethodNotAllowedError) { return { statusCode: HttpStatusCodes.METHOD_NOT_ALLOWED, error: 'Method Not Allowed', @@ -315,11 +315,11 @@ describe('Class: Router - Decorators', () => { } @app.get('/test') - public async getTest() { + public getTest() { throw new MethodNotAllowedError('POST not allowed'); } - public async handler(event: unknown, _context: Context) { + public handler(event: unknown, _context: Context) { return app.resolve(event, _context); } } @@ -353,7 +353,7 @@ describe('Class: Router - Decorators', () => { public scope = 'scoped'; @app.errorHandler(BadRequestError) - public async handleBadRequest(error: BadRequestError) { + public handleBadRequest(error: BadRequestError) { return { statusCode: HttpStatusCodes.BAD_REQUEST, error: 'Bad Request', @@ -362,11 +362,11 @@ describe('Class: Router - Decorators', () => { } @app.get('/test') - public async getTest() { + public getTest() { throw new BadRequestError('test error'); } - public async handler(event: unknown, _context: Context) { + public handler(event: unknown, _context: Context) { return app.resolve(event, _context, { scope: this }); } } @@ -399,7 +399,7 @@ describe('Class: Router - Decorators', () => { class Lambda { @app.get('/test') - public async getTest(reqCtx: RequestContext) { + public getTest(reqCtx: RequestContext) { return { hasRequest: reqCtx.req instanceof Request, hasEvent: reqCtx.event === testEvent, @@ -407,7 +407,7 @@ describe('Class: Router - Decorators', () => { }; } - public async handler(event: unknown, _context: Context) { + public handler(event: unknown, _context: Context) { return app.resolve(event, _context); } } @@ -431,7 +431,7 @@ describe('Class: Router - Decorators', () => { class Lambda { @app.errorHandler(BadRequestError) - public async handleBadRequest( + public handleBadRequest( error: BadRequestError, reqCtx: RequestContext ) { @@ -446,11 +446,11 @@ describe('Class: Router - Decorators', () => { } @app.get('/test') - public async getTest() { + public getTest() { throw new BadRequestError('test error'); } - public async handler(event: unknown, _context: Context) { + public handler(event: unknown, _context: Context) { return app.resolve(event, _context); } } @@ -475,13 +475,13 @@ describe('Class: Router - Decorators', () => { public scope = 'scoped'; @app.get('/test') - public async getTest() { + public getTest() { return { message: `${this.scope}: success`, }; } - public async handler(event: unknown, _context: Context) { + public handler(event: unknown, _context: Context) { return app.resolve(event, _context, { scope: this }); } } diff --git a/packages/event-handler/tests/unit/rest/Router/error-handling.test.ts b/packages/event-handler/tests/unit/rest/Router/error-handling.test.ts index f3921aa42b..87bc657628 100644 --- a/packages/event-handler/tests/unit/rest/Router/error-handling.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/error-handling.test.ts @@ -107,7 +107,7 @@ describe('Class: Router - Error Handling', () => { vi.stubEnv('POWERTOOLS_DEV', ''); const app = new Router(); - app.errorHandler(BadRequestError, async () => { + app.errorHandler(BadRequestError, () => { throw new Error('Handler failed'); }); @@ -486,7 +486,7 @@ describe('Class: Router - Error Handling', () => { // Prepare const app = new Router(); - app.errorHandler(BadRequestError, async () => { + app.errorHandler(BadRequestError, () => { throw new NotFoundError('This error is thrown from the error handler'); }); @@ -514,7 +514,7 @@ describe('Class: Router - Error Handling', () => { // Prepare const app = new Router(); - app.errorHandler(BadRequestError, async () => { + app.errorHandler(BadRequestError, () => { throw new MethodNotAllowedError( 'This error is thrown from the error handler' ); @@ -545,7 +545,7 @@ describe('Class: Router - Error Handling', () => { vi.stubEnv('POWERTOOLS_DEV', 'true'); const app = new Router(); - app.errorHandler(BadRequestError, async () => { + app.errorHandler(BadRequestError, () => { throw new Error('This error is thrown from the error handler'); }); diff --git a/packages/event-handler/tests/unit/rest/Router/middleware.test.ts b/packages/event-handler/tests/unit/rest/Router/middleware.test.ts index 4d66055914..93b6abc230 100644 --- a/packages/event-handler/tests/unit/rest/Router/middleware.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/middleware.test.ts @@ -57,7 +57,7 @@ describe('Class: Router - Middleware', () => { } ); - app.get(path as Path, middleware, async () => { + app.get(path as Path, middleware, () => { executionOrder.push('handler'); return { success: true }; }); @@ -79,7 +79,7 @@ describe('Class: Router - Middleware', () => { app.use(createTrackingMiddleware('middleware1', executionOrder)); app.use(createTrackingMiddleware('middleware2', executionOrder)); - app.get('/test', async () => { + app.get('/test', () => { executionOrder.push('handler'); return { success: true }; }); @@ -111,7 +111,7 @@ describe('Class: Router - Middleware', () => { ) ); - app.get('/test', async () => { + app.get('/test', () => { executionOrder.push('handler'); return { success: true }; }); @@ -190,7 +190,7 @@ describe('Class: Router - Middleware', () => { await next(); }); - app.use(async ({ next }) => { + app.use(({ next }) => { next(); }); @@ -221,7 +221,7 @@ describe('Class: Router - Middleware', () => { ); app.use(createTrackingMiddleware('middleware2', executionOrder)); - app.get('/test', async () => { + app.get('/test', () => { executionOrder.push('handler'); return { success: true }; }); @@ -249,7 +249,7 @@ describe('Class: Router - Middleware', () => { throw new Error('Cleanup error'); }); - app.get('/test', async () => { + app.get('/test', () => { executionOrder.push('handler'); return { success: true }; }); @@ -277,7 +277,7 @@ describe('Class: Router - Middleware', () => { app.use(createTrackingMiddleware('middleware1', executionOrder)); app.use(createTrackingMiddleware('middleware2', executionOrder)); - app.get('/test', async () => { + app.get('/test', () => { executionOrder.push('handler'); throw new Error('Handler error'); }); @@ -305,7 +305,7 @@ describe('Class: Router - Middleware', () => { app.use(createNoNextMiddleware('middleware1', executionOrder)); app.use(createTrackingMiddleware('middleware2', executionOrder)); - app.get('/test', async () => { + app.get('/test', () => { executionOrder.push('handler'); return { success: true }; }); @@ -334,7 +334,7 @@ describe('Class: Router - Middleware', () => { }) ); - app.get('/test', async () => { + app.get('/test', () => { executionOrder.push('handler'); return { success: true }; }); @@ -369,7 +369,7 @@ describe('Class: Router - Middleware', () => { reqCtx.res.headers.set('x-request-id', '12345'); }); - app.get('/test', async () => ({ success: true })); + app.get('/test', () => ({ success: true })); // Act const result = await app.resolve( @@ -457,7 +457,7 @@ describe('Class: Router - Middleware', () => { await next(); }); - app.get('/handler-precedence', async () => { + app.get('/handler-precedence', () => { const response = Response.json({ success: true }); response.headers.set('x-before-handler', 'handler-value'); return response; @@ -542,12 +542,12 @@ describe('Class: Router - Middleware', () => { public scope = 'class-scope'; @app.get('/test') - public async getTest() { + public getTest() { executionOrder.push('handler'); return { message: `${this.scope}: success` }; } - public async handler(event: unknown, _context: Context) { + public handler(event: unknown, _context: Context) { return app.resolve(event, _context, { scope: this }); } } @@ -586,7 +586,7 @@ describe('Class: Router - Middleware', () => { executionOrder ); - app.get('/test', [routeMiddleware], async () => { + app.get('/test', [routeMiddleware], () => { executionOrder.push('handler'); return { success: true }; }); @@ -619,7 +619,7 @@ describe('Class: Router - Middleware', () => { executionOrder ); - app.get('/test', [routeMiddleware1, routeMiddleware2], async () => { + app.get('/test', [routeMiddleware1, routeMiddleware2], () => { executionOrder.push('handler'); return { success: true }; }); @@ -646,7 +646,7 @@ describe('Class: Router - Middleware', () => { app.use(createTrackingMiddleware('global-middleware', executionOrder)); - app.get('/test', async () => { + app.get('/test', () => { executionOrder.push('handler'); return { success: true }; }); @@ -674,7 +674,7 @@ describe('Class: Router - Middleware', () => { new Response('Route middleware response', { status: 403 }) ); - app.get('/test', [routeMiddleware], async () => { + app.get('/test', [routeMiddleware], () => { executionOrder.push('handler'); return { success: true }; }); diff --git a/packages/event-handler/tests/unit/rest/converters.test.ts b/packages/event-handler/tests/unit/rest/converters.test.ts index e33c6136e6..e6f5a9a893 100644 --- a/packages/event-handler/tests/unit/rest/converters.test.ts +++ b/packages/event-handler/tests/unit/rest/converters.test.ts @@ -1,4 +1,3 @@ -import type { APIGatewayProxyEvent } from 'aws-lambda'; import { describe, expect, it } from 'vitest'; import { handlerResultToProxyResult, @@ -6,36 +5,11 @@ import { proxyEventToWebRequest, webResponseToProxyResult, } from '../../../src/rest/index.js'; +import { createTestEvent } from './helpers.js'; describe('Converters', () => { describe('proxyEventToWebRequest', () => { - const baseEvent: APIGatewayProxyEvent = { - httpMethod: 'GET', - path: '/test', - resource: '/test', - headers: {}, - multiValueHeaders: {}, - queryStringParameters: null, - multiValueQueryStringParameters: {}, - pathParameters: null, - stageVariables: null, - requestContext: { - accountId: '123456789012', - apiId: 'test-api', - httpMethod: 'GET', - path: '/test', - requestId: 'test-request-id', - resourceId: 'test-resource', - resourcePath: '/test', - stage: 'test', - domainName: 'api.example.com', - identity: { - sourceIp: '127.0.0.1', - }, - } as any, - isBase64Encoded: false, - body: null, - }; + const baseEvent = createTestEvent('/test', 'GET'); it('converts basic GET request', () => { // Prepare & Act @@ -65,25 +39,24 @@ describe('Converters', () => { it('uses X-Forwarded-Proto header for protocol', () => { // Prepare - const event = { - ...baseEvent, - headers: { 'X-Forwarded-Proto': 'https' }, - }; + const event = createTestEvent('/test', 'GET', { + 'X-Forwarded-Proto': 'http', + }); // Act const request = proxyEventToWebRequest(event); // Assess expect(request).toBeInstanceOf(Request); - expect(request.url).toBe('https://api.example.com/test'); + expect(request.url).toBe('http://api.example.com/test'); }); - it('handles null values in multiValueHeaders arrays', () => { + it('handles undefined values in multiValueHeaders arrays', () => { // Prepare const event = { ...baseEvent, multiValueHeaders: { - Accept: null as any, + Accept: undefined, 'Custom-Header': ['value1'], }, }; @@ -97,12 +70,12 @@ describe('Converters', () => { expect(request.headers.get('Custom-Header')).toBe('value1'); }); - it('handles null values in multiValueQueryStringParameters arrays', () => { + it('handles undefined values in multiValueQueryStringParameters arrays', () => { // Prepare const event = { ...baseEvent, multiValueQueryStringParameters: { - filter: null as any, + filter: undefined, sort: ['desc'], }, }; @@ -117,7 +90,7 @@ describe('Converters', () => { expect(url.searchParams.get('sort')).toBe('desc'); }); - it('handles POST request with string body', async () => { + it('handles POST request with string body', () => { // Prepare const event = { ...baseEvent, @@ -136,7 +109,7 @@ describe('Converters', () => { expect(request.headers.get('Content-Type')).toBe('application/json'); }); - it('decodes base64 encoded body', async () => { + it('decodes base64 encoded body', () => { // Prepare const originalText = 'Hello World'; const base64Text = Buffer.from(originalText).toString('base64'); @@ -321,13 +294,13 @@ describe('Converters', () => { expect(url.searchParams.getAll('multi')).toEqual(['value1', 'value2']); }); - it('skips null queryStringParameter values', () => { + it('skips undefined queryStringParameter values', () => { // Prepare const event = { ...baseEvent, queryStringParameters: { valid: 'value', - null: null as any, + null: undefined, }, }; @@ -341,13 +314,13 @@ describe('Converters', () => { expect(url.searchParams.has('null')).toBe(false); }); - it('skips null header values', () => { + it('skips undefined header values', () => { // Prepare const event = { ...baseEvent, headers: { 'Valid-Header': 'value', - 'Null-Header': null as any, + 'Undefined-Header': undefined, }, }; @@ -357,26 +330,7 @@ describe('Converters', () => { // Assess expect(request).toBeInstanceOf(Request); expect(request.headers.get('Valid-Header')).toBe('value'); - expect(request.headers.get('Null-Header')).toBe(null); - }); - - it('handles null/undefined collections', () => { - // Prepare - const event = { - ...baseEvent, - headers: null as any, - multiValueHeaders: null as any, - queryStringParameters: null as any, - multiValueQueryStringParameters: null as any, - }; - - // Act - const request = proxyEventToWebRequest(event); - - // Assess - expect(request).toBeInstanceOf(Request); - expect(request.method).toBe('GET'); - expect(request.url).toBe('https://api.example.com/test'); + expect(request.headers.get('Undefined-Header')).toBe(null); }); }); @@ -568,7 +522,7 @@ describe('Converters', () => { expect(result.headers.get('content-type')).toBe('text/plain'); }); - it('converts APIGatewayProxyResult with multiValueHeaders', async () => { + it('converts APIGatewayProxyResult with multiValueHeaders', () => { // Prepare const proxyResult = { statusCode: 200, @@ -590,7 +544,7 @@ describe('Converters', () => { ); }); - it('converts plain object to JSON Response with default headers', async () => { + it('converts plain object to JSON Response with default headers', () => { // Prepare const obj = { message: 'success' }; @@ -604,7 +558,7 @@ describe('Converters', () => { expect(result.headers.get('Content-Type')).toBe('application/json'); }); - it('uses provided headers for plain object', async () => { + it('uses provided headers for plain object', () => { // Prepare const obj = { message: 'success' }; const headers = new Headers({ 'x-custom': 'value' }); @@ -617,7 +571,7 @@ describe('Converters', () => { expect(result.headers.get('x-custom')).toBe('value'); }); - it('handles APIGatewayProxyResult with undefined headers', async () => { + it('handles APIGatewayProxyResult with undefined headers', () => { // Prepare const proxyResult = { statusCode: 200, @@ -634,7 +588,7 @@ describe('Converters', () => { expect(result.status).toBe(200); }); - it('handles APIGatewayProxyResult with undefined multiValueHeaders', async () => { + it('handles APIGatewayProxyResult with undefined multiValueHeaders', () => { // Prepare const proxyResult = { statusCode: 200, @@ -651,7 +605,7 @@ describe('Converters', () => { expect(result.headers.get('content-type')).toBe('text/plain'); }); - it('handles APIGatewayProxyResult with undefined values in multiValueHeaders', async () => { + it('handles APIGatewayProxyResult with undefined values in multiValueHeaders', () => { // Prepare const proxyResult = { statusCode: 200, diff --git a/packages/event-handler/tests/unit/rest/helpers.ts b/packages/event-handler/tests/unit/rest/helpers.ts index 4f04e0e3c1..aeb4e51c2d 100644 --- a/packages/event-handler/tests/unit/rest/helpers.ts +++ b/packages/event-handler/tests/unit/rest/helpers.ts @@ -19,7 +19,7 @@ export const createTestEvent = ( requestContext: { httpMethod, path, - domainName: 'localhost', + domainName: 'api.example.com', } as APIGatewayProxyEvent['requestContext'], resource: '', }); @@ -40,7 +40,7 @@ export const createThrowingMiddleware = ( executionOrder: string[], errorMessage: string ): Middleware => { - return async () => { + return () => { executionOrder.push(name); throw new Error(errorMessage); }; @@ -51,7 +51,7 @@ export const createReturningMiddleware = ( executionOrder: string[], response: HandlerResponse ): Middleware => { - return async () => { + return () => { executionOrder.push(name); return response; }; @@ -61,7 +61,7 @@ export const createNoNextMiddleware = ( name: string, executionOrder: string[] ): Middleware => { - return async () => { + return () => { executionOrder.push(name); // Intentionally doesn't call next() }; diff --git a/packages/event-handler/tests/unit/rest/middleware/compress.test.ts b/packages/event-handler/tests/unit/rest/middleware/compress.test.ts index 0aa8a1e289..653bb62afd 100644 --- a/packages/event-handler/tests/unit/rest/middleware/compress.test.ts +++ b/packages/event-handler/tests/unit/rest/middleware/compress.test.ts @@ -22,7 +22,7 @@ describe('Compress Middleware', () => { it('compresses response when conditions are met', async () => { // Prepare - app.get('/test', async () => { + app.get('/test', () => { return body; }); @@ -49,7 +49,7 @@ describe('Compress Middleware', () => { 'content-length': '1', }), ], - async () => { + () => { return { test: 'x' }; } ); @@ -65,7 +65,7 @@ describe('Compress Middleware', () => { it('skips compression for HEAD requests', async () => { // Prepare const headEvent = createTestEvent('/test', 'HEAD'); - app.head('/test', async () => { + app.head('/test', () => { return body; }); @@ -93,7 +93,7 @@ describe('Compress Middleware', () => { 'content-length': '2000', }), ], - async () => { + () => { return body; } ); @@ -118,7 +118,7 @@ describe('Compress Middleware', () => { 'cache-control': 'no-transform', }), ], - async () => { + () => { return body; } ); @@ -144,7 +144,7 @@ describe('Compress Middleware', () => { 'content-length': '2000', }), ], - async () => { + () => { return body; } ); @@ -162,7 +162,7 @@ describe('Compress Middleware', () => { const noCompressionEvent = createTestEvent('/test', 'GET', { 'Accept-Encoding': 'identity', }); - app.get('/test', async () => { + app.get('/test', () => { return body; }); diff --git a/packages/event-handler/tests/unit/rest/utils.test.ts b/packages/event-handler/tests/unit/rest/utils.test.ts index 50de2f4f03..927fae01eb 100644 --- a/packages/event-handler/tests/unit/rest/utils.test.ts +++ b/packages/event-handler/tests/unit/rest/utils.test.ts @@ -473,7 +473,7 @@ describe('Path Utilities', () => { const composed = composeMiddleware(middleware); await composed({ reqCtx: mockOptions, - next: async () => { + next: () => { executionOrder.push('handler'); }, }); @@ -492,7 +492,7 @@ describe('Path Utilities', () => { async ({ next }) => { await next(); }, - async () => { + () => { return { shortCircuit: true }; }, ]; @@ -500,7 +500,7 @@ describe('Path Utilities', () => { const composed = composeMiddleware(middleware); const result = await composed({ reqCtx: mockOptions, - next: async () => { + next: () => { return { handler: true }; }, }); @@ -518,7 +518,7 @@ describe('Path Utilities', () => { const composed = composeMiddleware(middleware); const result = await composed({ reqCtx: mockOptions, - next: async () => { + next: () => { return { handler: true }; }, }); @@ -545,7 +545,7 @@ describe('Path Utilities', () => { const composed = composeMiddleware([]); const result = await composed({ reqCtx: mockOptions, - next: async () => { + next: () => { return { handler: true }; }, }); @@ -563,7 +563,7 @@ describe('Path Utilities', () => { const composed = composeMiddleware(middleware); const result = await composed({ reqCtx: mockOptions, - next: async () => { + next: () => { return undefined; }, }); diff --git a/packages/event-handler/typedoc.json b/packages/event-handler/typedoc.json index 779f9ec709..4f7c48f0ed 100644 --- a/packages/event-handler/typedoc.json +++ b/packages/event-handler/typedoc.json @@ -4,6 +4,7 @@ "./src/appsync-events/index.ts", "./src/appsync-graphql/index.ts", "./src/bedrock-agent/index.ts", + "./src/rest/index.ts", "./src/types/index.ts" ], "readme": "README.md" diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index 0e8b845fae..9f106dc7b9 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -23,6 +23,7 @@ "build": "npm run build:esm & npm run build:cjs", "lint": "biome lint .", "lint:fix": "biome check --write .", + "lint:ci": "biome ci .", "prepack": "node ../../.github/scripts/release_patch_package_json.js ." }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/idempotency#readme", diff --git a/packages/idempotency/src/IdempotencyHandler.ts b/packages/idempotency/src/IdempotencyHandler.ts index c5d5e4ee6b..96505222b7 100644 --- a/packages/idempotency/src/IdempotencyHandler.ts +++ b/packages/idempotency/src/IdempotencyHandler.ts @@ -383,20 +383,20 @@ export class IdempotencyHandler { if (error.name === 'IdempotencyItemAlreadyExistsError') { let idempotencyRecord = (error as IdempotencyItemAlreadyExistsError) .existingRecord; - if (idempotencyRecord !== undefined) { - // If the error includes the existing record, we can use it to validate - // the record being processed and cache it in memory. - idempotencyRecord = this.#persistenceStore.processExistingRecord( - idempotencyRecord, - this.#functionPayloadToBeHashed - ); + if (idempotencyRecord === undefined) { // If the error doesn't include the existing record, we need to fetch // it from the persistence layer. In doing so, we also call the processExistingRecord // method to validate the record and cache it in memory. - } else { idempotencyRecord = await this.#persistenceStore.getRecord( this.#functionPayloadToBeHashed ); + } else { + // If the error includes the existing record, we can use it to validate + // the record being processed and cache it in memory. + idempotencyRecord = this.#persistenceStore.processExistingRecord( + idempotencyRecord, + this.#functionPayloadToBeHashed + ); } returnValue.isIdempotent = true; diff --git a/packages/idempotency/src/idempotencyDecorator.ts b/packages/idempotency/src/idempotencyDecorator.ts index 968b3bd10e..ba9e63effa 100644 --- a/packages/idempotency/src/idempotencyDecorator.ts +++ b/packages/idempotency/src/idempotencyDecorator.ts @@ -70,7 +70,7 @@ const idempotent = ( ) { const childFunction = descriptor.value; - descriptor.value = async function (this: Handler, ...args: unknown[]) { + descriptor.value = function (this: Handler, ...args: unknown[]) { return makeIdempotent(childFunction, options).bind(this)(...args); }; diff --git a/packages/idempotency/src/makeIdempotent.ts b/packages/idempotency/src/makeIdempotent.ts index 46ed2b09c7..2e6e9b274f 100644 --- a/packages/idempotency/src/makeIdempotent.ts +++ b/packages/idempotency/src/makeIdempotent.ts @@ -51,7 +51,7 @@ const isOptionsWithDataIndexArgument = ( * * By default, the entire first argument is hashed to create the idempotency key. You can customize this behavior: * - Use {@link IdempotencyConfig.eventKeyJmesPath | `eventKeyJmesPath`} to hash only a subset of the payload - * - Use {@link ItempotentFunctionOptions.dataIndexArgument | `dataIndexArgument`} to hash a different function argument + * - Use {@link ItempotentFunctionOptions | `ItempotentFunctionOptions`}`.dataIndexArgument` to hash a different function argument * * * **Using a subset of the payload** diff --git a/packages/idempotency/src/middleware/makeHandlerIdempotent.ts b/packages/idempotency/src/middleware/makeHandlerIdempotent.ts index d48dcc221d..0d75c65ab0 100644 --- a/packages/idempotency/src/middleware/makeHandlerIdempotent.ts +++ b/packages/idempotency/src/middleware/makeHandlerIdempotent.ts @@ -112,7 +112,7 @@ const makeHandlerIdempotent = ( * * @param request - The Middy request object */ - const before = async (request: MiddyLikeRequest): Promise => { + const before = (request: MiddyLikeRequest): unknown => { const idempotencyConfig = options.config ? options.config : new IdempotencyConfig({}); diff --git a/packages/idempotency/src/persistence/DynamoDBPersistenceLayer.ts b/packages/idempotency/src/persistence/DynamoDBPersistenceLayer.ts index 4e88f99b51..6dfbeb63f5 100644 --- a/packages/idempotency/src/persistence/DynamoDBPersistenceLayer.ts +++ b/packages/idempotency/src/persistence/DynamoDBPersistenceLayer.ts @@ -88,13 +88,13 @@ class DynamoDBPersistenceLayer extends BasePersistenceLayer { config.staticPkValue ?? `idempotency#${this.idempotencyKeyPrefix}`; if (config.awsSdkV3Client) { - if (!isSdkClient(config.awsSdkV3Client)) { + if (isSdkClient(config.awsSdkV3Client)) { + this.client = config.awsSdkV3Client; + } else { console.warn( 'awsSdkV3Client is not an AWS SDK v3 client, using default client' ); this.client = new DynamoDBClient(config.clientConfig ?? {}); - } else { - this.client = config.awsSdkV3Client; } } else { this.client = new DynamoDBClient(config.clientConfig ?? {}); @@ -168,9 +168,9 @@ class DynamoDBPersistenceLayer extends BasePersistenceLayer { * | (in_progress_expiry) (expiry) * * Conditions to successfully save a record: - * * The idempotency key does not exist: - * - first time that this invocation key is used - * - previous invocation with the same key was deleted due to TTL + * - The idempotency key does not exist: + * - first time that this invocation key is used + * - previous invocation with the same key was deleted due to TTL */ const idempotencyKeyDoesNotExist = 'attribute_not_exists(#id)'; // * The idempotency key exists but it is expired diff --git a/packages/idempotency/src/types/IdempotencyOptions.ts b/packages/idempotency/src/types/IdempotencyOptions.ts index 4c48e25579..e586764646 100644 --- a/packages/idempotency/src/types/IdempotencyOptions.ts +++ b/packages/idempotency/src/types/IdempotencyOptions.ts @@ -10,8 +10,6 @@ import type { IdempotencyRecord } from '../persistence/IdempotencyRecord.js'; * * When making a function idempotent you should always set a persistence store. * - * @see {@link persistence/DynamoDBPersistenceLayer.DynamoDBPersistenceLayer | DynamoDBPersistenceLayer} - * * Optionally, you can also pass a custom configuration object, * this allows you to customize the behavior of the idempotency utility. * diff --git a/packages/idempotency/tests/e2e/idempotentDecorator.test.FunctionCode.ts b/packages/idempotency/tests/e2e/idempotentDecorator.test.FunctionCode.ts index 9063d652cd..e4bb5205e9 100644 --- a/packages/idempotency/tests/e2e/idempotentDecorator.test.FunctionCode.ts +++ b/packages/idempotency/tests/e2e/idempotentDecorator.test.FunctionCode.ts @@ -2,7 +2,7 @@ import type { LambdaInterface } from '@aws-lambda-powertools/commons/types'; import { Logger } from '@aws-lambda-powertools/logger'; import type { Context } from 'aws-lambda'; import { IdempotencyConfig } from '../../src/IdempotencyConfig.js'; -import { idempotent } from '../../src/idempotencyDecorator'; +import { idempotent } from '../../src/idempotencyDecorator.js'; import { DynamoDBPersistenceLayer } from '../../src/persistence/DynamoDBPersistenceLayer.js'; const IDEMPOTENCY_TABLE_NAME = @@ -35,19 +35,13 @@ class DefaultLambda implements LambdaInterface { logger.info(`${this.message} ${JSON.stringify(_event)}`); // sleep to enforce error with parallel execution await new Promise((resolve) => setTimeout(resolve, 1000)); - - // We return void to test that the utility handles it correctly - return; } @idempotent({ persistenceStore: dynamoDBPersistenceLayerCustomized, config: config, }) - public async handlerCustomized( - event: { foo: string }, - context: Context - ): Promise { + public handlerCustomized(event: { foo: string }, context: Context) { config.registerLambdaContext(context); logger.info('Processed event', { details: event.foo }); @@ -62,10 +56,10 @@ class DefaultLambda implements LambdaInterface { eventKeyJmesPath: 'foo', }), }) - public async handlerExpired( + public handlerExpired( event: { foo: string; invocation: number }, context: Context - ): Promise<{ foo: string; invocation: number }> { + ) { logger.addContext(context); logger.info('Processed event', { details: event.foo }); @@ -77,10 +71,7 @@ class DefaultLambda implements LambdaInterface { } @idempotent({ persistenceStore: dynamoDBPersistenceLayer }) - public async handlerParallel( - event: { foo: string }, - context: Context - ): Promise { + public async handlerParallel(event: { foo: string }, context: Context) { logger.addContext(context); await new Promise((resolve) => setTimeout(resolve, 1500)); @@ -99,7 +90,7 @@ class DefaultLambda implements LambdaInterface { public async handlerTimeout( event: { foo: string; invocation: number }, context: Context - ): Promise<{ foo: string; invocation: number }> { + ) { logger.addContext(context); if (event.invocation === 0) { @@ -130,12 +121,9 @@ const handlerExpired = defaultLambda.handlerExpired.bind(defaultLambda); const logger = new Logger(); class LambdaWithKeywordArgument implements LambdaInterface { - public async handler( - event: { id: string }, - _context: Context - ): Promise { + public handler(event: { id: string }, _context: Context) { config.registerLambdaContext(_context); - await this.process(event.id, 'bar'); + this.process(event.id, 'bar'); return 'Hello World Keyword Argument'; } @@ -145,7 +133,7 @@ class LambdaWithKeywordArgument implements LambdaInterface { config: config, dataIndexArgument: 1, }) - public async process(id: string, foo: string): Promise { + public process(id: string, foo: string) { logger.info('Got test event', { id, foo }); return `idempotent result: ${foo}`; diff --git a/packages/idempotency/tests/e2e/makeHandlerIdempotent.test.FunctionCode.ts b/packages/idempotency/tests/e2e/makeHandlerIdempotent.test.FunctionCode.ts index 6ade59d2ef..62f132e8bb 100644 --- a/packages/idempotency/tests/e2e/makeHandlerIdempotent.test.FunctionCode.ts +++ b/packages/idempotency/tests/e2e/makeHandlerIdempotent.test.FunctionCode.ts @@ -16,14 +16,12 @@ const logger = new Logger(); /** * Test handler with sequential execution. */ -export const handler = middy( - async (event: { foo: string }, context: Context) => { - logger.addContext(context); - logger.info('foo', { details: event.foo }); +export const handler = middy((event: { foo: string }, context: Context) => { + logger.addContext(context); + logger.info('foo', { details: event.foo }); - return event.foo; - } -).use( + return event.foo; +}).use( makeHandlerIdempotent({ persistenceStore: dynamoDBPersistenceLayer, }) @@ -97,7 +95,7 @@ export const handlerTimeout = middy( * was processed by looking at the value in the stored idempotency record. */ export const handlerExpired = middy( - async (event: { foo: string; invocation: number }, context: Context) => { + (event: { foo: string; invocation: number }, context: Context) => { logger.addContext(context); logger.info('Processed event', { details: event.foo }); diff --git a/packages/idempotency/tests/e2e/makeHandlerIdempotent.test.ts b/packages/idempotency/tests/e2e/makeHandlerIdempotent.test.ts index 0c379b5f4e..21e53fde0e 100644 --- a/packages/idempotency/tests/e2e/makeHandlerIdempotent.test.ts +++ b/packages/idempotency/tests/e2e/makeHandlerIdempotent.test.ts @@ -192,15 +192,13 @@ describe('Idempotency E2E tests, middy middleware usage', () => { * We filter the logs to find which one was successful and which one failed, then we check * that they contain the expected logs. */ - const successfulInvocationLogs = functionLogs.find( - (functionLog) => - functionLog.find((log) => log.includes('Processed event')) !== undefined + const successfulInvocationLogs = functionLogs.find((functionLog) => + functionLog.some((log) => log.includes('Processed event')) ); - const failedInvocationLogs = functionLogs.find( - (functionLog) => - functionLog.find((log) => - log.includes('There is already an execution in progress') - ) !== undefined + const failedInvocationLogs = functionLogs.find((functionLog) => + functionLog.some((log) => + log.includes('There is already an execution in progress') + ) ); expect(successfulInvocationLogs).toHaveLength(1); expect(failedInvocationLogs).toHaveLength(1); diff --git a/packages/idempotency/tests/e2e/makeIdempotent.test.FunctionCode.ts b/packages/idempotency/tests/e2e/makeIdempotent.test.FunctionCode.ts index 10e2ce5f73..b35b4444dc 100644 --- a/packages/idempotency/tests/e2e/makeIdempotent.test.FunctionCode.ts +++ b/packages/idempotency/tests/e2e/makeIdempotent.test.FunctionCode.ts @@ -90,7 +90,7 @@ export const handlerCustomized = async ( * Test idempotent Lambda handler with JMESPath expression to extract event key. */ export const handlerLambda = makeIdempotent( - async (event: { body: string }, context: Context) => { + (event: { body: string }, context: Context) => { logger.addContext(context); const body = JSON.parse(event.body); logger.info('foo', { details: body.foo }); diff --git a/packages/idempotency/tests/unit/IdempotencyConfig.test.ts b/packages/idempotency/tests/unit/IdempotencyConfig.test.ts index 8174c7727d..4aec6d0927 100644 --- a/packages/idempotency/tests/unit/IdempotencyConfig.test.ts +++ b/packages/idempotency/tests/unit/IdempotencyConfig.test.ts @@ -87,7 +87,7 @@ describe('Class: IdempotencyConfig', () => { }); describe('Method: registerLambdaContext', () => { - it('stores the provided context', async () => { + it('stores the provided context', () => { // Prepare const config = new IdempotencyConfig({}); diff --git a/packages/idempotency/tests/unit/IdempotencyHandler.test.ts b/packages/idempotency/tests/unit/IdempotencyHandler.test.ts index ebcdbddf59..2481314dc1 100644 --- a/packages/idempotency/tests/unit/IdempotencyHandler.test.ts +++ b/packages/idempotency/tests/unit/IdempotencyHandler.test.ts @@ -68,7 +68,7 @@ describe('Class IdempotencyHandler', () => { }, ])( 'throws when the record is in progress and within expiry window ($case)', - async ({ keys, expectedErrorMsg }) => { + ({ keys, expectedErrorMsg }) => { // Prepare const stubRecord = new IdempotencyRecord({ ...keys, @@ -89,7 +89,7 @@ describe('Class IdempotencyHandler', () => { } ); - it('throws when the record is in progress and outside expiry window', async () => { + it('throws when the record is in progress and outside expiry window', () => { // Prepare const stubRecord = new IdempotencyRecord({ idempotencyKey: 'idempotencyKey', @@ -109,7 +109,7 @@ describe('Class IdempotencyHandler', () => { expect(mockResponseHook).not.toHaveBeenCalled(); }); - it('throws when the idempotency record is expired', async () => { + it('throws when the idempotency record is expired', () => { // Prepare const stubRecord = new IdempotencyRecord({ idempotencyKey: 'idempotencyKey', diff --git a/packages/idempotency/tests/unit/deepSort.test.ts b/packages/idempotency/tests/unit/deepSort.test.ts index e37c6c6d91..057643ab52 100644 --- a/packages/idempotency/tests/unit/deepSort.test.ts +++ b/packages/idempotency/tests/unit/deepSort.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { deepSort } from '../../src/deepSort'; +import { deepSort } from '../../src/deepSort.js'; describe('Function: deepSort', () => { it('can sort string correctly', () => { diff --git a/packages/idempotency/tests/unit/idempotencyDecorator.test.ts b/packages/idempotency/tests/unit/idempotencyDecorator.test.ts index b153c01418..4954f8aba5 100644 --- a/packages/idempotency/tests/unit/idempotencyDecorator.test.ts +++ b/packages/idempotency/tests/unit/idempotencyDecorator.test.ts @@ -1,3 +1,4 @@ +import { setTimeout } from 'node:timers/promises'; import type { LambdaInterface } from '@aws-lambda-powertools/commons/types'; import context from '@aws-lambda-powertools/testing-utils/context'; import type { Context } from 'aws-lambda'; @@ -15,10 +16,8 @@ describe('Given a class with a function to decorate', () => { @idempotent({ persistenceStore: new PersistenceLayerTestClass(), }) - public async handler( - _event: unknown, - _context: Context - ): Promise { + public async handler(_event: unknown, _context: Context) { + await setTimeout(0); // Simulate some async operation return this.privateMethod(); } @@ -37,7 +36,7 @@ describe('Given a class with a function to decorate', () => { expect(result).toBe('private foo'); }); - it('passes the custom keyPrefix to the persistenceStore', async () => { + it('passes the custom keyPrefix to the persistenceStore', () => { // Prepare const configureSpy = vi.spyOn(BasePersistenceLayer.prototype, 'configure'); const idempotencyConfig = new IdempotencyConfig({}); @@ -48,10 +47,7 @@ describe('Given a class with a function to decorate', () => { config: idempotencyConfig, keyPrefix: 'my-custom-prefix', }) - public async handler( - _event: unknown, - _context: Context - ): Promise { + public handler(_event: unknown, _context: Context) { return true; } } @@ -60,7 +56,7 @@ describe('Given a class with a function to decorate', () => { const handler = handlerClass.handler.bind(handlerClass); // Act - const result = await handler({}, context); + const result = handler({}, context); // Assess expect(result).toBeTruthy(); diff --git a/packages/idempotency/tests/unit/makeIdempotent.test.ts b/packages/idempotency/tests/unit/makeIdempotent.test.ts index bc567d452f..1c8a15e99b 100644 --- a/packages/idempotency/tests/unit/makeIdempotent.test.ts +++ b/packages/idempotency/tests/unit/makeIdempotent.test.ts @@ -20,7 +20,7 @@ const mockIdempotencyOptions = { }; const remainingTImeInMillis = 1234; const fnSuccessfull = async () => true; -const fnError = async () => { +const fnError = () => { throw new Error('Something went wrong'); }; @@ -525,7 +525,7 @@ describe('Function: makeIdempotent', () => { it('throws immediately if an object other than an error was thrown (wrapper)', async () => { // Prepare - const fn = async (_event: unknown, _context: Context) => { + const fn = (_event: unknown, _context: Context) => { throw 'a string'; }; const handler = makeIdempotent(fn, mockIdempotencyOptions); diff --git a/packages/idempotency/tests/unit/persistence/DynamoDbPersistenceLayer.test.ts b/packages/idempotency/tests/unit/persistence/DynamoDbPersistenceLayer.test.ts index f786774cbb..35121122e3 100644 --- a/packages/idempotency/tests/unit/persistence/DynamoDbPersistenceLayer.test.ts +++ b/packages/idempotency/tests/unit/persistence/DynamoDbPersistenceLayer.test.ts @@ -149,7 +149,7 @@ describe('Class: DynamoDBPersistenceLayer', () => { ); }); - it('falls back on a new SDK client and logs a warning when an unknown object is provided instead of a client', async () => { + it('falls back on a new SDK client and logs a warning when an unknown object is provided instead of a client', () => { // Act const persistenceLayer = new DynamoDBPersistenceLayerTestClass({ tableName: dummyTableName, @@ -424,7 +424,7 @@ describe('Class: DynamoDBPersistenceLayer', () => { expiryTimestamp: 0, inProgressExpiryTimestamp: 0, }); - client.on(PutItemCommand).rejects(new Error()); + client.on(PutItemCommand).rejects(new Error('some error')); // Act & Assess await expect(persistenceLayer._putRecord(record)).rejects.toThrow(); @@ -576,7 +576,7 @@ describe('Class: DynamoDBPersistenceLayer', () => { }); }); - it('updates the item when the response_data is undefined', async () => { + it('updates the item when the response_data is undefined', () => { // Prepare const status = IdempotencyRecordStatus.EXPIRED; const expiryTimestamp = Date.now(); diff --git a/packages/idempotency/vitest.config.ts b/packages/idempotency/vitest.config.ts index baa5cf7463..e962bb6d1c 100644 --- a/packages/idempotency/vitest.config.ts +++ b/packages/idempotency/vitest.config.ts @@ -4,7 +4,7 @@ export default defineProject({ test: { environment: 'node', setupFiles: ['../testing/src/setupEnv.ts'], - hookTimeout: 1_000 * 60 * 10, // 10 minutes - testTimeout: 1_000 * 60 * 3, // 3 minutes + hookTimeout: 1000 * 60 * 10, // 10 minutes + testTimeout: 1000 * 60 * 3, // 3 minutes }, }); diff --git a/packages/jmespath/package.json b/packages/jmespath/package.json index 1c90f14c3e..09469107d8 100644 --- a/packages/jmespath/package.json +++ b/packages/jmespath/package.json @@ -20,6 +20,7 @@ "build": "npm run build:esm & npm run build:cjs", "lint": "biome lint .", "lint:fix": "biome check --write .", + "lint:ci": "biome ci .", "prepack": "node ../../.github/scripts/release_patch_package_json.js ." }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript", diff --git a/packages/jmespath/src/Expression.ts b/packages/jmespath/src/Expression.ts index 94c69ef3c4..8c7919151f 100644 --- a/packages/jmespath/src/Expression.ts +++ b/packages/jmespath/src/Expression.ts @@ -16,9 +16,8 @@ class Expression { /** * Evaluate the expression against a JSON value. * - * @param value The JSON value to apply the expression to. - * @param node The node to visit. - * @returns The result of applying the expression to the value. + * @param value - The JSON value to apply the expression to. + * @param node - The node to visit. */ public visit(value: JSONObject, node?: Node): JSONObject { return this.#interpreter.visit(node ?? this.#expression, value); diff --git a/packages/jmespath/src/Functions.ts b/packages/jmespath/src/Functions.ts index 9b012dff08..5773c73b55 100644 --- a/packages/jmespath/src/Functions.ts +++ b/packages/jmespath/src/Functions.ts @@ -56,7 +56,7 @@ class Functions { /** * Get the absolute value of the provided number. * - * @param args The number to get the absolute value of + * @param args - The number to get the absolute value of */ @Functions.signature({ argumentsSpecs: [['number']] }) public funcAbs(args: number): number { @@ -66,7 +66,7 @@ class Functions { /** * Calculate the average of the numbers in the provided array. * - * @param args The numbers to average + * @param args - The numbers to average */ @Functions.signature({ argumentsSpecs: [['array-number']], @@ -78,7 +78,7 @@ class Functions { /** * Get the ceiling of the provided number. * - * @param args The number to get the ceiling of + * @param args - The number to get the ceiling of */ @Functions.signature({ argumentsSpecs: [['number']] }) public funcCeil(args: number): number { @@ -88,8 +88,8 @@ class Functions { /** * Determine if the given value is contained in the provided array or string. * - * @param haystack The array or string to check - * @param needle The value to check for + * @param haystack - The array or string to check + * @param needle - The value to check for */ @Functions.signature({ argumentsSpecs: [['array', 'string'], ['any']], @@ -101,8 +101,8 @@ class Functions { /** * Determines if the provided string ends with the provided suffix. * - * @param str The string to check - * @param suffix The suffix to check for + * @param str - The string to check + * @param suffix - The suffix to check for */ @Functions.signature({ argumentsSpecs: [['string'], ['string']], @@ -114,7 +114,7 @@ class Functions { /** * Get the floor of the provided number. * - * @param args The number to get the floor of + * @param args - The number to get the floor of */ @Functions.signature({ argumentsSpecs: [['number']] }) public funcFloor(args: number): number { @@ -124,8 +124,8 @@ class Functions { /** * Join the provided array into a single string. * - * @param separator The separator to use - * @param items The array of itmes to join + * @param separator - The separator to use + * @param items - The array of itmes to join */ @Functions.signature({ argumentsSpecs: [['string'], ['array-string']], @@ -137,7 +137,7 @@ class Functions { /** * Get the keys of the provided object. * - * @param arg The object to get the keys of + * @param arg - The object to get the keys of */ @Functions.signature({ argumentsSpecs: [['object']], @@ -149,7 +149,7 @@ class Functions { /** * Get the number of items in the provided item. * - * @param arg The array to get the length of + * @param arg - The array to get the length of */ @Functions.signature({ argumentsSpecs: [['array', 'string', 'object']], @@ -166,8 +166,8 @@ class Functions { /** * Map the provided function over the provided array. * - * @param expression The expression to map over the array - * @param args The array to map the expression over + * @param expression - The expression to map over the array + * @param args - The array to map the expression over */ @Functions.signature({ argumentsSpecs: [['any'], ['array']], @@ -184,7 +184,7 @@ class Functions { /** * Get the maximum value in the provided array. * - * @param arg The array to get the maximum value of + * @param arg - The array to get the maximum value of */ @Functions.signature({ argumentsSpecs: [['array-number', 'array-string']], @@ -204,8 +204,8 @@ class Functions { /** * Get the item in the provided array that has the maximum value when the provided expression is evaluated. * - * @param args The array of items to get the maximum value of - * @param expression The expression to evaluate for each item in the array + * @param args - The array of items to get the maximum value of + * @param expression - The expression to evaluate for each item in the array */ @Functions.signature({ argumentsSpecs: [['array'], ['expression']], @@ -252,7 +252,7 @@ class Functions { * * Note that this is a shallow merge and will not merge nested objects. * - * @param args The objects to merge + * @param args - The objects to merge */ @Functions.signature({ argumentsSpecs: [['object']], @@ -266,7 +266,7 @@ class Functions { /** * Get the minimum value in the provided array. * - * @param arg The array to get the minimum value of + * @param arg - The array to get the minimum value of */ @Functions.signature({ argumentsSpecs: [['array-number', 'array-string']], @@ -285,8 +285,8 @@ class Functions { /** * Get the item in the provided array that has the minimum value when the provided expression is evaluated. * - * @param args The array of items to get the minimum value of - * @param expression The expression to evaluate for each item in the array + * @param args - The array of items to get the minimum value of + * @param expression - The expression to evaluate for each item in the array */ @Functions.signature({ argumentsSpecs: [['array'], ['expression']], @@ -332,7 +332,7 @@ class Functions { * Get the first argument that does not evaluate to null. * If all arguments evaluate to null, then null is returned. * - * @param args The keys of the items to check + * @param args - The keys of the items to check */ @Functions.signature({ argumentsSpecs: [[]], @@ -345,7 +345,7 @@ class Functions { /** * Reverses the provided string or array. * - * @param arg The string or array to reverse + * @param arg - The string or array to reverse */ @Functions.signature({ argumentsSpecs: [['string', 'array']], @@ -359,7 +359,7 @@ class Functions { /** * Sort the provided array. * - * @param arg The array to sort + * @param arg - The array to sort */ @Functions.signature({ argumentsSpecs: [['array-number', 'array-string']], @@ -382,8 +382,8 @@ class Functions { /** * Sort the provided array by the provided expression. * - * @param args The array to sort - * @param expression The expression to sort by + * @param args - The array to sort + * @param expression - The expression to sort by */ @Functions.signature({ argumentsSpecs: [['array'], ['expression']], @@ -426,8 +426,8 @@ class Functions { /** * Determines if the provided string starts with the provided prefix. * - * @param str The string to check - * @param prefix The prefix to check for + * @param str - The string to check + * @param prefix - The prefix to check for */ @Functions.signature({ argumentsSpecs: [['string'], ['string']], @@ -439,7 +439,7 @@ class Functions { /** * Sum the provided numbers. * - * @param args The numbers to sum + * @param args - The numbers to sum */ @Functions.signature({ argumentsSpecs: [['array-number']], @@ -454,7 +454,7 @@ class Functions { * If the provided value is an array, then it is returned. * Otherwise, the value is wrapped in an array and returned. * - * @param arg The items to convert to an array + * @param arg - The items to convert to an array */ @Functions.signature({ argumentsSpecs: [['any']], @@ -473,7 +473,7 @@ class Functions { * * If the value cannot be converted to a number, then null is returned. * - * @param arg The value to convert to a number + * @param arg - The value to convert to a number */ @Functions.signature({ argumentsSpecs: [['any']], @@ -496,7 +496,7 @@ class Functions { * If the provided value is a string, then it is returned. * Otherwise, the value is converted to a string and returned. * - * @param arg The value to convert to a string + * @param arg - The value to convert to a string */ @Functions.signature({ argumentsSpecs: [['any']], @@ -508,7 +508,7 @@ class Functions { /** * Get the type of the provided value. * - * @param arg The value to check the type of + * @param arg - The value to check the type of */ @Functions.signature({ argumentsSpecs: [['any']], @@ -520,7 +520,7 @@ class Functions { /** * Get the values of the provided object. * - * @param arg The object to get the values of + * @param arg - The object to get the values of */ @Functions.signature({ argumentsSpecs: [['object']], @@ -544,7 +544,7 @@ class Functions { * to the `methods` set. Finally, when the recursion collects back to the current instance, * it adds the collected methods to the `this.methods` set so that they can be accessed later. * - * @param scope The scope of the class instance to introspect + * @param scope - The scope of the class instance to introspect */ public introspectMethods(scope?: Functions): Set { const prototype = Object.getPrototypeOf(this); @@ -598,7 +598,7 @@ class Functions { * } * ``` * - * @param options The options for the signature decorator + * @param options - The options for the signature decorator */ public static signature( options: FunctionSignatureOptions diff --git a/packages/jmespath/src/Lexer.ts b/packages/jmespath/src/Lexer.ts index 9136311888..7e83ca7b4e 100644 --- a/packages/jmespath/src/Lexer.ts +++ b/packages/jmespath/src/Lexer.ts @@ -55,7 +55,7 @@ class Lexer { const buff = this.#consumeNumber(); yield { type: 'number', - value: Number.parseInt(buff), + value: Number.parseInt(buff, 10), start: start, end: start + buff.length, }; @@ -155,7 +155,7 @@ class Lexer { if (buff.length > 1) { return { type: 'number', - value: Number.parseInt(buff), + value: Number.parseInt(buff, 10), start: start, end: start + buff.length, }; diff --git a/packages/jmespath/src/ParsedResult.ts b/packages/jmespath/src/ParsedResult.ts index c5436fabd1..02c0481592 100644 --- a/packages/jmespath/src/ParsedResult.ts +++ b/packages/jmespath/src/ParsedResult.ts @@ -19,8 +19,8 @@ class ParsedResult { /** * Perform a JMESPath search on a JSON value. * - * @param value The JSON value to search - * @param options The parsing options to use + * @param value - The JSON value to search + * @param options - The parsing options to use */ public search(value: JSONObject, options?: JMESPathParsingOptions): unknown { const interpreter = new TreeInterpreter(options); diff --git a/packages/jmespath/src/Parser.ts b/packages/jmespath/src/Parser.ts index c576d5ee2b..69d8c94d55 100644 --- a/packages/jmespath/src/Parser.ts +++ b/packages/jmespath/src/Parser.ts @@ -32,7 +32,6 @@ import type { Node, Token } from './types.js'; /** * Top down operator precedence parser for JMESPath. * - * ## References * The implementation of this Parser is based on the implementation of * [jmespath.py](https://github.com/jmespath/jmespath.py/), which in turn * is based on [Vaughan R. Pratt's "Top Down Operator Precedence"](http://dl.acm.org/citation.cfm?doid=512927.512931). @@ -72,7 +71,7 @@ class Parser { * The AST is cached, so if you parse the same expression multiple times, * the AST will be returned from the cache. * - * @param expression The JMESPath expression to parse. + * @param expression - The JMESPath expression to parse. */ public parse(expression: string): ParsedResult { const cached = this.#cache[expression]; @@ -98,7 +97,7 @@ class Parser { /** * Do the actual parsing of the expression. * - * @param expression The JMESPath expression to parse. + * @param expression - The JMESPath expression to parse. */ #doParse(expression: string): ParsedResult { try { @@ -153,7 +152,7 @@ class Parser { * Get the nud function for a token. This is the function that * is called when a token is found at the beginning of an expression. * - * @param tokenType The type of token to get the nud function for. + * @param tokenType - The type of token to get the nud function for. */ #getNudFunction(token: Token): Node { const { type: tokenType } = token; @@ -194,7 +193,7 @@ class Parser { * * @example s."foo" * - * @param token The token to process + * @param token - The token to process */ #processQuotedIdentifier(token: Token): Node { const fieldValue = field(token.value); @@ -288,7 +287,7 @@ class Parser { * A default token is a syntax that allows you to access * elements in a list or dictionary. * - * @param token The token to process + * @param token - The token to process */ #processDefaultToken(token: Token): Node { if (token.type === 'eof') { @@ -309,8 +308,8 @@ class Parser { * Get the led function for a token. This is the function that * is called when a token is found in the middle of an expression. * - * @param tokenType The type of token to get the led function for. - * @param leftNode The left hand side of the expression. + * @param tokenType - The type of token to get the led function for. + * @param leftNode - The left hand side of the expression. */ #getLedFunction(tokenType: Token['type'], leftNode: Node): Node { switch (tokenType) { @@ -350,7 +349,7 @@ class Parser { * * @example foo.bar * - * @param leftNode The left hand side of the expression. + * @param leftNode - The left hand side of the expression. */ #processDotToken(leftNode: Node): Node { if (this.#currentToken() !== 'star') { @@ -377,7 +376,7 @@ class Parser { * * @example foo | bar * - * @param leftNode The left hand side of the expression. + * @param leftNode - The left hand side of the expression. */ #processPipeToken(leftNode: Node): Node { const right = this.#expression(BINDING_POWER.pipe); @@ -393,7 +392,7 @@ class Parser { * * @example foo || bar * - * @param leftNode The left hand side of the expression. + * @param leftNode - The left hand side of the expression. */ #processOrToken(leftNode: Node): Node { const right = this.#expression(BINDING_POWER.or); @@ -409,7 +408,7 @@ class Parser { * * @example foo && bar * - * @param leftNode The left hand side of the expression. + * @param leftNode - The left hand side of the expression. */ #processAndToken(leftNode: Node): Node { const right = this.#expression(BINDING_POWER.and); @@ -417,6 +416,11 @@ class Parser { return andExpression(leftNode, right); } + /** + * Process a left parenthesis token. + * + * @param leftNode - The left hand side of the expression. + */ #processLParenToken(leftNode: Node): Node { const name = leftNode.value as string; const args = []; @@ -432,6 +436,11 @@ class Parser { return functionExpression(name, args); } + /** + * Process a filter token. + * + * @param leftNode - The left hand side of the expression. + */ #processFilterToken(leftNode: Node): Node { // Filters are projections const condition = this.#expression(0); @@ -446,6 +455,11 @@ class Parser { return filterProjection(leftNode, right, condition); } + /** + * Process a projection right hand side. + * + * @param leftNode - The left hand side of the expression. + */ #processFlattenToken(leftNode: Node): Node { const left = flatten(leftNode); const right = this.#parseProjectionRhs(BINDING_POWER.flatten); @@ -453,6 +467,11 @@ class Parser { return projection(left, right); } + /** + * Process a left bracket token. + * + * @param leftNode - The left hand side of the expression. + */ #processLBracketToken(leftNode: Node): Node { const token = this.#lookaheadToken(0); if (['number', 'colon'].includes(token.type)) { @@ -485,7 +504,7 @@ class Parser { * the error occurred, the value of the token that caused * the error, the type of the token, and an optional reason. * - * @param options The options to use when throwing the error. + * @param options - The options to use when throwing the error. */ #throwParseError(options?: { lexPosition?: number; @@ -575,8 +594,8 @@ class Parser { * Process a projection if the right hand side of the * projection is a slice. * - * @param left The left hand side of the projection. - * @param right The right hand side of the projection. + * @param left - The left hand side of the projection. + * @param right - The right hand side of the projection. */ #projectIfSlice(left: Node, right: Node): Node { const idxExpression = indexExpression([left, right]); @@ -596,8 +615,8 @@ class Parser { * two values. For example `foo == bar` compares the * value of `foo` with the value of `bar`. * - * @param left The left hand side of the comparator. - * @param comparatorChar The comparator character. + * @param left - The left hand side of the comparator. + * @param comparatorChar - The comparator character. */ #parseComparator(left: Node, comparatorChar: Token['type']): Node { return comparator( @@ -663,7 +682,7 @@ class Parser { /** * Process the right hand side of a projection. * - * @param bindingPower The binding power of the current token. + * @param bindingPower - The binding power of the current token. */ #parseProjectionRhs(bindingPower: number): Node { // Parse the right hand side of the projection. @@ -688,7 +707,7 @@ class Parser { /** * Process the right hand side of a dot expression. * - * @param bindingPower The binding power of the current token. + * @param bindingPower - The binding power of the current token. */ #parseDotRhs(bindingPower: number): Node { // From the grammar: @@ -722,7 +741,7 @@ class Parser { /** * Process a token and throw an error if it doesn't match the expected token. * - * @param tokenType The expected token type. + * @param tokenType - The expected token type. */ #match(tokenType: Token['type']): void { const currentToken = this.#currentToken(); @@ -748,7 +767,7 @@ class Parser { /** * Process a token and throw an error if it doesn't match the expected token. * - * @param tokenTypes The expected token types. + * @param tokenTypes - The expected token types. */ #matchMultipleTokens(tokenTypes: Token['type'][]): void { const currentToken = this.#currentToken(); @@ -787,7 +806,7 @@ class Parser { /** * Look ahead in the token stream and get the type of the token * - * @param number The number of tokens to look ahead. + * @param number - The number of tokens to look ahead. */ #lookahead(number: number): Token['type'] { return this.#tokens[this.#index + number].type; @@ -796,7 +815,7 @@ class Parser { /** * Look ahead in the token stream and get the token * - * @param number The number of tokens to look ahead. + * @param number - The number of tokens to look ahead. */ #lookaheadToken(number: number): Token { return this.#tokens[this.#index + number]; diff --git a/packages/jmespath/src/PowertoolsFunctions.ts b/packages/jmespath/src/PowertoolsFunctions.ts index fc353aa8b0..3dd21b8190 100644 --- a/packages/jmespath/src/PowertoolsFunctions.ts +++ b/packages/jmespath/src/PowertoolsFunctions.ts @@ -2,6 +2,7 @@ import { gunzipSync } from 'node:zlib'; import type { JSONValue } from '@aws-lambda-powertools/commons/types'; import { fromBase64 } from '@aws-lambda-powertools/commons/utils/base64'; import { Functions } from './Functions.js'; +import type { search } from './search.js'; const decoder = new TextDecoder('utf-8'); @@ -10,7 +11,7 @@ const decoder = new TextDecoder('utf-8'); * * Built-in JMESPath functions include: `powertools_json`, `powertools_base64`, `powertools_base64_gzip` * - * You can use these functions to decode and/or deserialize JSON objects when using the {@link index.search | search} function. + * You can use these functions to decode and/or deserialize JSON objects when using the {@link search | `search`} function. * * @example * ```typescript @@ -28,9 +29,6 @@ const decoder = new TextDecoder('utf-8'); * ); * console.log(result); // { foo: 'bar' } * ``` - * - * When using the {@link envelopes.extractDataFromEnvelope} function, the PowertoolsFunctions class is automatically used. - * */ class PowertoolsFunctions extends Functions { @Functions.signature({ @@ -58,4 +56,5 @@ class PowertoolsFunctions extends Functions { } } -export { PowertoolsFunctions, Functions }; +export { Functions } from './Functions.js'; +export { PowertoolsFunctions }; diff --git a/packages/jmespath/src/TreeInterpreter.ts b/packages/jmespath/src/TreeInterpreter.ts index 17be0bd49a..a23c0d07b7 100644 --- a/packages/jmespath/src/TreeInterpreter.ts +++ b/packages/jmespath/src/TreeInterpreter.ts @@ -215,10 +215,10 @@ class TreeInterpreter { try { // We know that methodName is a key of this.#functions, but TypeScript - // doesn't know that, so we have to use @ts-ignore to tell it that it's + // doesn't know that, so we suppress the issue to tell it that it's // okay. We could use a type assertion like `as keyof Functions`, but // we also want to keep the args generic, so for now we'll just ignore it. - // @ts-ignore-next-line + // @ts-expect-error return this.#functions[funcName](args); } catch (error) { if ( diff --git a/packages/jmespath/src/ast.ts b/packages/jmespath/src/ast.ts index c0f2eff39f..81bec422f1 100644 --- a/packages/jmespath/src/ast.ts +++ b/packages/jmespath/src/ast.ts @@ -6,9 +6,9 @@ import type { Node } from './types.js'; * * A comparator expression is a binary expression that compares two values. * - * @param name The name of the comparator - * @param first The left-hand side of the comparator - * @param second The right-hand side of the comparator + * @param name - The name of the comparator + * @param first - The left-hand side of the comparator + * @param second - The right-hand side of the comparator */ const comparator = (name: string, first: Node, second: Node): Node => ({ type: 'comparator', @@ -33,7 +33,7 @@ const currentNode = (): Node => ({ * An expression reference is a reference to another expression. * In JMESPath, an expression reference is represented by the `&` symbol. * - * @param expression The expression to reference + * @param expression - The expression to reference */ const expref = (expression: Node): Node => ({ type: 'expref', @@ -49,8 +49,8 @@ const expref = (expression: Node): Node => ({ * * Custom functions can be added by extending the `Functions` class. * - * @param name The name of the function - * @param args The arguments to the function + * @param name - The name of the function + * @param args - The arguments to the function */ const functionExpression = (name: string, args: Node[]): Node => ({ type: 'function_expression', @@ -62,6 +62,8 @@ const functionExpression = (name: string, args: Node[]): Node => ({ * AST node representing a field reference. * * A field reference is a reference to a field in an object. + * + * @param name - The name of the field */ const field = (name: JSONValue): Node => ({ type: 'field', @@ -79,9 +81,9 @@ const field = (name: JSONValue): Node => ({ * For example, `people[?age > 18]` filters the `people` array based on the * `age` field. * - * @param left The left-hand side of the filter projection - * @param right The right-hand side of the filter projection - * @param comparator The comparator to use for the filter + * @param left - The left-hand side of the filter projection + * @param right - The right-hand side of the filter projection + * @param comparator - The comparator to use for the filter */ const filterProjection = (left: Node, right: Node, comparator: Node): Node => ({ type: 'filter_projection', @@ -98,7 +100,7 @@ const filterProjection = (left: Node, right: Node, comparator: Node): Node => ({ * For example, `people[].name` flattens the `people` array and returns the * `name` field of each object in the array. * - * @param node The node to flatten + * @param node - The node to flatten */ const flatten = (node: Node): Node => ({ type: 'flatten', @@ -116,7 +118,7 @@ const identity = (): Node => ({ type: 'identity', children: [] }); * An index reference is a reference to an index in an array. * For example, `people[0]` references the first element in the `people` array. * - * @param index The index to reference + * @param index - The index to reference */ const index = (index: JSONValue): Node => ({ type: 'index', @@ -129,7 +131,7 @@ const index = (index: JSONValue): Node => ({ * * An index expression holds the index and the children of the expression. * - * @param children The children of the index expression + * @param children - The children of the index expression */ const indexExpression = (children: Node[]): Node => ({ type: 'index_expression', @@ -139,8 +141,8 @@ const indexExpression = (children: Node[]): Node => ({ /** * AST node representing a key-value pair. * - * @param keyName The name of the key - * @param node The value of the key + * @param keyName - The name of the key + * @param node - The value of the key */ const keyValPair = (keyName: JSONValue, node: Node): Node => ({ type: 'key_val_pair', @@ -153,7 +155,7 @@ const keyValPair = (keyName: JSONValue, node: Node): Node => ({ * * A literal value is a value that is not a reference to another node. * - * @param literalValue The value of the literal + * @param literalValue - The value of the literal */ const literal = (literalValue: JSONValue): Node => ({ type: 'literal', @@ -166,7 +168,7 @@ const literal = (literalValue: JSONValue): Node => ({ * * A multi-select object is a reference to multiple nodes in an object. * - * @param nodes + * @param nodes - The nodes to select */ const multiSelectObject = (nodes: Node[]): Node => ({ type: 'multi_select_object', @@ -176,7 +178,7 @@ const multiSelectObject = (nodes: Node[]): Node => ({ /** * AST node representing a multi-select list. * - * @param nodes + * @param nodes - The nodes to select */ const multiSelectList = (nodes: Node[]): Node => ({ type: 'multi_select_list', @@ -186,8 +188,8 @@ const multiSelectList = (nodes: Node[]): Node => ({ /** * AST node representing an or expression. * - * @param left The left-hand side of the or expression - * @param right The right-hand side of the or expression + * @param left - The left-hand side of the or expression + * @param right - The right-hand side of the or expression */ const orExpression = (left: Node, right: Node): Node => ({ type: 'or_expression', @@ -197,8 +199,8 @@ const orExpression = (left: Node, right: Node): Node => ({ /** * AST node representing an and expression. * - * @param left The left-hand side of the and expression - * @param right The right-hand side of the and expression + * @param left - The left-hand side of the and expression + * @param right - The right-hand side of the and expression */ const andExpression = (left: Node, right: Node): Node => ({ type: 'and_expression', @@ -208,8 +210,8 @@ const andExpression = (left: Node, right: Node): Node => ({ /** * AST node representing a not expression. * - * @param left The left-hand side of the not expression - * @param right The right-hand side of the not expression + * @param left - The left-hand side of the not expression + * @param right - The right-hand side of the not expression */ const notExpression = (expr: Node): Node => ({ type: 'not_expression', @@ -219,8 +221,8 @@ const notExpression = (expr: Node): Node => ({ /** * AST node representing a pipe expression. * - * @param left The left-hand side of the pipe expression - * @param right The right-hand side of the pipe expression + * @param left - The left-hand side of the pipe expression + * @param right - The right-hand side of the pipe expression */ const pipe = (left: Node, right: Node): Node => ({ type: 'pipe', @@ -230,8 +232,8 @@ const pipe = (left: Node, right: Node): Node => ({ /** * AST node representing a projection. * - * @param left The left-hand side of the projection - * @param right The right-hand side of the projection + * @param left - The left-hand side of the projection + * @param right - The right-hand side of the projection */ const projection = (left: Node, right: Node): Node => ({ type: 'projection', @@ -241,7 +243,7 @@ const projection = (left: Node, right: Node): Node => ({ /** * AST node representing a subexpression. * - * @param children The children of the subexpression + * @param children - The children of the subexpression */ const subexpression = (children: Node[]): Node => ({ type: 'subexpression', @@ -253,9 +255,9 @@ const subexpression = (children: Node[]): Node => ({ * * A slice is a reference to a range of values in an array. * - * @param start The start of the slice - * @param end The end of the slice - * @param step The step of the slice + * @param start - The start of the slice + * @param end - The end of the slice + * @param step - The step of the slice */ const slice = (start: JSONValue, end: JSONValue, step: JSONValue): Node => ({ type: 'slice', @@ -265,8 +267,8 @@ const slice = (start: JSONValue, end: JSONValue, step: JSONValue): Node => ({ /** * AST node representing a value projection. * - * @param left The left-hand side of the value projection - * @param right The right-hand side of the value projection + * @param left - The left-hand side of the value projection + * @param right - The right-hand side of the value projection */ const valueProjection = (left: Node, right: Node): Node => ({ type: 'value_projection', diff --git a/packages/jmespath/src/constants.ts b/packages/jmespath/src/constants.ts index de078f8754..0697ea8898 100644 --- a/packages/jmespath/src/constants.ts +++ b/packages/jmespath/src/constants.ts @@ -42,26 +42,32 @@ const BINDING_POWER = { * The set of ASCII lowercase letters allowed in JMESPath identifiers. */ const ASCII_LOWERCASE = 'abcdefghijklmnopqrstuvwxyz'; + /** * The set of ASCII uppercase letters allowed in JMESPath identifiers. */ const ASCII_UPPERCASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + /** * The set of ASCII letters allowed in JMESPath identifiers. */ const ASCII_LETTERS = ASCII_LOWERCASE + ASCII_UPPERCASE; + /** * The set of ASCII digits allowed in JMESPath identifiers. */ const DIGITS = '0123456789'; + /** * The set of ASCII letters and digits allowed in JMESPath identifiers. */ const START_IDENTIFIER = new Set(`${ASCII_LETTERS}_`); + /** * The set of ASCII letters and digits allowed in JMESPath identifiers. */ const VALID_IDENTIFIER = new Set(`${ASCII_LETTERS}${DIGITS}_`); + /** * The set of ASCII digits allowed in JMESPath identifiers. */ @@ -70,6 +76,7 @@ const VALID_NUMBER = new Set(DIGITS); * The set of ASCII whitespace characters allowed in JMESPath identifiers. */ const WHITESPACE = new Set(' \t\n\r'); + /** * The set of simple tokens in the JMESPath grammar. */ diff --git a/packages/jmespath/src/envelopes.ts b/packages/jmespath/src/envelopes.ts index 32107f0a5d..12400004de 100644 --- a/packages/jmespath/src/envelopes.ts +++ b/packages/jmespath/src/envelopes.ts @@ -50,9 +50,9 @@ import type { JMESPathParsingOptions, JSONObject } from './types.js'; * }; * ``` * - * @param data The JSON object to search - * @param envelope The JMESPath expression to use - * @param options The parsing options to use + * @param data - The JSON object to search + * @param envelope - The JMESPath expression to use + * @param options - The parsing options to use */ const extractDataFromEnvelope = ( data: JSONObject, diff --git a/packages/jmespath/src/errors.ts b/packages/jmespath/src/errors.ts index 87ec88ed0e..dd3958ac32 100644 --- a/packages/jmespath/src/errors.ts +++ b/packages/jmespath/src/errors.ts @@ -23,7 +23,7 @@ class JMESPathError extends Error { * thrown. In some instances the expression is not known until after the * error is thrown (i.e. the error is thrown down the call stack). * - * @param expression The expression that was being parsed when the error occurred. + * @param expression - The expression that was being parsed when the error occurred. */ public setExpression(expression: string): void { this.expression = expression; @@ -163,7 +163,7 @@ class FunctionError extends JMESPathError { * alias. To avoid passing the function name down the call stack, we set it * after the error is thrown. * - * @param functionName The function that was being validated or executed when the error occurred. + * @param functionName - The function that was being validated or executed when the error occurred. */ public setEvaluatedFunctionName(functionName: string): void { this.message = this.message.replace( @@ -202,6 +202,12 @@ class ArityError extends FunctionError { }, received ${this.actualArity}`; } + /** + * Pluralizes a word based on the count. + * + * @param word - The word to pluralize + * @param count - The count to determine if the word should be pluralized + */ protected pluralize(word: string, count: number): string { return count === 1 ? word : `${word}s`; } @@ -262,6 +268,9 @@ class JMESPathTypeError extends FunctionError { }"`; } + /** + * Serialize the expected types for the error message. + */ protected serializeExpectedTypes(): string { const types: string[] = []; for (const type of this.expectedTypes) { diff --git a/packages/jmespath/src/search.ts b/packages/jmespath/src/search.ts index 44afcd61c4..79381b3e80 100644 --- a/packages/jmespath/src/search.ts +++ b/packages/jmespath/src/search.ts @@ -45,9 +45,9 @@ const parser = new Parser(); * console.log(result); // { foo: 'bar' } * ``` * - * @param expression The JMESPath expression to use - * @param data The JSON object to search - * @param options The parsing options to use + * @param expression - The JMESPath expression to use + * @param data - The JSON object to search + * @param options - The parsing options to use */ const search = ( expression: string, diff --git a/packages/jmespath/src/types.ts b/packages/jmespath/src/types.ts index 485529d9f1..2cb0727b1e 100644 --- a/packages/jmespath/src/types.ts +++ b/packages/jmespath/src/types.ts @@ -81,8 +81,8 @@ type FunctionSignatureDecorator = ( * } * ``` * - * @param argumentsSpecs The expected arguments for the function. - * @param variadic Whether the function is variadic. + * @param argumentsSpecs - The expected arguments for the function. + * @param variadic - Whether the function is variadic. */ type FunctionSignatureOptions = { argumentsSpecs: Array>; diff --git a/packages/jmespath/src/utils.ts b/packages/jmespath/src/utils.ts index 9a27909c98..3751b98093 100644 --- a/packages/jmespath/src/utils.ts +++ b/packages/jmespath/src/utils.ts @@ -16,7 +16,7 @@ import { ArityError, JMESPathTypeError, VariadicArityError } from './errors.js'; * this reason we wrap the original isTruthy function from the commons package * and add a check for numbers. * - * @param value The value to check + * @param value - The value to check */ const isTruthy = (value: unknown): boolean => { if (isNumber(value)) { @@ -30,9 +30,9 @@ const isTruthy = (value: unknown): boolean => { * Cap a slice range value to the length of an array, taking into account * negative values and whether the step is negative. * - * @param arrayLength The length of the array - * @param value The value to cap - * @param isStepNegative Whether the step is negative + * @param arrayLength - The length of the array + * @param value - The value to cap + * @param isStepNegative - Whether the step is negative */ const capSliceRange = ( arrayLength: number, @@ -54,24 +54,24 @@ const capSliceRange = ( /** * Given a start, stop, and step value, the sub elements in an array are extracted as follows: - * * The first element in the extracted array is the index denoted by start. - * * The last element in the extracted array is the index denoted by end - 1. - * * The step value determines how many indices to skip after each element is selected from the array. An array of 1 (the default step) will not skip any indices. A step value of 2 will skip every other index while extracting elements from an array. A step value of -1 will extract values in reverse order from the array. + * - The first element in the extracted array is the index denoted by start. + * - The last element in the extracted array is the index denoted by end - 1. + * - The step value determines how many indices to skip after each element is selected from the array. An array of 1 (the default step) will not skip any indices. A step value of 2 will skip every other index while extracting elements from an array. A step value of -1 will extract values in reverse order from the array. * * Slice expressions adhere to the following rules: - * * If a negative start position is given, it is calculated as the total length of the array plus the given start position. - * * If no start position is given, it is assumed to be 0 if the given step is greater than 0 or the end of the array if the given step is less than 0. - * * If a negative stop position is given, it is calculated as the total length of the array plus the given stop position. - * * If no stop position is given, it is assumed to be the length of the array if the given step is greater than 0 or 0 if the given step is less than 0. - * * If the given step is omitted, it it assumed to be 1. - * * If the given step is 0, an invalid-value error MUST be raised (thrown before calling the function) - * * If the element being sliced is not an array, the result is null (returned before calling the function) - * * If the element being sliced is an array and yields no results, the result MUST be an empty array. + * - If a negative start position is given, it is calculated as the total length of the array plus the given start position. + * - If no start position is given, it is assumed to be 0 if the given step is greater than 0 or the end of the array if the given step is less than 0. + * - If a negative stop position is given, it is calculated as the total length of the array plus the given stop position. + * - If no stop position is given, it is assumed to be the length of the array if the given step is greater than 0 or 0 if the given step is less than 0. + * - If the given step is omitted, it it assumed to be 1. + * - If the given step is 0, an invalid-value error MUST be raised (thrown before calling the function) + * - If the element being sliced is not an array, the result is null (returned before calling the function) + * - If the element being sliced is an array and yields no results, the result MUST be an empty array. * - * @param array The array to slice - * @param start The start index - * @param end The end index - * @param step The step value + * @param array - The array to slice + * @param start - The start index + * @param end - The end index + * @param step - The step value */ const sliceArray = ({ array, @@ -119,10 +119,10 @@ const sliceArray = ({ * greater than or equal to the expected arity. If the number of arguments passed to the function * is less than the expected arity, a `VariadicArityError` is thrown. * - * @param args The arguments passed to the function - * @param argumentsSpecs The expected types for each argument - * @param decoratedFuncName The name of the function being called - * @param variadic Whether the function is variadic + * @param args - The arguments passed to the function + * @param argumentsSpecs - The expected types for each argument + * @param decoratedFuncName - The name of the function being called + * @param variadic - Whether the function is variadic */ const arityCheck = ( args: unknown[], @@ -160,8 +160,8 @@ const arityCheck = ( * passes. If the argument does not match any of the types, then * a JMESPathTypeError is thrown. * - * @param args The arguments passed to the function - * @param argumentsSpecs The expected types for each argument + * @param args - The arguments passed to the function + * @param argumentsSpecs - The expected types for each argument */ const typeCheck = ( args: unknown[], @@ -182,24 +182,24 @@ const typeCheck = ( * passes. If the argument does not match any of the types, then * a JMESPathTypeError is thrown. * - * @param arg - * @param argumentSpec + * @param arg - The argument to check + * @param argumentSpec - The expected types for the argument */ const typeCheckArgument = (arg: unknown, argumentSpec: Array): void => { let valid = false; - argumentSpec.forEach((type, index) => { + for (const [index, type] of argumentSpec.entries()) { if (valid) return; valid = checkIfArgumentTypeIsValid(arg, type, index, argumentSpec); - }); + } }; /** * Check if the argument is of the expected type. * - * @param arg The argument to check - * @param type The expected type - * @param index The index of the type we are checking - * @param argumentSpec The list of types to check against + * @param arg - The argument to check + * @param type - The expected type + * @param index - The index of the type we are checking + * @param argumentSpec - The list of types to check against */ const checkIfArgumentTypeIsValid = ( arg: unknown, @@ -243,10 +243,10 @@ const checkIfArgumentTypeIsValid = ( /** * Check if the argument is of the expected type. * - * @param arg The argument to check - * @param type The type to check against - * @param argumentSpec The list of types to check against - * @param hasMoreTypesToCheck Whether there are more types to check + * @param arg - The argument to check + * @param type - The type to check against + * @param argumentSpec - The list of types to check against + * @param hasMoreTypesToCheck - Whether there are more types to check */ const typeCheckType = ( arg: unknown, @@ -266,9 +266,9 @@ const typeCheckType = ( /** * Check if the argument is an array of complex types. * - * @param arg The argument to check - * @param type The type to check against - * @param hasMoreTypesToCheck Whether there are more types to check + * @param arg - The argument to check + * @param type - The type to check against + * @param hasMoreTypesToCheck - Whether there are more types to check */ const checkComplexArrayType = ( arg: unknown[], @@ -293,9 +293,9 @@ const checkComplexArrayType = ( /** * Check if the argument is an expression. * - * @param arg The argument to check - * @param type The type to check against - * @param hasMoreTypesToCheck Whether there are more types to check + * @param arg - The argument to check + * @param type - The type to check against + * @param hasMoreTypesToCheck - Whether there are more types to check */ const checkExpressionType = ( arg: unknown, @@ -314,9 +314,9 @@ const checkExpressionType = ( /** * Check if the argument is an object. * - * @param arg The argument to check - * @param type The type to check against - * @param hasMoreTypesToCheck Whether there are more types to check + * @param arg - The argument to check + * @param type - The type to check against + * @param hasMoreTypesToCheck - Whether there are more types to check */ const checkObjectType = ( arg: unknown, diff --git a/packages/kafka/package.json b/packages/kafka/package.json index 95bdf94360..783d42b4a0 100644 --- a/packages/kafka/package.json +++ b/packages/kafka/package.json @@ -22,6 +22,7 @@ "build": "npm run build:esm & npm run build:cjs", "lint": "biome lint .", "lint:fix": "biome check --write .", + "lint:ci": "biome ci .", "prepack": "node ../../.github/scripts/release_patch_package_json.js .", "proto:gen": "npx pbjs -t static-module -w es6 -o $(pwd)/tests/protos/product.es6.generated.js $(pwd)/tests/protos/product.proto && npx pbts -o $(pwd)/tests/protos/product.es6.generated.d.ts $(pwd)/tests/protos/product.es6.generated.js && npx pbjs -t static-module -w commonjs -o $(pwd)/tests/protos/product.cjs.generated.js $(pwd)/tests/protos/product.proto && npx pbts -o $(pwd)/tests/protos/product.cjs.generated.d.ts $(pwd)/tests/protos/product.cjs.generated.js" }, diff --git a/packages/kafka/tests/unit/consumer.test.ts b/packages/kafka/tests/unit/consumer.test.ts index 086a1a090d..8448d846a9 100644 --- a/packages/kafka/tests/unit/consumer.test.ts +++ b/packages/kafka/tests/unit/consumer.test.ts @@ -1,3 +1,4 @@ +import { setTimeout } from 'node:timers/promises'; import type { Context } from 'aws-lambda'; import { describe, expect, it } from 'vitest'; import { z } from 'zod/v4'; @@ -145,6 +146,7 @@ describe('Kafka consumer', () => { for (const record of event.records) { try { results.push(record.value); + await setTimeout(1); // simulate some processing time } catch (error) { return error; } @@ -247,6 +249,7 @@ describe('Kafka consumer', () => { for (const record of event.records) { try { const { value, key } = record; + await setTimeout(1); // simulate some processing time results.push([value, key]); } catch (error) { return error; @@ -444,6 +447,7 @@ describe('Kafka consumer', () => { try { const { value } = record; results.push(value); + await setTimeout(1); // simulate some processing time } catch (error) { results.push(error); } @@ -480,6 +484,7 @@ describe('Kafka consumer', () => { try { const { value } = record; results.push(value); + await setTimeout(1); // simulate some processing time } catch (error) { results.push(error); } @@ -531,6 +536,7 @@ describe('Kafka consumer', () => { try { const { value } = record; results.push(value); + await setTimeout(1); // simulate some processing time } catch (error) { results.push(error); } diff --git a/packages/kafka/tests/unit/deserializer.avro.test.ts b/packages/kafka/tests/unit/deserializer.avro.test.ts index 9893b5c258..7edccd5960 100644 --- a/packages/kafka/tests/unit/deserializer.avro.test.ts +++ b/packages/kafka/tests/unit/deserializer.avro.test.ts @@ -21,7 +21,7 @@ describe('Avro Deserializer: ', () => { expect(await deserialize(message, schema)).toEqual(expected); }); - it('throws when avro deserialiser fails', async () => { + it('throws when avro deserialiser fails', () => { // Prepare const message = '0g8MTGFwdG9wUrgehes/j0A='; const schema = `{ @@ -39,7 +39,7 @@ describe('Avro Deserializer: ', () => { ); }); - it('throws when avro deserialiser has not matching schema', async () => { + it('throws when avro deserialiser has not matching schema', () => { // Prepare const message = '0g8MTGFwdG9wUrgehes/j0A='; const schema = `{ diff --git a/packages/logger/package.json b/packages/logger/package.json index e0fe39665d..a5efab62aa 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -23,6 +23,7 @@ "build": "npm run build:esm & npm run build:cjs", "lint": "biome lint .", "lint:fix": "biome check --write .", + "lint:ci": "biome ci .", "prepack": "node ../../.github/scripts/release_patch_package_json.js ." }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/logger#readme", diff --git a/packages/logger/src/formatter/LogFormatter.ts b/packages/logger/src/formatter/LogFormatter.ts index 55bfe7088c..be14cc537d 100644 --- a/packages/logger/src/formatter/LogFormatter.ts +++ b/packages/logger/src/formatter/LogFormatter.ts @@ -139,7 +139,7 @@ abstract class LogFormatter { /** * If a specific timezone is configured and it's not the default `UTC`, * format the timestamp with the appropriate timezone offset. - **/ + */ const configuredTimezone = getStringFromEnv({ key: 'TZ', defaultValue: '', diff --git a/packages/logger/src/middleware/middy.ts b/packages/logger/src/middleware/middy.ts index 3bd10004ac..e674adab64 100644 --- a/packages/logger/src/middleware/middy.ts +++ b/packages/logger/src/middleware/middy.ts @@ -81,7 +81,7 @@ const injectLambdaContext = ( }; }; - const before = async (request: MiddyLikeRequest): Promise => { + const before = (request: MiddyLikeRequest) => { for (const logger of loggers) { if (isResetStateEnabled) { setCleanupFunction(request); @@ -102,7 +102,7 @@ const injectLambdaContext = ( } }; - const after = async (): Promise => { + const after = () => { for (const logger of loggers) { logger.clearBuffer(); @@ -112,7 +112,7 @@ const injectLambdaContext = ( } }; - const onError = async ({ error }: { error: unknown }): Promise => { + const onError = ({ error }: { error: unknown }) => { for (const logger of loggers) { if (options?.flushBufferOnUncaughtError) { logger.flushBuffer(); diff --git a/packages/logger/tests/e2e/advancedUses.test.FunctionCode.ts b/packages/logger/tests/e2e/advancedUses.test.FunctionCode.ts index 1e601c6097..93f7f19c24 100644 --- a/packages/logger/tests/e2e/advancedUses.test.FunctionCode.ts +++ b/packages/logger/tests/e2e/advancedUses.test.FunctionCode.ts @@ -1,3 +1,4 @@ +import { setTimeout } from 'node:timers/promises'; import { Logger } from '@aws-lambda-powertools/logger'; import { correlationPaths, @@ -18,7 +19,7 @@ const logger = new Logger({ logger.debug('a never buffered debug log'); -export const handlerManual = async (event: unknown) => { +export const handlerManual = (event: unknown) => { logger.addContext({} as Context); // we want only the cold start value logger.setCorrelationId(event, correlationPaths.EVENT_BRIDGE); @@ -42,7 +43,7 @@ export const handlerMiddy = middy() flushBufferOnUncaughtError: true, }) ) - .handler(async () => { + .handler(() => { logger.debug('a buffered debug log'); logger.info('an info log'); throw new Error('ops'); @@ -56,6 +57,7 @@ class Lambda { public async handler(_event: unknown, _context: Context) { logger.debug('a buffered debug log'); logger.info('an info log'); + await setTimeout(1); // simulate async work throw new Error('ops'); } } diff --git a/packages/logger/tests/e2e/basicFeatures.middy.test.FunctionCode.ts b/packages/logger/tests/e2e/basicFeatures.middy.test.FunctionCode.ts index 258c89299b..2765446681 100644 --- a/packages/logger/tests/e2e/basicFeatures.middy.test.FunctionCode.ts +++ b/packages/logger/tests/e2e/basicFeatures.middy.test.FunctionCode.ts @@ -26,10 +26,10 @@ const logger = new Logger({ }, }); -const testFunction = async ( +const testFunction = ( _event: TestEvent, context: Context -): TestOutput => { +): Awaited => { // Test feature 1: Context data injection (all logs should have the same context data) // Test feature 2: Event log (this log should have the event data) // Test feature 3: Log level filtering (log level is set to INFO) diff --git a/packages/logger/tests/e2e/basicFeatures.middy.test.ts b/packages/logger/tests/e2e/basicFeatures.middy.test.ts index 56d0c28b19..5cef007bbc 100644 --- a/packages/logger/tests/e2e/basicFeatures.middy.test.ts +++ b/packages/logger/tests/e2e/basicFeatures.middy.test.ts @@ -65,7 +65,7 @@ describe('Logger E2E tests, basic functionalities middy usage', () => { }); describe('Log level filtering', () => { - it('should filter log based on POWERTOOLS_LOG_LEVEL (INFO) environment variable in Lambda', async () => { + it('should filter log based on POWERTOOLS_LOG_LEVEL (INFO) environment variable in Lambda', () => { for (let i = 0; i < invocationCount; i++) { // Get log messages of the invocation and filter by level const debugLogs = invocationLogs[i].getFunctionLogs('DEBUG'); @@ -76,7 +76,7 @@ describe('Logger E2E tests, basic functionalities middy usage', () => { }); describe('Context data', () => { - it('should inject context info in each log', async () => { + it('should inject context info in each log', () => { for (let i = 0; i < invocationCount; i++) { // Get log messages of the invocation const logMessages = invocationLogs[i].getFunctionLogs(); @@ -92,7 +92,7 @@ describe('Logger E2E tests, basic functionalities middy usage', () => { } }); - it('should include coldStart equal to TRUE only on the first invocation, FALSE otherwise', async () => { + it('should include coldStart equal to TRUE only on the first invocation, FALSE otherwise', () => { for (let i = 0; i < invocationCount; i++) { // Get log messages of the invocation const logMessages = invocationLogs[i].getFunctionLogs(); @@ -109,7 +109,7 @@ describe('Logger E2E tests, basic functionalities middy usage', () => { }); }); - it('logs the event for every invocation, only once, and without keys from previous invocations', async () => { + it('logs the event for every invocation, only once, and without keys from previous invocations', () => { const { RUNTIME_ADDED_KEY: runtimeAddedKey } = commonEnvironmentVars; for (let i = 0; i < invocationCount; i++) { @@ -132,7 +132,7 @@ describe('Logger E2E tests, basic functionalities middy usage', () => { }); describe('Persistent additional log keys and values', () => { - it('should contain persistent value in every log', async () => { + it('should contain persistent value in every log', () => { const { PERSISTENT_KEY: persistentKey, PERSISTENT_VALUE: persistentValue, @@ -151,7 +151,7 @@ describe('Logger E2E tests, basic functionalities middy usage', () => { } }); - it('should not contain persistent keys that were removed on runtime', async () => { + it('should not contain persistent keys that were removed on runtime', () => { const { REMOVABLE_KEY: removableKey, REMOVABLE_VALUE: removableValue } = commonEnvironmentVars; @@ -176,7 +176,7 @@ describe('Logger E2E tests, basic functionalities middy usage', () => { }); describe('One-time additional log keys and values', () => { - it('should log additional keys and value only once', async () => { + it('should log additional keys and value only once', () => { const { SINGLE_LOG_ITEM_KEY: singleLogItemKey, SINGLE_LOG_ITEM_VALUE: singleLogItemValue, @@ -200,7 +200,7 @@ describe('Logger E2E tests, basic functionalities middy usage', () => { }); describe('Error logging', () => { - it('should log error only once', async () => { + it('should log error only once', () => { const { ERROR_MSG: errorMsg } = commonEnvironmentVars; for (let i = 0; i < invocationCount; i++) { @@ -226,7 +226,7 @@ describe('Logger E2E tests, basic functionalities middy usage', () => { }); describe('Arbitrary object logging', () => { - it('should log additional arbitrary object only once', async () => { + it('should log additional arbitrary object only once', () => { const { ARBITRARY_OBJECT_KEY: objectKey, ARBITRARY_OBJECT_DATA: objectData, @@ -263,7 +263,7 @@ describe('Logger E2E tests, basic functionalities middy usage', () => { }); describe('X-Ray Trace ID injection', () => { - it('should inject & parse the X-Ray Trace ID of the current invocation into every log', async () => { + it('should inject & parse the X-Ray Trace ID of the current invocation into every log', () => { for (let i = 0; i < invocationCount; i++) { // Get log messages of the invocation const logMessages = invocationLogs[i].getFunctionLogs(); diff --git a/packages/logger/tests/e2e/childLogger.manual.test.FunctionCode.ts b/packages/logger/tests/e2e/childLogger.manual.test.FunctionCode.ts index f7ba75b2a4..a01c6b8005 100644 --- a/packages/logger/tests/e2e/childLogger.manual.test.FunctionCode.ts +++ b/packages/logger/tests/e2e/childLogger.manual.test.FunctionCode.ts @@ -20,10 +20,10 @@ const childLogger = parentLogger.createChild({ logLevel: CHILD_LOG_LEVEL, }); -export const handler = async ( +export const handler = ( _event: TestEvent, context: Context -): TestOutput => { +): Awaited => { parentLogger.addContext(context); childLogger.info(CHILD_LOG_MSG); diff --git a/packages/logger/tests/e2e/childLogger.manual.test.ts b/packages/logger/tests/e2e/childLogger.manual.test.ts index cc90c4be84..a4a7953871 100644 --- a/packages/logger/tests/e2e/childLogger.manual.test.ts +++ b/packages/logger/tests/e2e/childLogger.manual.test.ts @@ -57,7 +57,7 @@ describe('Logger E2E tests, child logger', () => { }); describe('Child logger', () => { - it('should not log at same level of parent because of its own logLevel', async () => { + it('should not log at same level of parent because of its own logLevel', () => { const { PARENT_LOG_MSG: parentLogMsg, CHILD_LOG_MSG: childLogMsg } = commonEnvironmentVars; @@ -77,7 +77,7 @@ describe('Logger E2E tests, child logger', () => { } }); - it('should log only level passed to a child', async () => { + it('should log only level passed to a child', () => { const { CHILD_LOG_MSG: childLogMsg } = commonEnvironmentVars; for (let i = 0; i < invocationCount; i++) { // Get log messages of the invocation @@ -95,7 +95,7 @@ describe('Logger E2E tests, child logger', () => { } }); - it('should NOT inject context into the child logger', async () => { + it('should NOT inject context into the child logger', () => { const { CHILD_LOG_MSG: childLogMsg } = commonEnvironmentVars; for (let i = 0; i < invocationCount; i++) { @@ -118,7 +118,7 @@ describe('Logger E2E tests, child logger', () => { } }); - it('both logger instances should have the same persistent key/value', async () => { + it('both logger instances should have the same persistent key/value', () => { const { PERSISTENT_KEY: persistentKey } = commonEnvironmentVars; for (let i = 0; i < invocationCount; i++) { diff --git a/packages/logger/tests/e2e/logEventEnvVarSetting.middy.test.ts b/packages/logger/tests/e2e/logEventEnvVarSetting.middy.test.ts index 63d1ed86ad..b303fde3e1 100644 --- a/packages/logger/tests/e2e/logEventEnvVarSetting.middy.test.ts +++ b/packages/logger/tests/e2e/logEventEnvVarSetting.middy.test.ts @@ -60,7 +60,7 @@ describe('Logger E2E tests, log event via env var setting with middy', () => { }); describe('Log event', () => { - it('should log the event as the first log of each invocation only', async () => { + it('should log the event as the first log of each invocation only', () => { for (let i = 0; i < invocationCount; i++) { // Get log messages of the invocation const logMessages = invocationLogs[i].getFunctionLogs(); diff --git a/packages/logger/tests/e2e/sampleRate.decorator.test.FunctionCode.ts b/packages/logger/tests/e2e/sampleRate.decorator.test.FunctionCode.ts index b0cd540189..cf253ff8f8 100644 --- a/packages/logger/tests/e2e/sampleRate.decorator.test.FunctionCode.ts +++ b/packages/logger/tests/e2e/sampleRate.decorator.test.FunctionCode.ts @@ -1,3 +1,4 @@ +import { setTimeout } from 'node:timers/promises'; import type { LambdaInterface } from '@aws-lambda-powertools/commons/types'; import type { Context } from 'aws-lambda'; import { Logger } from '../../src/index.js'; @@ -16,6 +17,7 @@ class Lambda implements LambdaInterface { @logger.injectLambdaContext() public async handler(_event: TestEvent, context: Context): TestOutput { this.printLogInAllLevels(); + await setTimeout(1); // simulate some async work return { requestId: context.awsRequestId, diff --git a/packages/logger/tests/e2e/sampleRate.decorator.test.ts b/packages/logger/tests/e2e/sampleRate.decorator.test.ts index 2be3ea594a..27d888c3b1 100644 --- a/packages/logger/tests/e2e/sampleRate.decorator.test.ts +++ b/packages/logger/tests/e2e/sampleRate.decorator.test.ts @@ -59,7 +59,7 @@ describe('Logger E2E tests, sample rate and injectLambdaContext()', () => { }); describe('Enabling sample rate', () => { - it('should log all levels based on given sample rate, not just ERROR', async () => { + it('should log all levels based on given sample rate, not just ERROR', () => { // Fetch log streams from all invocations let countSampled = 0; let countNotSampled = 0; @@ -94,7 +94,7 @@ describe('Logger E2E tests, sample rate and injectLambdaContext()', () => { }); describe('Decorator injectLambdaContext()', () => { - it('should inject Lambda context into every log emitted', async () => { + it('should inject Lambda context into every log emitted', () => { for (let i = 0; i < invocationCount; i++) { // Get log messages of the invocation const logMessages = invocationLogs[i].getFunctionLogs('ERROR'); diff --git a/packages/logger/tests/helpers/resources.ts b/packages/logger/tests/helpers/resources.ts index e7db1993e4..ea811f8eea 100644 --- a/packages/logger/tests/helpers/resources.ts +++ b/packages/logger/tests/helpers/resources.ts @@ -5,7 +5,7 @@ import type { TestNodejsFunctionProps, } from '@aws-lambda-powertools/testing-utils/types'; import { CfnOutput } from 'aws-cdk-lib'; -import { commonEnvironmentVars } from '../e2e/constants'; +import { commonEnvironmentVars } from '../e2e/constants.js'; interface LoggerExtraTestProps extends ExtraTestProps { logGroupOutputKey?: string; diff --git a/packages/logger/tests/unit/injectLambdaContext.test.ts b/packages/logger/tests/unit/injectLambdaContext.test.ts index 48ad337693..4bc6bcec53 100644 --- a/packages/logger/tests/unit/injectLambdaContext.test.ts +++ b/packages/logger/tests/unit/injectLambdaContext.test.ts @@ -1,3 +1,4 @@ +import { setTimeout } from 'node:timers/promises'; import context from '@aws-lambda-powertools/testing-utils/context'; import middy from '@middy/core'; import type { Context } from 'aws-lambda'; @@ -78,7 +79,7 @@ describe('Inject Lambda Context', () => { it('adds the context to log messages when the feature is enabled in the Middy.js middleware', async () => { // Prepare const logger = new Logger(); - const handler = middy(async () => { + const handler = middy(() => { logger.info('Hello, world!'); }).use(injectLambdaContext(logger)); @@ -100,7 +101,7 @@ describe('Inject Lambda Context', () => { // Prepare const logger1 = new Logger({ serviceName: 'parent' }); const logger2 = logger1.createChild({ serviceName: 'child' }); - const handler = middy(async () => { + const handler = middy(() => { logger1.info('Hello, world!'); logger2.info('Hello, world!'); }).use(injectLambdaContext([logger1, logger2])); @@ -140,6 +141,7 @@ describe('Inject Lambda Context', () => { @logger.injectLambdaContext() async handler(_event: unknown, _context: Context) { + await setTimeout(1); // simulate some async operation this.logGreeting(); } @@ -189,7 +191,7 @@ describe('Inject Lambda Context', () => { { case: 'middleware', getHandler: (logger: Logger) => - middy(async () => { + middy(() => { logger.info('Hello, world!'); }).use(injectLambdaContext(logger)), }, @@ -202,6 +204,7 @@ describe('Inject Lambda Context', () => { _event: unknown, _context: Context ): Promise { + await setTimeout(1); // simulate some async operation logger.info('test'); } } @@ -245,6 +248,7 @@ describe('Inject Lambda Context', () => { case: 'middleware', getHandler: (logger: Logger) => middy(async () => { + await setTimeout(1); // simulate some async operation logger.info('Hello, world!'); }).use( injectLambdaContext(logger, { @@ -263,6 +267,7 @@ describe('Inject Lambda Context', () => { _event: unknown, _context: Context ): Promise { + await setTimeout(1); // simulate some async operation logger.info('Hello, world!'); } } @@ -306,7 +311,7 @@ describe('Inject Lambda Context', () => { }, }; // Act - const handler = middy(async () => { + const handler = middy(() => { logger.info('Hello, world!'); }).use( injectLambdaContext(logger, { @@ -329,7 +334,7 @@ describe('Inject Lambda Context', () => { const logger = new Logger({ correlationIdSearchFn: search }); // Act - Use middleware which will internally call setCorrelationIdFromPath - const handler = middy(async () => { + const handler = middy(() => { logger.info('Hello, world!'); }).use( injectLambdaContext(logger, { @@ -388,7 +393,7 @@ describe('Inject Lambda Context', () => { it('uses the API_GATEWAY_REST predefined path to extract correlation ID', async () => { // Prepare const logger = new Logger({ correlationIdSearchFn: search }); - const handler = middy(async () => { + const handler = middy(() => { logger.info('Using API Gateway request ID'); }).use( injectLambdaContext(logger, { @@ -419,7 +424,7 @@ describe('Inject Lambda Context', () => { { case: 'middleware', getHandler: (logger: Logger) => - middy(async (event: { id: number }) => { + middy((event: { id: number }) => { logger.info('Processing event'); logger.appendKeys({ id: event.id }); throw new Error('Test error'); @@ -440,6 +445,7 @@ describe('Inject Lambda Context', () => { event: { id: number }, _context: Context ): Promise { + await setTimeout(1); // simulate some async operation logger.info('Processing event'); logger.appendKeys({ id: event.id }); throw new Error('Test error'); @@ -480,7 +486,7 @@ describe('Inject Lambda Context', () => { { case: 'middleware', getHandler: (logger: Logger) => - middy(async (event: { id: number }) => { + middy((event: { id: number }) => { logger.info('Processing event'); logger.appendKeys({ id: event.id }); return true; @@ -498,6 +504,7 @@ describe('Inject Lambda Context', () => { resetKeys: true, }) public async handler(event: { id: number }, _context: Context) { + await setTimeout(1); // simulate some async operation logger.info('Processing event'); logger.appendKeys({ id: event.id }); return true; diff --git a/packages/logger/tests/unit/logBuffer.test.ts b/packages/logger/tests/unit/logBuffer.test.ts index ca1febdbce..c3d54133b5 100644 --- a/packages/logger/tests/unit/logBuffer.test.ts +++ b/packages/logger/tests/unit/logBuffer.test.ts @@ -1,3 +1,4 @@ +import { setTimeout } from 'node:timers/promises'; import context from '@aws-lambda-powertools/testing-utils/context'; import type { Context } from 'aws-lambda'; import middy from 'middy5'; @@ -283,7 +284,7 @@ describe('Buffer logs', () => { .use( injectLambdaContext(logger, { flushBufferOnUncaughtError: true }) ) - .handler(async () => { + .handler(() => { logger.debug('This is a log message'); logger.info('This is an info message'); throw new Error('This is an error'); @@ -297,6 +298,7 @@ describe('Buffer logs', () => { async handler(_event: unknown, _context: Context) { logger.debug('This is a log message'); logger.info('This is an info message'); + await setTimeout(1); // simulate some async operation throw new Error('This is an error'); } } @@ -342,7 +344,7 @@ describe('Buffer logs', () => { .use( injectLambdaContext(logger, { flushBufferOnUncaughtError: false }) ) - .handler(async () => { + .handler(() => { logger.debug('This is a log message'); logger.info('This is an info message'); throw new Error('This is an error'); @@ -356,6 +358,7 @@ describe('Buffer logs', () => { async handler(_event: unknown, _context: Context) { logger.debug('This is a log message'); logger.info('This is an info message'); + await setTimeout(1); // simulate some async operation throw new Error('This is an error'); } } diff --git a/packages/logger/tests/unit/logEvent.test.ts b/packages/logger/tests/unit/logEvent.test.ts index a694e96984..e0388ebeac 100644 --- a/packages/logger/tests/unit/logEvent.test.ts +++ b/packages/logger/tests/unit/logEvent.test.ts @@ -1,3 +1,4 @@ +import { setTimeout } from 'node:timers/promises'; import context from '@aws-lambda-powertools/testing-utils/context'; import middy from '@middy/core'; import type { Context } from 'aws-lambda'; @@ -86,6 +87,7 @@ describe('Log event', () => { class Test { @logger.injectLambdaContext({ logEvent: true }) async handler(event: unknown, _context: Context) { + await setTimeout(1); // simulate some async operation return event; } } diff --git a/packages/logger/tests/unit/setPowertoolsLogData.test.ts b/packages/logger/tests/unit/setPowertoolsLogData.test.ts deleted file mode 100644 index 696aec4438..0000000000 --- a/packages/logger/tests/unit/setPowertoolsLogData.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Logger } from '../../src/Logger.js'; -import { describe, it, expect, vi, afterEach } from 'vitest'; - -describe('Logger PowertoolsLogData environment variables', () => { - afterEach(() => { - vi.unstubAllEnvs(); - }); - - it.each([ - [undefined, ''], - ['us-west-2', 'us-west-2'], - ])('sets awsRegion to %s when AWS_REGION env var is %s', (envValue, expected) => { - // Prepare - vi.stubEnv('AWS_REGION', envValue); - // Act - const logger = new Logger(); - // Assess - expect(logger['powertoolsLogData'].awsRegion).toBe(expected); - }); - - it.each([ - [undefined, ''], - ['prd', 'prd'], - ])('sets environment to %s when ENVIRONMENT env var is %s', (envValue, expected) => { - // Prepare - vi.stubEnv('ENVIRONMENT', envValue); - // Act - const logger = new Logger(); - // Assess - expect(logger['powertoolsLogData'].environment).toBe(expected); - }); - - it.each([ - [undefined, 'service_undefined'], - ['my-service', 'my-service'], - ])('sets serviceName to %s when POWERTOOLS_SERVICE_NAME env var is %s', (envValue, expected) => { - // Prepare - vi.stubEnv('POWERTOOLS_SERVICE_NAME', envValue); - // Act - const logger = new Logger(); - // Assess - expect(logger['powertoolsLogData'].serviceName).toBe(expected); - }); -}); \ No newline at end of file diff --git a/packages/logger/tests/unit/workingWithkeys.test.ts b/packages/logger/tests/unit/workingWithkeys.test.ts index ca18259ef3..f921ef9b12 100644 --- a/packages/logger/tests/unit/workingWithkeys.test.ts +++ b/packages/logger/tests/unit/workingWithkeys.test.ts @@ -1,3 +1,4 @@ +import { setTimeout } from 'node:timers/promises'; import context from '@aws-lambda-powertools/testing-utils/context'; import middy from '@middy/core'; import type { Context } from 'aws-lambda'; @@ -439,7 +440,7 @@ describe('Working with keys', () => { foo: 'bar', }, }); - const handler = middy(async (addKey: boolean) => { + const handler = middy((addKey: boolean) => { if (addKey) { logger.appendKeys({ foo: 'baz', @@ -483,6 +484,7 @@ describe('Working with keys', () => { foo: 'baz', }); } + await setTimeout(1); // simulate some async operation logger.info('Hello, world!'); } } diff --git a/packages/metrics/package.json b/packages/metrics/package.json index 9f7ed0f48e..dbf2fc043f 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -23,6 +23,7 @@ "build": "npm run build:esm & npm run build:cjs", "lint": "biome lint .", "lint:fix": "biome check --write .", + "lint:ci": "biome ci .", "prepack": "node ../../.github/scripts/release_patch_package_json.js ." }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/metrics#readme", diff --git a/packages/metrics/src/Metrics.ts b/packages/metrics/src/Metrics.ts index f5f40b3abe..ad9e2de7f4 100644 --- a/packages/metrics/src/Metrics.ts +++ b/packages/metrics/src/Metrics.ts @@ -49,10 +49,10 @@ import type { * These metrics can be visualized through Amazon CloudWatch Console. * * **Key features** - * * Aggregating up to 100 metrics using a single CloudWatch EMF object (large JSON blob). - * * Validating your metrics against common metric definitions mistakes (for example, metric unit, values, max dimensions, max metrics). - * * Metrics are created asynchronously by the CloudWatch service. You do not need any custom stacks, and there is no impact to Lambda function latency. - * * Creating a one-off metric with different dimensions. + * - Aggregating up to 100 metrics using a single CloudWatch EMF object (large JSON blob). + * - Validating your metrics against common metric definitions mistakes (for example, metric unit, values, max dimensions, max metrics). + * - Metrics are created asynchronously by the CloudWatch service. You do not need any custom stacks, and there is no impact to Lambda function latency. + * - Creating a one-off metric with different dimensions. * * After initializing the Metrics class, you can add metrics using the {@link Metrics.addMetric | `addMetric()`} method. * The metrics are stored in a buffer and are flushed when calling {@link Metrics.publishStoredMetrics | `publishStoredMetrics()`}. @@ -1164,7 +1164,7 @@ class Metrics extends Utility implements MetricsInterface { * If this point is reached, it indicates timestamp was neither a valid number nor Date * Returning zero represents the initial date of epoch time, * which will be skipped by Amazon CloudWatch. - **/ + */ return 0; } diff --git a/packages/metrics/src/middleware/middy.ts b/packages/metrics/src/middleware/middy.ts index d06a0977e4..665261758b 100644 --- a/packages/metrics/src/middleware/middy.ts +++ b/packages/metrics/src/middleware/middy.ts @@ -60,7 +60,7 @@ const logMetrics = ( }; }; - const logMetricsBefore = async (request: MiddyLikeRequest): Promise => { + const logMetricsBefore = (request: MiddyLikeRequest) => { for (const metrics of metricsInstances) { const { throwOnEmptyMetrics, defaultDimensions, captureColdStartMetric } = options; @@ -78,7 +78,7 @@ const logMetrics = ( setCleanupFunction(request); }; - const logMetricsAfterOrError = async (): Promise => { + const logMetricsAfterOrError = () => { for (const metrics of metricsInstances) { metrics.publishStoredMetrics(); } diff --git a/packages/metrics/tests/e2e/basicFeatures.decorator.test.functionCode.ts b/packages/metrics/tests/e2e/basicFeatures.decorator.test.functionCode.ts index aa098a4abf..5cf695bfe3 100644 --- a/packages/metrics/tests/e2e/basicFeatures.decorator.test.functionCode.ts +++ b/packages/metrics/tests/e2e/basicFeatures.decorator.test.functionCode.ts @@ -32,8 +32,8 @@ class Lambda implements LambdaInterface { defaultDimensions: JSON.parse(defaultDimensions), throwOnEmptyMetrics: true, }) - public async handler(_event: unknown, _context: Context): Promise { - metrics.addMetric(metricName, metricUnit, Number.parseInt(metricValue)); + public handler(_event: unknown, _context: Context) { + metrics.addMetric(metricName, metricUnit, Number.parseInt(metricValue, 10)); metrics.addDimension( Object.entries(JSON.parse(extraDimension))[0][0], Object.entries(JSON.parse(extraDimension))[0][1] as string @@ -52,7 +52,7 @@ class Lambda implements LambdaInterface { metricWithItsOwnDimensions.addMetric( singleMetricName, singleMetricUnit, - Number.parseInt(singleMetricValue) + Number.parseInt(singleMetricValue, 10) ); } } diff --git a/packages/metrics/tests/e2e/basicFeatures.decorators.test.ts b/packages/metrics/tests/e2e/basicFeatures.decorators.test.ts index 2858aec832..063c393494 100644 --- a/packages/metrics/tests/e2e/basicFeatures.decorators.test.ts +++ b/packages/metrics/tests/e2e/basicFeatures.decorators.test.ts @@ -168,7 +168,7 @@ describe('Metrics E2E tests, basic features decorator usage', () => { ? metricStat.Datapoints[0] : {}; expect(singleDataPoint?.Sum).toBeGreaterThanOrEqual( - Number.parseInt(expectedMetricValue) * invocations + Number.parseInt(expectedMetricValue, 10) * invocations ); }); }); diff --git a/packages/metrics/tests/e2e/basicFeatures.manual.test.functionCode.ts b/packages/metrics/tests/e2e/basicFeatures.manual.test.functionCode.ts index e72736189d..f383d0c48b 100644 --- a/packages/metrics/tests/e2e/basicFeatures.manual.test.functionCode.ts +++ b/packages/metrics/tests/e2e/basicFeatures.manual.test.functionCode.ts @@ -25,14 +25,11 @@ const singleMetricValue = process.env.EXPECTED_SINGLE_METRIC_VALUE ?? '2'; const metrics = new Metrics({ namespace: namespace, serviceName: serviceName }); -export const handler = async ( - _event: unknown, - _context: Context -): Promise => { +export const handler = (_event: unknown, _context: Context) => { metrics.captureColdStartMetric(); metrics.throwOnEmptyMetrics(); metrics.setDefaultDimensions(JSON.parse(defaultDimensions)); - metrics.addMetric(metricName, metricUnit, Number.parseInt(metricValue)); + metrics.addMetric(metricName, metricUnit, Number.parseInt(metricValue, 10)); metrics.addDimension( Object.entries(JSON.parse(extraDimension))[0][0], Object.entries(JSON.parse(extraDimension))[0][1] as string @@ -46,7 +43,7 @@ export const handler = async ( metricWithItsOwnDimensions.addMetric( singleMetricName, singleMetricUnit, - Number.parseInt(singleMetricValue) + Number.parseInt(singleMetricValue, 10) ); metrics.publishStoredMetrics(); diff --git a/packages/metrics/tests/e2e/basicFeatures.manual.test.ts b/packages/metrics/tests/e2e/basicFeatures.manual.test.ts index 1fb1e40528..31fb75846b 100644 --- a/packages/metrics/tests/e2e/basicFeatures.manual.test.ts +++ b/packages/metrics/tests/e2e/basicFeatures.manual.test.ts @@ -154,7 +154,7 @@ describe('Metrics E2E tests, manual usage', () => { ? metricStat.Datapoints[0] : {}; expect(singleDataPoint.Sum).toBeGreaterThanOrEqual( - Number.parseInt(expectedMetricValue) * invocations + Number.parseInt(expectedMetricValue, 10) * invocations ); }); }); diff --git a/packages/metrics/tests/helpers/metricsUtils.ts b/packages/metrics/tests/helpers/metricsUtils.ts index 35bf3407d7..78718650a4 100644 --- a/packages/metrics/tests/helpers/metricsUtils.ts +++ b/packages/metrics/tests/helpers/metricsUtils.ts @@ -6,7 +6,7 @@ import { } from '@aws-sdk/client-cloudwatch'; import promiseRetry from 'promise-retry'; -const getMetrics = async ( +const getMetrics = ( cloudWatchClient: CloudWatchClient, namespace: string, metric: string, diff --git a/packages/metrics/tests/unit/logMetrics.test.ts b/packages/metrics/tests/unit/logMetrics.test.ts index 97c6ba7be9..62ec0ed77c 100644 --- a/packages/metrics/tests/unit/logMetrics.test.ts +++ b/packages/metrics/tests/unit/logMetrics.test.ts @@ -1,3 +1,4 @@ +import { setTimeout } from 'node:timers/promises'; import { cleanupMiddlewares } from '@aws-lambda-powertools/commons'; import middy from '@middy/core'; import type { Context } from 'aws-lambda'; @@ -39,6 +40,7 @@ describe('LogMetrics decorator & Middy.js middleware', () => { @metrics.logMetrics({ captureColdStartMetric: true }) async handler(_event: unknown, _context: Context) { + await setTimeout(0); // Simulate some async operation this.addGreetingMetric(); } @@ -105,6 +107,7 @@ describe('LogMetrics decorator & Middy.js middleware', () => { @metrics.logMetrics({ captureColdStartMetric: true }) async handler(_event: unknown, _context: Context) { + await setTimeout(0); // Simulate some async operation this.addGreetingMetric(); } @@ -150,6 +153,7 @@ describe('LogMetrics decorator & Middy.js middleware', () => { @metrics.logMetrics({ captureColdStartMetric: true }) async handler(_event: unknown, _context: Context) { + await setTimeout(0); // Simulate some async operation this.addGreetingMetric(); } @@ -184,6 +188,7 @@ describe('LogMetrics decorator & Middy.js middleware', () => { }); vi.spyOn(metrics, 'publishStoredMetrics'); const handler = middy(async () => { + await setTimeout(0); // Simulate some async operation metrics.addMetric('greetings', MetricUnit.Count, 1); }).use(logMetrics(metrics, { captureColdStartMetric: true })); @@ -210,7 +215,7 @@ describe('LogMetrics decorator & Middy.js middleware', () => { }); vi.spyOn(metrics, 'publishStoredMetrics'); - const handler = middy(async () => { + const handler = middy(() => { metrics.addMetric('greetings', MetricUnit.Count, 1); }).use(logMetrics(metrics, { captureColdStartMetric: true })); @@ -238,7 +243,7 @@ describe('LogMetrics decorator & Middy.js middleware', () => { }); vi.spyOn(metrics, 'publishStoredMetrics'); - const handler = middy(async () => { + const handler = middy(() => { metrics.addMetric('greetings', MetricUnit.Count, 1); }).use(logMetrics(metrics, { captureColdStartMetric: true })); @@ -266,6 +271,7 @@ describe('LogMetrics decorator & Middy.js middleware', () => { class Test { @metrics.logMetrics({ defaultDimensions: { environment: 'test' } }) async handler(_event: unknown, _context: Context) { + await setTimeout(0); // Simulate some async operation metrics.addMetric('test', MetricUnit.Count, 1); } } @@ -295,6 +301,7 @@ describe('LogMetrics decorator & Middy.js middleware', () => { }); vi.spyOn(metrics, 'publishStoredMetrics'); const handler = middy(async () => { + await setTimeout(0); // Simulate some async operation metrics.addMetric('greetings', MetricUnit.Count, 1); }).use( logMetrics(metrics, { @@ -328,6 +335,7 @@ describe('LogMetrics decorator & Middy.js middleware', () => { class Test { @metrics.logMetrics() async handler(_event: unknown, _context: Context) { + await setTimeout(0); // Simulate some async operation throw new Error('Something went wrong'); } } @@ -349,6 +357,7 @@ describe('LogMetrics decorator & Middy.js middleware', () => { class Test { @metrics.logMetrics({ throwOnEmptyMetrics: true }) async handler(_event: unknown, _context: Context) { + await setTimeout(0); // Simulate some async operation return 'Hello, world!'; } } @@ -367,12 +376,12 @@ describe('LogMetrics decorator & Middy.js middleware', () => { singleMetric: false, namespace: DEFAULT_NAMESPACE, }); - const handler = middy(async () => {}).use( - logMetrics([metrics], { throwOnEmptyMetrics: true }) - ); + const handler = middy(async () => { + await setTimeout(0); // Simulate some async operation + }).use(logMetrics([metrics], { throwOnEmptyMetrics: true })); // Act & Assess - expect(() => handler({}, {} as Context)).rejects.toThrowError( + await expect(() => handler({}, {} as Context)).rejects.toThrowError( 'The number of metrics recorded must be higher than zero' ); }); diff --git a/packages/parameters/package.json b/packages/parameters/package.json index 56a4cfae5f..17f2f3dc4c 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -23,6 +23,7 @@ "build": "npm run build:esm & npm run build:cjs", "lint": "biome lint .", "lint:fix": "biome check --write .", + "lint:ci": "biome ci .", "prepack": "node ../../.github/scripts/release_patch_package_json.js ." }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/parameters#readme", diff --git a/packages/parameters/src/appconfig/AppConfigProvider.ts b/packages/parameters/src/appconfig/AppConfigProvider.ts index 1975968c99..c78bdadf26 100644 --- a/packages/parameters/src/appconfig/AppConfigProvider.ts +++ b/packages/parameters/src/appconfig/AppConfigProvider.ts @@ -14,15 +14,12 @@ import type { } from '../types/AppConfigProvider.js'; /** - * ## Intro - * The Parameters utility provides an AppConfigProvider that allows to retrieve configuration profiles from AWS AppConfig. - * - * ## Getting started + * The Parameters utility provides an `AppConfigProvider` that allows to retrieve configuration profiles from AWS AppConfig. * * This utility supports AWS SDK v3 for JavaScript only (`@aws-sdk/client-appconfigdata`). This allows the utility to be modular, and you to install only * the SDK packages you need and keep your bundle size small. * - * ## Basic usage + * **Basic usage** * * @example * ```typescript @@ -41,9 +38,7 @@ import type { * ``` * If you want to retrieve configs without customizing the provider, you can use the {@link getAppConfig} function instead. * - * ## Advanced usage - * - * ### Caching + * **Caching** * * By default, the provider will cache parameters retrieved in-memory for 5 seconds. * You can adjust how long values should be kept in cache by using the `maxAge` parameter. @@ -82,7 +77,7 @@ import type { * }; * ``` * - * ### Transformations + * **Transformations** * * For configurations stored as freeform JSON, Freature Flag, you can use the transform argument for deserialization. This will return a JavaScript object instead of a string. * @@ -118,7 +113,7 @@ import type { * }; * ``` * - * ### Extra SDK options + * **Extra SDK options** * * When retrieving a configuration profile, you can pass extra options to the AWS SDK v3 for JavaScript client by using the `sdkOptions` parameter. * @@ -144,7 +139,7 @@ import type { * * This object accepts the same options as the [AWS SDK v3 for JavaScript AppConfigData client](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-appconfigdata/interfaces/startconfigurationsessioncommandinput.html). * - * ### Customize AWS SDK v3 for JavaScript client + * **Customize AWS SDK v3 for JavaScript client** * * By default, the provider will create a new AppConfigData client using the default configuration. * @@ -192,21 +187,20 @@ class AppConfigProvider extends BaseProvider { private readonly application?: string; private readonly environment: string; - /** - * It initializes the AppConfigProvider class. - * * - * @param {AppConfigProviderOptions} options - The configuration object. - */ - public constructor(options: AppConfigProviderOptions) { + public constructor({ + application, + environment, + clientConfig, + awsSdkV3Client, + }: AppConfigProviderOptions) { super({ awsSdkV3ClientPrototype: AppConfigDataClient as new ( config?: unknown ) => AppConfigDataClient, - clientConfig: options.clientConfig, - awsSdkV3Client: options.awsSdkV3Client, + clientConfig, + awsSdkV3Client, }); - const { application, environment } = options; this.application = application ?? getServiceName(); if (!this.application || this.application.trim().length === 0) { throw new Error( @@ -235,26 +229,23 @@ class AppConfigProvider extends BaseProvider { * }; * ``` * - * You can customize the retrieval of the configuration profile by passing options to the function: - * * `maxAge` - The maximum age of the value in cache before fetching a new one (in seconds) (default: 5) - * * `forceFetch` - Whether to always fetch a new value from the store regardless if already available in cache - * * `transform` - Whether to transform the value before returning it. Supported values: `json`, `binary` - * * `sdkOptions` - Extra options to pass to the AWS SDK v3 for JavaScript client - * - * For usage examples check {@link AppConfigProvider}. - * - * @param {string} name - The name of the configuration profile or its ID - * @param {AppConfigGetOptions} options - Options to configure the provider * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * + * @param name - The name of the configuration profile to retrieve + * @param options - Optional options to configure the provider + * @param options.maxAge - Optional maximum age of the value in the cache, in seconds (default: `5`) + * @param options.forceFetch - Optional flag to always fetch a new value from the store regardless if already available in cache (default: `false`) + * @param options.transform - Optional transform to be applied, can be `json` or `binary` + * @param options.sdkOptions - Optional additional options to pass to the AWS SDK v3 client, supports all options from {@link StartConfigurationSessionCommandInput | `StartConfigurationSessionCommandInput`} except `ApplicationIdentifier`, `EnvironmentIdentifier`, and `ConfigurationProfileIdentifier` */ - public async get< + public get< ExplicitUserProvidedType = undefined, InferredFromOptionsType extends | AppConfigGetOptions | undefined = AppConfigGetOptions, >( name: string, - options?: InferredFromOptionsType & AppConfigGetOptions + options?: NonNullable ): Promise< | AppConfigGetOutput | undefined @@ -287,12 +278,16 @@ class AppConfigProvider extends BaseProvider { * polls the configuration multiple times, we return the most recent value by returning the cached * one if an empty response is returned by AppConfig. * - * @param {string} name - Name of the configuration or its ID - * @param {AppConfigGetOptions} options - SDK options to propagate to `StartConfigurationSession` API call + * @param name - Name of the configuration or its ID + * @param options - SDK options to propagate to `StartConfigurationSession` API call + * @param options.maxAge - Maximum age of the value in the cache, in seconds. + * @param options.forceFetch - Force fetch the value from the parameter store, ignoring the cache. + * @param options.sdkOptions - Additional options to pass to the AWS SDK v3 client. Supports all options from {@link StartConfigurationSessionCommandInput | `StartConfigurationSessionCommandInput`} except `ApplicationIdentifier`, `EnvironmentIdentifier`, and `ConfigurationProfileIdentifier`. + * @param options.transform - Optional transform to be applied, can be 'json' or 'binary'. */ protected async _get( name: string, - options?: AppConfigGetOptions + options?: NonNullable ): Promise { if ( !this.configurationTokenStore.has(name) || @@ -339,7 +334,7 @@ class AppConfigProvider extends BaseProvider { /** When the response is not empty, stash the result locally before returning * See AppConfig docs: * {@link https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-retrieving-the-configuration.html} - **/ + */ if ( response.Configuration !== undefined && response.Configuration?.length > 0 @@ -358,7 +353,7 @@ class AppConfigProvider extends BaseProvider { * * @throws Not Implemented Error. */ - protected async _getMultiple( + protected _getMultiple( _path: string, _sdkOptions?: unknown ): Promise | undefined> { diff --git a/packages/parameters/src/appconfig/getAppConfig.ts b/packages/parameters/src/appconfig/getAppConfig.ts index aa73d49741..0a3e11996a 100644 --- a/packages/parameters/src/appconfig/getAppConfig.ts +++ b/packages/parameters/src/appconfig/getAppConfig.ts @@ -6,39 +6,30 @@ import type { import { AppConfigProvider } from './AppConfigProvider.js'; /** - * ## Intro - * The Parameters utility provides an AppConfigProvider that allows to retrieve configuration profiles from AWS AppConfig. + * The Parameters utility provides an `AppConfigProvider` that allows to retrieve configuration profiles from AWS AppConfig. * - * ## Getting started - * - * This utility supports AWS SDK v3 for JavaScript only. This allows the utility to be modular, and you to install only + * This utility supports AWS SDK v3 for JavaScript only (`@aws-sdk/client-appconfigdata`). This allows the utility to be modular, and you to install only * the SDK packages you need and keep your bundle size small. * - * To use the provider, you must install the Parameters utility and the AWS SDK v3 for JavaScript for AppConfig: - * - * ```sh - * npm install @aws-lambda-powertools/parameters @aws-sdk/client-appconfigdata - * ``` - * - * ## Basic usage + * **Basic usage** * * @example * ```typescript * import { getAppConfig } from '@aws-lambda-powertools/parameters/appconfig'; * + * const encodedConfig = await getAppConfig('my-config', { + * application: 'my-app', + * environment: 'prod', + * }); + * const config = new TextDecoder('utf-8').decode(encodedConfig); + * * export const handler = async (): Promise => { - * // Retrieve a configuration profile - * const encodedConfig = await getAppConfig('my-config', { - * application: 'my-app', - * environment: 'prod', - * }); - * const config = new TextDecoder('utf-8').decode(encodedConfig); + * // Use the config variable as needed + * console.log(config); * }; * ``` * - * ## Advanced usage - * - * ### Caching + * **Caching** * * By default, the provider will cache parameters retrieved in-memory for 5 seconds. * You can adjust how long values should be kept in cache by using the `maxAge` parameter. @@ -47,13 +38,15 @@ import { AppConfigProvider } from './AppConfigProvider.js'; * ```typescript * import { getAppConfig } from '@aws-lambda-powertools/parameters/appconfig'; * + * const encodedConfig = await getAppConfig('my-config', { + * application: 'my-app', + * environment: 'prod', + * maxAge: 10, // Cache for 10 seconds + * }); + * const config = new TextDecoder('utf-8').decode(encodedConfig); + * * export const handler = async (): Promise => { - * // Retrieve a configuration profile and cache it for 10 seconds - * const encodedConfig = await getAppConfig('my-config', { - * application: 'my-app', - * environment: 'prod', - * }); - * const config = new TextDecoder('utf-8').decode(encodedConfig); + * // Use the config variable as needed * }; * ``` * @@ -63,18 +56,20 @@ import { AppConfigProvider } from './AppConfigProvider.js'; * ```typescript * import { getAppConfig } from '@aws-lambda-powertools/parameters/appconfig'; * + * const encodedConfig = await getAppConfig('my-config', { + * application: 'my-app', + * environment: 'prod', + * forceFetch: true, // Always fetch the latest value + * }); + * const config = new TextDecoder('utf-8').decode(encodedConfig); + * * export const handler = async (): Promise => { - * // Retrieve a config and always fetch the latest value - * const config = await getAppConfig('my-config', { - * application: 'my-app', - * environment: 'prod', - * forceFetch: true, - * }); - * const config = new TextDecoder('utf-8').decode(encodedConfig); + * // Use the config variable as needed + * console.log * }; * ``` * - * ### Transformations + * **Transformations** * * For configurations stored as freeform JSON, Freature Flag, you can use the transform argument for deserialization. This will return a JavaScript object instead of a string. * @@ -82,13 +77,16 @@ import { AppConfigProvider } from './AppConfigProvider.js'; * ```typescript * import { getAppConfig } from '@aws-lambda-powertools/parameters/appconfig'; * + * // Retrieve a JSON config and parse it as JSON + * const encodedConfig = await getAppConfig('my-config', { + * application: 'my-app', + * environment: 'prod', + * transform: 'json' + * }); + * * export const handler = async (): Promise => { - * // Retrieve a JSON config or Feature Flag and parse it as JSON - * const config = await getAppConfig('my-config', { - * application: 'my-app', - * environment: 'prod', - * transform: 'json' - * }); + * // Use the config variable as needed + * console.log(config); * }; * ``` * @@ -108,7 +106,7 @@ import { AppConfigProvider } from './AppConfigProvider.js'; * }; * ``` * - * ### Extra SDK options + * **Extra SDK options** * * When retrieving a configuration profile, you can pass extra options to the AWS SDK v3 for JavaScript client by using the `sdkOptions` parameter. * @@ -131,15 +129,18 @@ import { AppConfigProvider } from './AppConfigProvider.js'; * * This object accepts the same options as the [AWS SDK v3 for JavaScript AppConfigData client](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-appconfigdata/interfaces/startconfigurationsessioncommandinput.html). * - * ### Built-in provider class + * For greater flexibility such as configuring the underlying SDK client used by built-in providers, you can use the {@link AppConfigProvider | `AppConfigProvider`} class. * - * For greater flexibility such as configuring the underlying SDK client used by built-in providers, you can use the {@link AppConfigProvider} class. - * - * For more usage examples, see [our documentation](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/). - * - * @param {string} name - The name of the configuration profile or its ID - * @param {GetAppConfigOptions} options - Options to configure the provider * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * + * @param name - The name of the configuration profile to retrieve + * @param options - Options to configure the provider + * @param options.application - The application ID or the application name + * @param options.environment - The environment ID or the environment name + * @param options.maxAge - Optional maximum age of the value in the cache, in seconds (default: `5`) + * @param options.forceFetch - Optional flag to always fetch a new value from the store regardless if already available in cache (default: `false`) + * @param options.transform - Optional transform to be applied, can be `json` or `binary` + * @param options.sdkOptions - Optional additional options to pass to the AWS SDK v3 client, supports all options from {@link StartConfigurationSessionCommandInput | `StartConfigurationSessionCommandInput`} except `ApplicationIdentifier`, `EnvironmentIdentifier`, and `ConfigurationProfileIdentifier` */ const getAppConfig = < ExplicitUserProvidedType = undefined, @@ -148,7 +149,7 @@ const getAppConfig = < | undefined = GetAppConfigOptions, >( name: string, - options: InferredFromOptionsType & GetAppConfigOptions + options: NonNullable ): Promise< | AppConfigGetOutput | undefined diff --git a/packages/parameters/src/dynamodb/DynamoDBProvider.ts b/packages/parameters/src/dynamodb/DynamoDBProvider.ts index 2678d31113..a35127e2e4 100644 --- a/packages/parameters/src/dynamodb/DynamoDBProvider.ts +++ b/packages/parameters/src/dynamodb/DynamoDBProvider.ts @@ -18,15 +18,12 @@ import type { } from '../types/DynamoDBProvider.js'; /** - * ## Intro - * The Parameters utility provides a DynamoDBProvider that allows to retrieve values from Amazon DynamoDB. - * - * ## Getting started + * The Parameters utility provides a `DynamoDBProvider` that allows to retrieve values from Amazon DynamoDB. * * This utility supports AWS SDK v3 for JavaScript only (`@aws-sdk/client-dynamodb` and `@aws-sdk/util-dynamodb`). This allows the utility to be modular, and you to install only * the SDK packages you need and keep your bundle size small. * - * ## Basic usage + * **Basic usage** * * Retrieve a value from DynamoDB: * @@ -60,9 +57,7 @@ import type { * }; * ``` * - * ## Advanced usage - * - * ### Caching + * **Caching** * * By default, the provider will cache parameters retrieved in-memory for 5 seconds. * You can adjust how long values should be kept in cache by using the `maxAge` parameter. @@ -101,7 +96,7 @@ import type { * }; * ``` * - * ### Transformations + * **Transformations** * * For values stored as JSON you can use the transform argument for deserialization. This will return a JavaScript object instead of a string. * @@ -157,7 +152,7 @@ import type { * }; * ``` * - * ### Custom key names + * **Custom key names** * * By default, the provider will use the following key names: `id` for the partition key, `sk` for the sort key, and `value` for the value. * You can adjust the key names by using the `keyAttr`, `sortAttr`, and `valueAttr` parameters. @@ -174,7 +169,7 @@ import type { * }); * ``` * - * ### Extra SDK options + * **Extra SDK options** * * When retrieving values, you can pass extra options to the AWS SDK v3 for JavaScript client by using the `sdkOptions` parameter. * @@ -198,7 +193,7 @@ import type { * * The objects accept the same options as respectively the [AWS SDK v3 for JavaScript PutItem command](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-dynamodb/classes/putitemcommand.html) and the [AWS SDK v3 for JavaScript DynamoDB client Query command](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-dynamodb/classes/querycommand.html). * - * ### Customize AWS SDK v3 for JavaScript client + * **Customize AWS SDK v3 for JavaScript client** * * By default, the provider will create a new DynamoDB client using the default configuration. * @@ -239,11 +234,6 @@ class DynamoDBProvider extends BaseProvider { protected tableName: string; protected valueAttr = 'value'; - /** - * It initializes the DynamoDBProvider class. - * - * @param {DynamoDBProviderOptions} config - The configuration object. - */ public constructor(config: DynamoDBProviderOptions) { super({ awsSdkV3ClientPrototype: DynamoDBClient as new ( @@ -276,26 +266,23 @@ class DynamoDBProvider extends BaseProvider { * }; * ``` * - * You can customize the retrieval of the value by passing options to the function: - * * `maxAge` - The maximum age of the value in cache before fetching a new one (in seconds) (default: 5) - * * `forceFetch` - Whether to always fetch a new value from the store regardless if already available in cache - * * `transform` - Whether to transform the value before returning it. Supported values: `json`, `binary` - * * `sdkOptions` - Extra options to pass to the AWS SDK v3 for JavaScript client - * - * For usage examples check {@link DynamoDBProvider}. - * - * @param {string} name - The name of the value to retrieve (i.e. the partition key) - * @param {DynamoDBGetOptionsInterface} options - Options to configure the provider * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * + * @param name - The name of the value to retrieve (partition key) + * @param options - Optional options to configure the provider + * @param options.maxAge - Optional maximum age of the value in the cache, in seconds (default: `5`) + * @param options.forceFetch - Optional flag to always fetch a new value from the store regardless if already available in cache (default: `false`) + * @param options.transform - Optional transform to be applied, can be `json` or `binary` + * @param options.sdkOptions - Optional additional options to pass to the AWS SDK v3 client, supports all options from {@link GetItemCommandInput | `GetItemCommandInput`} except `Key`, `TableName`, and `ProjectionExpression` */ - public async get< + public get< ExplicitUserProvidedType = undefined, InferredFromOptionsType extends | DynamoDBGetOptions | undefined = DynamoDBGetOptions, >( name: string, - options?: InferredFromOptionsType & DynamoDBGetOptions + options?: NonNullable ): Promise< | DynamoDBGetOutput | undefined @@ -323,27 +310,24 @@ class DynamoDBProvider extends BaseProvider { * }; * ``` * - * You can customize the retrieval of the values by passing options to the function: - * * `maxAge` - The maximum age of the value in cache before fetching a new one (in seconds) (default: 5) - * * `forceFetch` - Whether to always fetch a new value from the store regardless if already available in cache - * * `transform` - Whether to transform the value before returning it. Supported values: `json`, `binary` - * * `sdkOptions` - Extra options to pass to the AWS SDK v3 for JavaScript client - * * `throwOnTransformError` - Whether to throw an error if the transform fails (default: `true`) - * - * For usage examples check {@link DynamoDBProvider}. - * - * @param {string} path - The path of the values to retrieve (i.e. the partition key) - * @param {DynamoDBGetMultipleOptions} options - Options to configure the provider * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * + * @param path - The path of the values to retrieve (partition key) + * @param options - Optional options to configure the provider + * @param options.maxAge - Optional maximum age of the value in the cache, in seconds (default: `5`) + * @param options.forceFetch - Optional flag to always fetch a new value from the store regardless if already available in cache (default: `false`) + * @param options.transform - Optional transform to be applied, can be `json` or `binary` + * @param options.sdkOptions - Optional additional options to pass to the AWS SDK v3 client, supports all options from {@link QueryCommandInput | `QueryCommandInput`} except `TableName` and `KeyConditionExpression` + * @param options.throwOnTransformError - Optional flag to throw an error if the transform fails (default: `true`) */ - public async getMultiple< + public getMultiple< ExplicitUserProvidedType = undefined, InferredFromOptionsType extends | DynamoDBGetMultipleOptions | undefined = DynamoDBGetMultipleOptions, >( path: string, - options?: InferredFromOptionsType & DynamoDBGetMultipleOptions + options?: NonNullable ): Promise< | DynamoDBGetMultipleOutput< ExplicitUserProvidedType, @@ -363,12 +347,16 @@ class DynamoDBProvider extends BaseProvider { /** * Retrieve an item from Amazon DynamoDB. * - * @param {string} name - Key of the item to retrieve (i.e. the partition key) - * @param {DynamoDBGetOptions} options - Options to customize the retrieval + * @param name - Key of the item to retrieve (i.e. the partition key) + * @param options - Options to customize the retrieval + * @param options.maxAge - Maximum age of the value in the cache, in seconds. + * @param options.sdkOptions - Additional options to pass to the AWS SDK v3 client, supports all options from {@link GetItemCommandInput | `GetItemCommandInput`} except `Key`, `TableName`, and `ProjectionExpression`. + * @param options.forceFetch - Force fetch the value from the parameter store, ignoring the cache. + * @param options.transform - Transform to be applied, can be 'json' or 'binary'. */ protected async _get( name: string, - options?: DynamoDBGetOptions + options?: NonNullable ): Promise { const sdkOptions: GetItemCommandInput = { ...(options?.sdkOptions || {}), @@ -387,12 +375,17 @@ class DynamoDBProvider extends BaseProvider { /** * Retrieve multiple items from Amazon DynamoDB. * - * @param {string} path - The path of the values to retrieve (i.e. the partition key) - * @param {DynamoDBGetMultipleOptions} options - Options to customize the retrieval + * @param path - The path of the values to retrieve (i.e. the partition key) + * @param options - Options to customize the retrieval + * @param options.maxAge - Maximum age of the value in the cache, in seconds. + * @param options.forceFetch - Force fetch the value from the parameter store, ignoring the cache. + * @param options.sdkOptions - Additional options to pass to the AWS SDK v3 client, supports all options from {@link QueryCommandInput | `QueryCommandInput`} except `TableName` and `KeyConditionExpression`. + * @param options.transform - Transform to be applied, can be 'json' or 'binary'. + * @param options.throwOnTransformError - Whether to throw an error if the transform fails (default: `true`) */ protected async _getMultiple( path: string, - options?: DynamoDBGetMultipleOptions + options?: NonNullable ): Promise> { const sdkOptions: QueryCommandInput = { ...(options?.sdkOptions || {}), diff --git a/packages/parameters/src/secrets/SecretsProvider.ts b/packages/parameters/src/secrets/SecretsProvider.ts index 134e788536..f247a7aca8 100644 --- a/packages/parameters/src/secrets/SecretsProvider.ts +++ b/packages/parameters/src/secrets/SecretsProvider.ts @@ -11,15 +11,12 @@ import type { } from '../types/SecretsProvider.js'; /** - * ## Intro - * The Parameters utility provides a SecretsProvider that allows to retrieve secrets from AWS Secrets Manager. - * - * ## Getting started + * The Parameters utility provides a `SecretsProvider` that allows to retrieve secrets from AWS Secrets Manager. * * This utility supports AWS SDK v3 for JavaScript only (`@aws-sdk/client-secrets-manager`). This allows the utility to be modular, and you to install only * the SDK packages you need and keep your bundle size small. * - * ## Basic usage + * **Basic usage** * * @example * ```typescript @@ -35,9 +32,7 @@ import type { * * If you want to retrieve secrets without customizing the provider, you can use the {@link getSecret} function instead. * - * ## Advanced usage - * - * ### Caching + * **Caching** * * By default, the provider will cache parameters retrieved in-memory for 5 seconds. * You can adjust how long values should be kept in cache by using the `maxAge` parameter. @@ -68,7 +63,7 @@ import type { * }; * ``` * - * ### Transformations + * **Transformations** * * For parameters stored in JSON or Base64 format, you can use the transform argument for deserialization. * @@ -84,7 +79,7 @@ import type { * }; * ``` * - * ### Extra SDK options + * **Extra SDK options** * * When retrieving a secret, you can pass extra options to the AWS SDK v3 for JavaScript client by using the `sdkOptions` parameter. * @@ -106,7 +101,7 @@ import type { * * This object accepts the same options as the [AWS SDK v3 for JavaScript Secrets Manager client](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-secrets-manager/interfaces/getsecretvaluecommandinput.html). * - * ### Customize AWS SDK v3 for JavaScript client + * **Customize AWS SDK v3 for JavaScript client** * * By default, the provider will create a new Secrets Manager client using the default configuration. * @@ -140,18 +135,12 @@ import type { * * For more usage examples, see [our documentation](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/). * - * @class * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ */ class SecretsProvider extends BaseProvider { public declare client: SecretsManagerClient; - /** - * It initializes the SecretsProvider class. - * - * @param {SecretsProviderOptions} config - The configuration object. - */ - public constructor(config?: SecretsProviderOptions) { + public constructor(config?: NonNullable) { super({ awsSdkV3ClientPrototype: SecretsManagerClient as new ( config?: unknown @@ -175,26 +164,23 @@ class SecretsProvider extends BaseProvider { * }; * ``` * - * You can customize the retrieval of the secret by passing options to the function: - * * `maxAge` - The maximum age of the value in cache before fetching a new one (in seconds) (default: 5) - * * `forceFetch` - Whether to always fetch a new value from the store regardless if already available in cache - * * `transform` - Whether to transform the value before returning it. Supported values: `json`, `binary` - * * `sdkOptions` - Extra options to pass to the AWS SDK v3 for JavaScript client - * - * For usage examples check {@link SecretsProvider}. - * - * @param {string} name - The name of the secret - * @param {SecretsGetOptions} options - Options to customize the retrieval of the secret * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * + * @param name - The name of the secret to retrieve + * @param options - Optional options to configure the provider + * @param options.maxAge - Optional maximum age of the value in the cache, in seconds (default: `5`) + * @param options.forceFetch - Optional flag to always fetch a new value from the store regardless if already available in cache (default: `false`) + * @param options.transform - Optional transform to be applied, can be `json` or `binary` + * @param options.sdkOptions - Optional additional options to pass to the AWS SDK v3 client, supports all options from {@link GetSecretValueCommandInput | `GetSecretValueCommandInput`} except `SecretId` */ - public async get< + public get< ExplicitUserProvidedType = undefined, InferredFromOptionsType extends | SecretsGetOptions | undefined = SecretsGetOptions, >( name: string, - options?: InferredFromOptionsType & SecretsGetOptions + options?: NonNullable ): Promise< | SecretsGetOutput | undefined @@ -206,7 +192,7 @@ class SecretsProvider extends BaseProvider { } /** - * Retrieving multiple parameter values is not supported with AWS Secrets Manager. + * Retrieving multiple secrets is not supported with AWS Secrets Manager. */ /* v8 ignore start */ public async getMultiple( path: string, @@ -216,14 +202,15 @@ class SecretsProvider extends BaseProvider { } /* v8 ignore stop */ /** - * Retrieve a configuration from AWS Secrets Manager. + * Retrieve a secret from AWS Secrets Manager. * - * @param {string} name - Name of the configuration or its ID - * @param {SecretsGetOptions} options - SDK options to propagate to the AWS SDK v3 for JavaScript client + * @param name - Name of the secret or its ID + * @param options - SDK options to propagate to the AWS SDK v3 for JavaScript client + * @param options.sdkOptions - Extra options to pass to the AWS SDK v3 for JavaScript client, accepts the same options as {@link GetSecretValueCommandInput | `GetSecretValueCommandInput`} except `SecretId`. */ protected async _get( name: string, - options?: SecretsGetOptions + options?: NonNullable ): Promise { const sdkOptions: GetSecretValueCommandInput = { ...(options?.sdkOptions || {}), @@ -240,11 +227,11 @@ class SecretsProvider extends BaseProvider { } /** - * Retrieving multiple parameter values is not supported with AWS Secrets Manager. + * Retrieving multiple secrets is not supported with AWS Secrets Manager. * * @throws Not Implemented Error. */ - protected async _getMultiple( + protected _getMultiple( _path: string, _options?: unknown ): Promise | undefined> { diff --git a/packages/parameters/src/secrets/getSecret.ts b/packages/parameters/src/secrets/getSecret.ts index 6b47a3cc75..f1d04849e2 100644 --- a/packages/parameters/src/secrets/getSecret.ts +++ b/packages/parameters/src/secrets/getSecret.ts @@ -6,21 +6,12 @@ import type { import { SecretsProvider } from './SecretsProvider.js'; /** - * ## Intro - * The Parameters utility provides a SecretsProvider that allows to retrieve secrets from AWS Secrets Manager. - * - * ## Getting started + * The Parameters utility provides a `SecretsProvider` that allows to retrieve secrets from AWS Secrets Manager. * * This utility supports AWS SDK v3 for JavaScript only. This allows the utility to be modular, and you to install only * the SDK packages you need and keep your bundle size small. * - * To use the provider, you must install the Parameters utility and the AWS SDK v3 for JavaScript for Secrets Manager: - * - * ```sh - * npm install @aws-lambda-powertools/parameters @aws-sdk/client-secrets-manager - * ``` - * - * ## Basic usage + * **Basic usage** * * @example * ```typescript @@ -32,9 +23,7 @@ import { SecretsProvider } from './SecretsProvider.js'; * }; * ``` * - * ## Advanced usage - * - * ### Caching + * **Caching** * * By default, the provider will cache parameters retrieved in-memory for 5 seconds. * You can adjust how long values should be kept in cache by using the `maxAge` parameter. @@ -61,7 +50,7 @@ import { SecretsProvider } from './SecretsProvider.js'; * }; * ``` * - * ### Transformations + * **Transformations** * * For parameters stored as JSON or base64-encoded strings, you can use the transform argument set to `json` or `binary` for deserialization. * @@ -75,7 +64,7 @@ import { SecretsProvider } from './SecretsProvider.js'; * }; * ``` * - * ### Extra SDK options + * **Extra SDK options** * * When retrieving a secret, you can pass extra options to the AWS SDK v3 for JavaScript client by using the `sdkOptions` parameter. * @@ -95,25 +84,27 @@ import { SecretsProvider } from './SecretsProvider.js'; * * This object accepts the same options as the [AWS SDK v3 for JavaScript Secrets Manager client](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-secrets-manager/interfaces/getsecretvaluecommandinput.html). * - * ### Built-in provider class + * **Built-in provider class** * * For greater flexibility such as configuring the underlying SDK client used by built-in providers, you can use the {@link SecretsProvider} class. * - * For more usage examples, see [our documentation](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/). - * - * - * @param {string} name - The name of the secret to retrieve - * @param {SecretsGetOptions} options - Options to configure the provider * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * + * @param name - The name of the secret to retrieve + * @param options - Optional options to configure the provider + * @param options.maxAge - Optional maximum age of the value in the cache, in seconds (default: `5`) + * @param options.forceFetch - Optional flag to always fetch a new value from the store regardless if already available in cache (default: `false`) + * @param options.transform - Optional transform to be applied, can be `json` or `binary` + * @param options.sdkOptions - Optional additional options to pass to the AWS SDK v3 client, supports all options from {@link GetSecretValueCommandInput | `GetSecretValueCommandInput`} except `SecretId` */ -const getSecret = async < +const getSecret = < ExplicitUserProvidedType = undefined, InferredFromOptionsType extends | SecretsGetOptions | undefined = SecretsGetOptions, >( name: string, - options?: InferredFromOptionsType & SecretsGetOptions + options?: NonNullable ): Promise< | SecretsGetOutput | undefined diff --git a/packages/parameters/src/ssm/SSMProvider.ts b/packages/parameters/src/ssm/SSMProvider.ts index d905ab2681..03d47ef78b 100644 --- a/packages/parameters/src/ssm/SSMProvider.ts +++ b/packages/parameters/src/ssm/SSMProvider.ts @@ -35,15 +35,12 @@ import type { } from '../types/SSMProvider.js'; /** - * ## Intro - * The Parameters utility provides a SSMProvider that allows to retrieve parameters from AWS Systems Manager. - * - * ## Getting started + * The Parameters utility provides a `SSMProvider` that allows to retrieve parameters from AWS Systems Manager. * * This utility supports AWS SDK v3 for JavaScript only (`@aws-sdk/client-ssm`). This allows the utility to be modular, and you to install only * the SDK packages you need and keep your bundle size small. * - * ## Basic usage + * **Basic usage** * * Retrieve a parameter from SSM: * @@ -96,9 +93,7 @@ import type { * * If you don't need to customize the provider, you can also use the {@link getParametersByName} function instead. * - * ## Advanced usage - * - * ### Caching + * **Caching** * * By default, the provider will cache parameters retrieved in-memory for 5 seconds. * You can adjust how long values should be kept in cache by using the `maxAge` parameter. @@ -157,7 +152,7 @@ import type { * * Likewise, you can use the `forceFetch` parameter with the `getParametersByName` method both for individual parameters and for all parameters. * - * ### Decryption + * **Decryption** * * If you want to retrieve a parameter that is encrypted, you can use the `decrypt` parameter. This parameter is compatible with `get`, `getMultiple` and `getParametersByName`. * @@ -175,7 +170,7 @@ import type { * }; * ``` * - * ### Transformations + * **Transformations** * * For parameters stored as JSON you can use the transform argument for deserialization. This will return a JavaScript object instead of a string. * @@ -211,7 +206,7 @@ import type { * * Both type of transformations are compatible also with the `getParametersByName` method. * - * ### Extra SDK options + * **Extra SDK options** * * When retrieving parameters, you can pass extra options to the AWS SDK v3 for JavaScript client by using the `sdkOptions` parameter. * @@ -233,7 +228,7 @@ import type { * * The objects accept the same options as respectively the [AWS SDK v3 for JavaScript GetParameter command](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-ssm/classes/getparametercommand.html) and the [AWS SDK v3 for JavaScript GetParametersByPath command](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-ssm/classes/getparametersbypathcommand.html). * - * ### Customize AWS SDK v3 for JavaScript client + * **Customize AWS SDK v3 for JavaScript client** * * By default, the provider will create a new SSM client using the default configuration. * @@ -272,11 +267,6 @@ class SSMProvider extends BaseProvider { protected errorsKey = '_errors'; protected maxGetParametersItems = 10; - /** - * It initializes the SSMProvider class. - * - * @param {SSMProviderOptions} config - The configuration object. - */ public constructor(config?: SSMProviderOptions) { super({ awsSdkV3ClientPrototype: SSMClient as new (config?: unknown) => SSMClient, @@ -298,26 +288,23 @@ class SSMProvider extends BaseProvider { * const parameter = await parametersProvider.get('/my-parameter'); * }; * ``` - * - * You can customize the retrieval of the value by passing options to the function: - * * `maxAge` - The maximum age of the value in cache before fetching a new one (in seconds) (default: 5) - * * `forceFetch` - Whether to always fetch a new value from the store regardless if already available in cache - * * `transform` - Whether to transform the value before returning it. Supported values: `json`, `binary` - * * `sdkOptions` - Extra options to pass to the AWS SDK v3 for JavaScript client - * * `decrypt` - Whether to decrypt the value before returning it. - * - * For usage examples check {@link SSMProvider}. - * - * @param {string} name - The name of the value to retrieve (i.e. the partition key) - * @param {SSMGetOptions} options - Options to configure the provider + * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * + * @param name - The name of the parameter to retrieve + * @param options - Optional options to configure the provider + * @param options.maxAge - Optional maximum age of the value in the cache, in seconds (default: `5`) + * @param options.forceFetch - Optional flag to always fetch a new value from the store regardless if already available in cache (default: `false`) + * @param options.transform - Optional transform to be applied, can be `json` or `binary` + * @param options.sdkOptions - Optional additional options to pass to the AWS SDK v3 client, supports all options from {@link GetParameterCommandInput | `GetParameterCommandInput`} except `Name` + * @param options.decrypt - Optional flag to decrypt the value before returning it (default: `false`) */ - public async get< + public get< ExplicitUserProvidedType = undefined, InferredFromOptionsType extends SSMGetOptions | undefined = SSMGetOptions, >( name: string, - options?: InferredFromOptionsType & SSMGetOptions + options?: NonNullable ): Promise< SSMGetOutput | undefined > { @@ -343,19 +330,17 @@ class SSMProvider extends BaseProvider { * }; * ``` * - * You can customize the storage of the value by passing options to the function: - * * `value` - The value of the parameter, which is a mandatory option. - * * `overwrite` - Whether to overwrite the value if it already exists (default: `false`) - * * `description` - The description of the parameter - * * `parameterType` - The type of the parameter, can be one of `String`, `StringList`, or `SecureString` (default: `String`) - * * `tier` - The parameter tier to use, can be one of `Standard`, `Advanced`, and `Intelligent-Tiering` (default: `Standard`) - * * `kmsKeyId` - The KMS key id to use to encrypt the parameter - * * `sdkOptions` - Extra options to pass to the AWS SDK v3 for JavaScript client - * - * @param {string} name - The name of the parameter - * @param {SSMSetOptions} options - Options to configure the parameter - * @returns {Promise} The version of the parameter * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * + * @param name - The name of the parameter + * @param options - Options to configure the parameter + * @param options.value - The value of the parameter + * @param options.overwrite - Whether to overwrite the value if it already exists (default: `false`) + * @param options.description - The description of the parameter + * @param options.parameterType - The type of the parameter, can be one of `String`, `StringList`, or `SecureString` (default: `String`) + * @param options.tier - The parameter tier to use, can be one of `Standard`, `Advanced`, and `Intelligent-Tiering` (default: `Standard`) + * @param options.kmsKeyId - The KMS key id to use to encrypt the parameter + * @param options.sdkOptions - Extra options to pass to the AWS SDK v3 for JavaScript client */ public async set< InferredFromOptionsType extends SSMSetOptions | undefined = SSMSetOptions, @@ -400,29 +385,28 @@ class SSMProvider extends BaseProvider { * }; * ``` * - * You can customize the retrieval of the values by passing options to the function: - * * `maxAge` - The maximum age of the value in cache before fetching a new one (in seconds) (default: 5) - * * `forceFetch` - Whether to always fetch a new value from the store regardless if already available in cache - * * `transform` - Whether to transform the value before returning it. Supported values: `json`, `binary` - * * `sdkOptions` - Extra options to pass to the AWS SDK v3 for JavaScript client - * * `throwOnTransformError` - Whether to throw an error if the transform fails (default: `true`) - * * `decrypt` - Whether to decrypt the value before returning it. - * * `recursive` - Whether to recursively retrieve all parameters under the given path (default: `false`) - * - * For usage examples check {@link SSMProvider}. + * For usage examples check {@link SSMProvider | `SSMProvider`}. * - * @param {string} path - The path of the parameters to retrieve - * @param {SSMGetMultipleOptions} options - Options to configure the retrieval * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * + * @param path - The path of the parameters to retrieve + * @param options - Optional options to configure the retrieval + * @param options.maxAge - Optional maximum age of the value in the cache, in seconds (default: `5`) + * @param options.forceFetch - Optional flag to always fetch a new value from the store regardless if already available in cache (default: `false`) + * @param options.transform - Optional transform to be applied, can be `json` or `binary` + * @param options.sdkOptions - Optional additional options to pass to the AWS SDK v3 client, supports all options from {@link GetParametersByPathCommandInput | `GetParametersByPathCommandInput`} except `Path` + * @param options.throwOnTransformError - Optional flag to throw an error if the transform fails (default: `true`) + * @param options.decrypt - Optional flag to decrypt the value before returning it (default: `false`) + * @param options.recursive - Optional flag to recursively retrieve all parameters under the given path (default: `false`) */ - public async getMultiple< + public getMultiple< ExplicitUserProvidedType = undefined, InferredFromOptionsType extends | SSMGetMultipleOptions | undefined = undefined, >( path: string, - options?: InferredFromOptionsType & SSMGetMultipleOptions + options?: NonNullable ): Promise< | SSMGetMultipleOutput | undefined @@ -450,15 +434,8 @@ class SSMProvider extends BaseProvider { * }); * }; * ``` - * You can customize the retrieval of the values by passing options to **both the function and the parameter**: - * * `maxAge` - The maximum age of the value in cache before fetching a new one (in seconds) (default: 5) - * * `forceFetch` - Whether to always fetch a new value from the store regardless if already available in cache - * * `transform` - Whether to transform the value before returning it. Supported values: `json`, `binary` - * * `sdkOptions` - Extra options to pass to the AWS SDK v3 for JavaScript client - * * `throwOnTransformError` - Whether to throw an error if the transform fails (default: `true`) - * * `decrypt` - Whether to decrypt the value before returning it - * - * `throwOnError` decides whether to throw an error if a parameter is not found: + * + * The `throwOnError` option decides whether to throw an error if a parameter is not found: * - A) Default fail-fast behavior: Throws a `GetParameterError` error upon any failure. * - B) Gracefully aggregate all parameters that failed under "_errors" key. * @@ -479,13 +456,18 @@ class SSMProvider extends BaseProvider { * └────────────────────┘ * ``` * - * @param {Record} parameters - Object containing parameter names and any optional overrides - * @param {SSMGetParametersByNameOptions} options - Options to configure the retrieval * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * + * @param parameters - Object containing parameter names and any optional overrides + * @param options - Options to configure the retrieval + * @param options.maxAge - The maximum age of the value in cache before fetching a new one (in seconds) (default: 5) + * @param options.transform - Whether to transform the value before returning it. Supported values: `json`, `binary` + * @param options.decrypt - Whether to decrypt the value before returning it. + * @param options.throwOnError - Whether to throw an error if any of the parameters' retrieval throws an error (default: `true`) */ public async getParametersByName( parameters: Record, - options?: SSMGetParametersByNameOptions + options?: NonNullable ): Promise> { const configs = { ...{ @@ -554,12 +536,15 @@ class SSMProvider extends BaseProvider { /** * Retrieve a parameter from AWS Systems Manager. * - * @param {string} name - Name of the parameter to retrieve - * @param {SSMGetOptions} options - Options to customize the retrieval + * @param name - Name of the parameter to retrieve + * @param options - Options to customize the retrieval + * @param options.sdkOptions - Extra options to pass to the AWS SDK v3 for JavaScript client + * @param options.decrypt - Whether to decrypt the value before returning it. + * @param options.transform - Whether to transform the value before returning it. Supported values: `json`, `binary`, or `auto` (default: `undefined`) */ protected async _get( name: string, - options?: SSMGetOptions + options?: NonNullable ): Promise { const sdkOptions: GetParameterCommandInput = { ...(options?.sdkOptions || {}), @@ -577,12 +562,19 @@ class SSMProvider extends BaseProvider { /** * Retrieve multiple items from AWS Systems Manager. * - * @param {string} path - The path of the parameters to retrieve - * @param {SSMGetMultipleOptions} options - Options to configure the provider + * @param path - The path of the parameters to retrieve + * @param options - Options to configure the provider + * @param options.maxAge - The maximum age of the value in cache before fetching a new one (in seconds) (default: 5) + * @param options.forceFetch - Whether to always fetch a new value from the store regardless if already available in cache + * @param options.transform - Whether to transform the value before returning it. Supported values: `json`, `binary` + * @param options.sdkOptions - Extra options to pass to the AWS SDK v3 for JavaScript client + * @param options.throwOnTransformError - Whether to throw an error if the transform fails (default: `true`) + * @param options.decrypt - Whether to decrypt the value before returning it. + * @param options.recursive - Whether to recursively retrieve all parameters under the given path (default: `false`) */ protected async _getMultiple( path: string, - options?: SSMGetMultipleOptions + options?: NonNullable ): Promise> { const sdkOptions: GetParametersByPathCommandInput = { ...(options?.sdkOptions || {}), @@ -613,7 +605,7 @@ class SSMProvider extends BaseProvider { * * The parameter name returned by SSM will contain the full path. * However, for readability, we should return only the part after the path. - **/ + */ // biome-ignore lint/style/noNonNullAssertion: If the parameter is present in the response, then it has a Name let name = parameter.Name!; name = name.replace(path, ''); @@ -630,9 +622,9 @@ class SSMProvider extends BaseProvider { /** * Retrieve multiple items by name from AWS Systems Manager. * - * @param {Record} parameters - An object of parameter names and their options - * @param {throwOnError} throwOnError - Whether to throw an error if any of the parameters' retrieval throws an error or handle them gracefully - * @param {boolean} decrypt - Whether to decrypt the parameters or not + * @param parameters - An object of parameter names and their options + * @param throwOnError - Whether to throw an error if any of the parameters' retrieval throws an error or handle them gracefully + * @param decrypt - Whether to decrypt the parameters or not */ protected async _getParametersByName( parameters: Record, @@ -666,9 +658,9 @@ class SSMProvider extends BaseProvider { /** * Slice batch and fetch parameters using GetPrameters API by max permissible batch size * - * @param {Record} parameters - An object of parameter names and their options - * @param {throwOnError} throwOnError - Whether to throw an error if any of the parameters' retrieval throws an error or handle them gracefully - * @param {boolean} decrypt - Whether to decrypt the parameters or not + * @param parameters - An object of parameter names and their options + * @param throwOnError - Whether to throw an error if any of the parameters' retrieval throws an error or handle them gracefully + * @param decrypt - Whether to decrypt the parameters or not */ protected async getParametersBatchByName( parameters: Record, @@ -679,8 +671,7 @@ class SSMProvider extends BaseProvider { let errors: string[] = []; // Fetch each possible batch param from cache and return if entire batch is cached - const { cached, toFetch } = - await this.getParametersByNameFromCache(parameters); + const { cached, toFetch } = this.getParametersByNameFromCache(parameters); if (Object.keys(cached).length >= Object.keys(parameters).length) { response = cached; @@ -705,11 +696,11 @@ class SSMProvider extends BaseProvider { /** * Fetch each parameter from batch that hasn't expired from cache * - * @param {Record} parameters - An object of parameter names and their options + * @param parameters - An object of parameter names and their options */ - protected async getParametersByNameFromCache( + protected getParametersByNameFromCache( parameters: Record - ): Promise { + ): SSMGetParametersByNameFromCacheOutputType { const cached: Record> = {}; const toFetch: Record = {}; @@ -737,9 +728,9 @@ class SSMProvider extends BaseProvider { /** * Slice object into chunks of max permissible batch size and fetch parameters * - * @param {Record} parameters - An object of parameter names and their options - * @param {boolean} throwOnError - Whether to throw an error if any of the parameters' retrieval throws an error or handle them gracefully - * @param {boolean} decrypt - Whether to decrypt the parameters or not + * @param parameters - An object of parameter names and their options + * @param throwOnError - Whether to throw an error if any of the parameters' retrieval throws an error or handle them gracefully + * @param decrypt - Whether to decrypt the parameters or not */ protected async getParametersByNameInChunks( parameters: Record, @@ -781,8 +772,8 @@ class SSMProvider extends BaseProvider { /** * Fetch parameters by name while also decrypting them * - * @param {Record} parameters - An object of parameter names and their options - * @param {boolean} throwOnError - Whether to throw an error if any of the parameters' retrieval throws an error or handle them gracefully + * @param parameters - An object of parameter names and their options + * @param throwOnError - Whether to throw an error if any of the parameters' retrieval throws an error or handle them gracefully */ protected async getParametersByNameWithDecryptOption( parameters: Record, @@ -814,11 +805,12 @@ class SSMProvider extends BaseProvider { } /** - * Handle any invalid parameters returned by GetParameters API + * Handle any invalid parameters returned by GetParameters API. + * * GetParameters is non-atomic. Failures don't always reflect in exceptions so we need to collect. * - * @param {GetParametersCommandOutput} result - The result of the GetParameters API call - * @param {boolean} throwOnError - Whether to throw an error if any of the parameters' retrieval throws an error or handle them gracefully + * @param result - The result of the GetParameters API call + * @param throwOnError - Whether to throw an error if any of the parameters' retrieval throws an error or handle them gracefully */ protected static handleAnyInvalidGetParameterErrors( result: Partial, @@ -855,8 +847,8 @@ class SSMProvider extends BaseProvider { /** * Split parameters that can be fetched by GetParameters vs GetParameter. * - * @param {Record} parameters - An object of parameter names and their options - * @param {SSMGetParametersByNameOptions} configs - The configs passed down + * @param parameters - An object of parameter names and their options + * @param configs - The configs passed down */ protected static splitBatchAndDecryptParameters( parameters: Record, @@ -896,9 +888,9 @@ class SSMProvider extends BaseProvider { /** * Throw a GetParameterError if fail-fast is disabled and `_errors` key is in parameters list. * - * @param {Record} parameters - * @param {string} reservedParameter - * @param {boolean} throwOnError + * @param parameters - An object of parameter names and their options + * @param reservedParameter - The reserved parameter name that cannot be used when fail-fast is disabled + * @param throwOnError - Whether to throw an error if any of the parameters' retrieval throws an error or handle them gracefully */ protected static throwIfErrorsKeyIsPresent( parameters: Record, @@ -915,9 +907,9 @@ class SSMProvider extends BaseProvider { /** * Transform and cache the response from GetParameters API call * - * @param {GetParametersCommandOutput} response - The response from the GetParameters API call - * @param {Record} parameters - An object of parameter names and their options - * @param {boolean} throwOnError - Whether to throw an error if any of the parameters' retrieval throws an error or handle them gracefully + * @param response - The response from the GetParameters API call + * @param parameters - An object of parameter names and their options + * @param throwOnError - Whether to throw an error if any of the parameters' retrieval throws an error or handle them gracefully */ protected transformAndCacheGetParametersResponse( response: Partial, diff --git a/packages/parameters/src/ssm/getParameter.ts b/packages/parameters/src/ssm/getParameter.ts index 50a4ab93f3..359caebf7d 100644 --- a/packages/parameters/src/ssm/getParameter.ts +++ b/packages/parameters/src/ssm/getParameter.ts @@ -3,21 +3,12 @@ import type { SSMGetOptions, SSMGetOutput } from '../types/SSMProvider.js'; import { SSMProvider } from './SSMProvider.js'; /** - * ## Intro - * The Parameters utility provides an SSMProvider that allows to retrieve parameters from AWS Systems Manager. - * - * ## Getting started + * The Parameters utility provides an `SSMProvider` that allows to retrieve parameters from AWS Systems Manager. * * This utility supports AWS SDK v3 for JavaScript only. This allows the utility to be modular, and you to install only * the SDK packages you need and keep your bundle size small. * - * To use the provider, you must install the Parameters utility and the AWS SDK v3 for JavaScript for AppConfig: - * - * ```sh - * npm install @aws-lambda-powertools/parameters @aws-sdk/client-ssm - * ``` - * - * ## Basic usage + * **Basic usage** * * @example * ```typescript @@ -29,9 +20,7 @@ import { SSMProvider } from './SSMProvider.js'; * }; * ``` * - * ## Advanced usage - * - * ### Decryption + * **Decryption** * * If you have encrypted parameters, you can use the `decrypt` option to automatically decrypt them. * @@ -45,7 +34,7 @@ import { SSMProvider } from './SSMProvider.js'; * }; * ``` * - * ### Caching + * **Caching** * * By default, the provider will cache parameters retrieved in-memory for 5 seconds. * You can adjust how long values should be kept in cache by using the `maxAge` parameter. @@ -72,7 +61,7 @@ import { SSMProvider } from './SSMProvider.js'; * }; * ``` * - * ### Transformations + * **Transformations** * * For parameters stored as JSON you can use the transform argument for deserialization. This will return a JavaScript object instead of a string. * @@ -98,7 +87,7 @@ import { SSMProvider } from './SSMProvider.js'; * }; * ``` * - * ### Extra SDK options + * **Extra SDK options** * * When retrieving a parameter, you can pass extra options to the AWS SDK v3 for JavaScript client by using the `sdkOptions` parameter. * @@ -118,31 +107,26 @@ import { SSMProvider } from './SSMProvider.js'; * * This object accepts the same options as the [AWS SDK v3 for JavaScript SSM GetParameter command](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-ssm/interfaces/getparametercommandinput.html). * - * ### Built-in provider class + * **Built-in provider class** * * For greater flexibility such as configuring the underlying SDK client used by built-in providers, you can use the {@link SSMProvider} class. * - * ### Options - * - * * You can customize the retrieval of the value by passing options to the function: - * * `maxAge` - The maximum age of the value in cache before fetching a new one (in seconds) (default: 5) - * * `forceFetch` - Whether to always fetch a new value from the store regardless if already available in cache - * * `transform` - Whether to transform the value before returning it. Supported values: `json`, `binary` - * * `sdkOptions` - Extra options to pass to the AWS SDK v3 for JavaScript client - * * `decrypt` - Whether to decrypt the value before returning it. - * - * For more usage examples, see [our documentation](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/). - * - * @param {string} name - The name of the parameter to retrieve - * @param {SSMGetOptions} options - Options to configure the provider * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * + * @param name - The name of the parameter to retrieve + * @param options - Optional options to configure the provider + * @param options.maxAge - Optional maximum age of the value in the cache, in seconds (default: `5`) + * @param options.forceFetch - Optional flag to always fetch a new value from the store regardless if already available in cache (default: `false`) + * @param options.transform - Optional transform to be applied, can be `json` or `binary` + * @param options.sdkOptions - Optional additional options to pass to the AWS SDK v3 client, supports all options from {@link GetParameterCommandInput | `GetParameterCommandInput`} except `Name` + * @param options.decrypt - Optional flag to decrypt the value before returning it (default: `false`) */ -const getParameter = async < +const getParameter = < ExplicitUserProvidedType = undefined, InferredFromOptionsType extends SSMGetOptions | undefined = SSMGetOptions, >( name: string, - options?: InferredFromOptionsType & SSMGetOptions + options?: NonNullable ): Promise< SSMGetOutput | undefined > => { diff --git a/packages/parameters/src/ssm/getParameters.ts b/packages/parameters/src/ssm/getParameters.ts index a00caee550..b8aca01a0d 100644 --- a/packages/parameters/src/ssm/getParameters.ts +++ b/packages/parameters/src/ssm/getParameters.ts @@ -6,21 +6,12 @@ import type { import { SSMProvider } from './SSMProvider.js'; /** - * ## Intro - * The Parameters utility provides an SSMProvider that allows to retrieve parameters from AWS Systems Manager. - * - * ## Getting started + * The Parameters utility provides an `SSMProvider` that allows to retrieve parameters from AWS Systems Manager. * * This utility supports AWS SDK v3 for JavaScript only. This allows the utility to be modular, and you to install only * the SDK packages you need and keep your bundle size small. * - * To use the provider, you must install the Parameters utility and the AWS SDK v3 for JavaScript for AppConfig: - * - * ```sh - * npm install @aws-lambda-powertools/parameters @aws-sdk/client-ssm - * ``` - * - * ## Basic usage + * **Basic usage** * * @example * ```typescript @@ -32,9 +23,7 @@ import { SSMProvider } from './SSMProvider.js'; * }; * ``` * - * ## Advanced usage - * - * ### Decryption + * **Decryption** * * If you have encrypted parameters, you can use the `decrypt` option to automatically decrypt them. * @@ -48,7 +37,7 @@ import { SSMProvider } from './SSMProvider.js'; * }; * ``` * - * ### Caching + * **Caching** * * By default, the provider will cache parameters retrieved in-memory for 5 seconds. * You can adjust how long values should be kept in cache by using the `maxAge` parameter. @@ -75,7 +64,7 @@ import { SSMProvider } from './SSMProvider.js'; * }; * ``` * - * ### Transformations + * **Transformations** * * For parameters stored as JSON you can use the transform argument for deserialization. This will return a JavaScript objects instead of a strings. * @@ -101,7 +90,7 @@ import { SSMProvider } from './SSMProvider.js'; * }; * ``` * - * ### Extra SDK options + * **Extra SDK options** * * When retrieving a parameter, you can pass extra options to the AWS SDK v3 for JavaScript client by using the `sdkOptions` parameter. * @@ -121,34 +110,27 @@ import { SSMProvider } from './SSMProvider.js'; * * This object accepts the same options as the [AWS SDK v3 for JavaScript SSM getParametersByPath command](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-ssm/interfaces/getParameterssbypathcommandinput.html). * - * ### Built-in provider class - * * For greater flexibility such as configuring the underlying SDK client used by built-in providers, you can use the {@link SSMProvider} class. * - * ### Options - * - * * You can customize the retrieval of the value by passing options to the function: - * * `maxAge` - The maximum age of the value in cache before fetching a new one (in seconds) (default: 5) - * * `forceFetch` - Whether to always fetch a new value from the store regardless if already available in cache - * * `transform` - Whether to transform the value before returning it. Supported values: `json`, `binary` - * * `sdkOptions` - Extra options to pass to the AWS SDK v3 for JavaScript client - * * `decrypt` - Whether to decrypt the value before returning it. - * * `recursive` - Whether to recursively retrieve all parameters within the path. - * - * For more usage examples, see [our documentation](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/). - * - * @param {string} path - The path of the parameters to retrieve - * @param {SSMGetMultipleOptions} options - Options to configure the provider * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * + * @param path - The path of the parameters to retrieve + * @param options - Optional options to configure the provider + * @param options.maxAge - Optional maximum age of the value in the cache, in seconds (default: `5`) + * @param options.forceFetch - Optional flag to always fetch a new value from the store regardless if already available in cache (default: `false`) + * @param options.transform - Optional transform to be applied, can be `json` or `binary` + * @param options.sdkOptions - Optional additional options to pass to the AWS SDK v3 client, supports all options from {@link GetParametersByPathCommandInput | `GetParametersByPathCommandInput`} except `Path` + * @param options.decrypt - Optional flag to decrypt the value before returning it (default: `false`) + * @param options.recursive - Optional flag to recursively retrieve all parameters within the path (default: `false`) */ -const getParameters = async < +const getParameters = < ExplicitUserProvidedType = undefined, InferredFromOptionsType extends | SSMGetMultipleOptions | undefined = SSMGetMultipleOptions, >( path: string, - options?: InferredFromOptionsType & SSMGetMultipleOptions + options?: NonNullable ): Promise< | SSMGetMultipleOutput | undefined diff --git a/packages/parameters/src/ssm/getParametersByName.ts b/packages/parameters/src/ssm/getParametersByName.ts index b609871b0f..57c5043c08 100644 --- a/packages/parameters/src/ssm/getParametersByName.ts +++ b/packages/parameters/src/ssm/getParametersByName.ts @@ -6,21 +6,12 @@ import type { import { SSMProvider } from './SSMProvider.js'; /** - * ## Intro - * The Parameters utility provides an SSMProvider that allows to retrieve parameters from AWS Systems Manager. - * - * ## Getting started + * The Parameters utility provides an `SSMProvider` that allows to retrieve parameters from AWS Systems Manager. * * This utility supports AWS SDK v3 for JavaScript only. This allows the utility to be modular, and you to install only * the SDK packages you need and keep your bundle size small. * - * To use the provider, you must install the Parameters utility and the AWS SDK v3 for JavaScript for AppConfig: - * - * ```sh - * npm install @aws-lambda-powertools/parameters @aws-sdk/client-ssm - * ``` - * - * ## Basic usage + * **Basic usage** * * @example * ```typescript @@ -35,9 +26,7 @@ import { SSMProvider } from './SSMProvider.js'; * }; * ``` * - * ## Advanced usage - * - * ### Decryption + * **Decryption** * * If you have encrypted parameters, you can use the `decrypt` option to automatically decrypt them. * @@ -54,7 +43,7 @@ import { SSMProvider } from './SSMProvider.js'; * }; * ``` * - * ### Caching + * **Caching** * * By default, the provider will cache parameters retrieved in-memory for 5 seconds. * You can adjust how long values should be kept in cache by using the `maxAge` parameter. @@ -102,7 +91,7 @@ import { SSMProvider } from './SSMProvider.js'; * }; * ``` * - * ### Transformations + * **Transformations** * * For parameters stored as JSON you can use the transform argument for deserialization. This will return a JavaScript objects instead of a strings. * For parameters that are instead stored as base64-encoded binary data, you can use the transform argument set to `binary` for decoding. This will return decoded strings for each parameter. @@ -121,21 +110,9 @@ import { SSMProvider } from './SSMProvider.js'; * }; * ``` * - * - * ### Built-in provider class - * * For greater flexibility such as configuring the underlying SDK client used by built-in providers, you can use the {@link SSMProvider} class. * - * ### Options - * - * * You can customize the retrieval of the value by passing options to **both the function and the parameter**: - * * `maxAge` - The maximum age of the value in cache before fetching a new one (in seconds) (default: 5) - * * `forceFetch` - Whether to always fetch a new value from the store regardless if already available in cache - * * `transform` - Whether to transform the value before returning it. Supported values: `json`, `binary` - * * `sdkOptions` - Extra options to pass to the AWS SDK v3 for JavaScript client - * * `decrypt` - Whether to decrypt the value before returning it - * - * `throwOnError` decides whether to throw an error if a parameter is not found: + * The `throwOnError` parameter decides whether to throw an error if a parameter is not found: * - A) Default fail-fast behavior: Throws a `GetParameterError` error upon any failure. * - B) Gracefully aggregate all parameters that failed under "_errors" key. * @@ -156,15 +133,18 @@ import { SSMProvider } from './SSMProvider.js'; * └────────────────────┘ * ``` * - * For more usage examples, see [our documentation](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/). - * - * @param {Record} parameters - The path of the parameters to retrieve - * @param {SSMGetParametersByNameOptions} options - Options to configure the provider * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * + * @param parameters - The path of the parameters to retrieve + * @param options - Options to configure the provider + * @param options.maxAge - Maximum age of the value in the cache, in seconds. Will be applied after the first API call. + * @param options.transform - Whether to transform the value before returning it. Supported values: `json`, `binary` + * @param options.decrypt - Whether to decrypt the values before returning them. If true, will use `GetParameter` API for each parameter. If false (default), will use `GetParametersByName` API. + * @param options.throwOnError - Whether to throw an error if any of the parameters' retrieval throws an error (default: `true`) */ -const getParametersByName = async ( +const getParametersByName = ( parameters: Record, - options?: SSMGetParametersByNameOptions + options?: NonNullable ): Promise> => { if (!Object.hasOwn(DEFAULT_PROVIDERS, 'ssm')) { DEFAULT_PROVIDERS.ssm = new SSMProvider(); diff --git a/packages/parameters/src/ssm/setParameter.ts b/packages/parameters/src/ssm/setParameter.ts index a059d11dc5..21adbefff6 100644 --- a/packages/parameters/src/ssm/setParameter.ts +++ b/packages/parameters/src/ssm/setParameter.ts @@ -58,24 +58,17 @@ import { SSMProvider } from './SSMProvider.js'; * * For greater flexibility such as configuring the underlying SDK client used by built-in providers, you can use the {@link SSMProvider} utility. * - * **Options** - * - * You can customize the storage of the value by passing options to the function: - * * `value` - The value of the parameter, which is a mandatory option. - * * `overwrite` - Whether to overwrite the value if it already exists (default: `false`) - * * `description` - The description of the parameter - * * `parameterType` - The type of the parameter, can be one of `String`, `StringList`, or `SecureString` (default: `String`) - * * `tier` - The parameter tier to use, can be one of `Standard`, `Advanced`, and `Intelligent-Tiering` (default: `Standard`) - * * `kmsKeyId` - The KMS key id to use to encrypt the parameter - * * `sdkOptions` - Extra options to pass to the AWS SDK v3 for JavaScript client - * - * For more usage examples, see [our documentation](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/). - * - * @param name - Name of the parameter - * @param options - Options to configure the parameter - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * + * @param name - Name of the parameter + * @param options - Options to configure the parameter + * @param options.value - The value of the parameter + * @param options.overwrite - Whether to overwrite the value if it already exists (default: `false`) + * @param options.description - The description of the parameter + * @param options.parameterType - The type of the parameter, can be one of `String`, `StringList`, or `SecureString` (default: `String`) + * @param options.tier - The parameter tier to use, can be one of `Standard`, `Advanced`, and `Intelligent-Tiering` (default: `Standard`) */ -const setParameter = async < +const setParameter = < InferredFromOptionsType extends SSMSetOptions | undefined = SSMSetOptions, >( name: string, diff --git a/packages/parameters/src/types/AppConfigProvider.ts b/packages/parameters/src/types/AppConfigProvider.ts index 64dc4ee170..d9768f49ee 100644 --- a/packages/parameters/src/types/AppConfigProvider.ts +++ b/packages/parameters/src/types/AppConfigProvider.ts @@ -4,80 +4,85 @@ import type { AppConfigDataClientConfig, StartConfigurationSessionCommandInput, } from '@aws-sdk/client-appconfigdata'; +import type { AppConfigProvider } from '../appconfig/AppConfigProvider.js'; +import type { getAppConfig } from '../appconfig/getAppConfig.js'; import type { GetOptionsInterface } from './BaseProvider.js'; /** - * Base interface for AppConfigProviderOptions. + * Base interface for {@link AppConfigProviderOptions | `AppConfigProviderOptions`}. * - * @interface - * @property {string} environment - The environment ID or the environment name. - * @property {string} [application] - The application ID or the application name. + * @property environment - The environment ID or the environment name. + * @property application - The optional application ID or the application name. */ interface AppConfigProviderOptionsBaseInterface { + /** + * The environment ID or the environment name. + */ environment: string; + /** The optional application ID or the application name. + */ application?: string; } /** - * Interface for AppConfigProviderOptions with clientConfig property. + * Interface for {@link AppConfigProviderOptions | `AppConfigProviderOptions`} with `clientConfig` property. * - * @interface - * @extends AppConfigProviderOptionsBaseInterface - * @property {AppConfigDataClientConfig} [clientConfig] - Optional configuration to pass during client initialization, e.g. AWS region. - * @property {never} [awsSdkV3Client] - This property should never be passed. + * @property clientConfig - Optional configuration to pass during client initialization, e.g. AWS region. + * @property awsSdkV3Client - This property should never be passed when using `clientConfig`. */ interface AppConfigProviderOptionsWithClientConfig extends AppConfigProviderOptionsBaseInterface { /** - * Optional configuration to pass during client initialization, e.g. AWS region. It accepts the same configuration object as the AWS SDK v3 client (`AppConfigDataClient`). + * Optional configuration to pass during client initialization, e.g. AWS region. Accepts the same configuration object as the AWS SDK v3 client ({@link AppConfigDataClientConfig | `AppConfigDataClientConfig`}). */ clientConfig?: AppConfigDataClientConfig; + /** + * This property should never be passed when using `clientConfig`. + */ awsSdkV3Client?: never; } /** - * Interface for AppConfigProviderOptions with awsSdkV3Client property. + * Interface for {@link AppConfigProviderOptions | `AppConfigProviderOptions`} with awsSdkV3Client property. * - * @interface - * @extends AppConfigProviderOptionsBaseInterface - * @property {AppConfigDataClient} [awsSdkV3Client] - Optional AWS SDK v3 client to pass during AppConfigProvider class instantiation - * @property {never} [clientConfig] - This property should never be passed. + * @property awsSdkV3Client - Optional AWS SDK v3 client to pass during the `AppConfigProvider` class instantiation, should be an instance of {@link AppConfigDataClient | `AppConfigDataClient`}. + * @property clientConfig - This property should never be passed when using `awsSdkV3Client`. */ interface AppConfigProviderOptionsWithClientInstance extends AppConfigProviderOptionsBaseInterface { /** - * Optional AWS SDK v3 client instance (`AppConfigDataClient`) to use for AppConfig operations. If not provided, we will create a new instance of `AppConfigDataClient`. + * Optional AWS SDK v3 client instance ({@link AppConfigDataClient | `AppConfigDataClient`}) to use for AppConfig operations. If not provided, we will create a new instance of the client. */ awsSdkV3Client?: AppConfigDataClient; + /** + * This property should never be passed when using `awsSdkV3Client`. + */ clientConfig?: never; } /** - * Options for the AppConfigProvider class constructor. + * Options for the `AppConfigProvider` class constructor. * - * @type AppConfigProviderOptions - * @property {string} environment - The environment ID or the environment name. - * @property {string} [application] - The application ID or the application name. - * @property {AppConfigDataClientConfig} [clientConfig] - Optional configuration to pass during client initialization, e.g. AWS region. Mutually exclusive with awsSdkV3Client. - * @property {AppConfigDataClient} [awsSdkV3Client] - Optional AWS SDK v3 client to pass during AppConfigProvider class instantiation. Mutually exclusive with clientConfig. + * @property environment - The environment ID or the environment name. + * @property application - Optional application ID or the application name, if not provided it will be inferred from the service name in the environment. + * @property clientConfig - Optional configuration to pass during client initialization, e.g. AWS region. Mutually exclusive with `awsSdkV3Client`. Accepts the same configuration object as the AWS SDK v3 client ({@link AppConfigDataClientConfig | `AppConfigDataClientConfig`}). + * @property awsSdkV3Client - Optional ({@link AppConfigDataClient | `AppConfigDataClient`}) instance to pass during `AppConfigProvider` class instantiation. Mutually exclusive with `clientConfig`. */ type AppConfigProviderOptions = | AppConfigProviderOptionsWithClientConfig | AppConfigProviderOptionsWithClientInstance; /** - * Options for the AppConfigProvider get method. + * Options for the {@link AppConfigProvider.get | `AppConfigProvider.get()`} method. * - * @interface AppConfigGetOptionsBase - * @extends {GetOptionsInterface} - * @property {number} maxAge - Maximum age of the value in the cache, in seconds. - * @property {boolean} forceFetch - Force fetch the value from the parameter store, ignoring the cache. - * @property {StartConfigurationSessionCommandInput} [sdkOptions] - Additional options to pass to the AWS SDK v3 client. - * @property {TransformOptions} transform - Transform to be applied, can be 'json' or 'binary'. + * @property maxAge - Maximum age of the value in the cache, in seconds. + * @property forceFetch - Force fetch the value from the parameter store, ignoring the cache. + * @property sdkOptions - Additional options to pass to the AWS SDK v3 client. Supports all options from {@link StartConfigurationSessionCommandInput | `StartConfigurationSessionCommandInput`} except `ApplicationIdentifier`, `EnvironmentIdentifier`, and `ConfigurationProfileIdentifier`. + * @property transform - Optional transform to be applied, can be 'json' or 'binary'. */ interface AppConfigGetOptionsBase extends GetOptionsInterface { /** - * Additional options to pass to the AWS SDK v3 client. Supports all options from `StartConfigurationSessionCommandInput` except `ApplicationIdentifier`, `EnvironmentIdentifier`, and `ConfigurationProfileIdentifier`. + * Additional options to pass to the AWS SDK v3 client. Supports all options from {@link StartConfigurationSessionCommandInput | `StartConfigurationSessionCommandInput`} except `ApplicationIdentifier`, `EnvironmentIdentifier`, and `ConfigurationProfileIdentifier`. */ sdkOptions?: Omit< Partial, @@ -99,6 +104,14 @@ interface AppConfigGetOptionsTransformNone extends AppConfigGetOptionsBase { transform?: never; } +/** + * Options for the {@link AppConfigProvider.get | `AppConfigProvider.get()`} method. + * + * @property maxAge - Maximum age of the value in the cache, in seconds. + * @property forceFetch - Force fetch the value from the parameter store, ignoring the cache. + * @property sdkOptions - Additional options to pass to the AWS SDK v3 client. Supports all options from {@link StartConfigurationSessionCommandInput | `StartConfigurationSessionCommandInput`} except `ApplicationIdentifier`, `EnvironmentIdentifier`, and `ConfigurationProfileIdentifier`. + * @property transform - Optional transform to be applied, can be 'json' or 'binary'. + */ type AppConfigGetOptions = | AppConfigGetOptionsTransformNone | AppConfigGetOptionsTransformJson @@ -106,7 +119,7 @@ type AppConfigGetOptions = | undefined; /** - * Generic output type for the AppConfigProvider get method. + * Generic output type for the {@link AppConfigProvider.get | `AppConfigProvider.get()` } get method. */ type AppConfigGetOutput< ExplicitUserProvidedType = undefined, @@ -124,7 +137,7 @@ type AppConfigGetOutput< : ExplicitUserProvidedType; /** - * Combined options for the getAppConfig utility function. + * Combined options for the {@link getAppConfig | `getAppConfig()`} utility function. */ type GetAppConfigOptions = Omit< AppConfigProviderOptions, diff --git a/packages/parameters/src/types/BaseProvider.ts b/packages/parameters/src/types/BaseProvider.ts index 3154bb0893..d4ec626c9c 100644 --- a/packages/parameters/src/types/BaseProvider.ts +++ b/packages/parameters/src/types/BaseProvider.ts @@ -1,7 +1,7 @@ import type { Transform } from '../constants.js'; /** - * Options for the BaseProvider class constructor. + * Options for the `BaseProvider` class constructor. */ type BaseProviderConstructorOptions = { /** @@ -30,10 +30,10 @@ type TransformOptions = (typeof Transform)[keyof typeof Transform]; /** * Options for the `get` method. * - * @property {number} maxAge - Maximum age of the value in the cache, in seconds. Will be applied after the first API call. - * @property {boolean} forceFetch - Force fetch the value from the parameter store, ignoring the cache. - * @property {unknown} sdkOptions - Options to pass to the underlying SDK. - * @property {TransformOptions} transform - Transform to be applied, can be 'json', 'binary', or 'auto'. + * @property maxAge - Maximum age of the value in the cache, in seconds. Will be applied after the first API call. + * @property forceFetch - Force fetch the value from the parameter store, ignoring the cache. + * @property sdkOptions - Options to pass to the underlying SDK. + * @property transform - Optional transform to be applied, can be 'json', 'binary', or 'auto'. */ interface GetOptionsInterface { /** @@ -57,11 +57,11 @@ interface GetOptionsInterface { /** * Options for the `getMultiple` method. * - * @property {number} maxAge - Maximum age of the value in the cache, in seconds. Will be applied after the first API call. - * @property {boolean} forceFetch - Force fetch the value from the parameter store, ignoring the cache. - * @property {unknown} sdkOptions - Options to pass to the underlying SDK. - * @property {TransformOptions} transform - Transform to be applied, can be 'json', 'binary', or 'auto'. - * @property {boolean} throwOnTransformError - Whether to throw an error if a value cannot be transformed. + * @property maxAge - Maximum age of the value in the cache, in seconds. Will be applied after the first API call. + * @property forceFetch - Force fetch the value from the parameter store, ignoring the cache. + * @property sdkOptions - Options to pass to the underlying SDK. + * @property transform - Transform to be applied, can be 'json', 'binary', or 'auto'. + * @property throwOnTransformError - Whether to throw an error if a value cannot be transformed. */ interface GetMultipleOptionsInterface extends GetOptionsInterface { /** diff --git a/packages/parameters/src/types/DynamoDBProvider.ts b/packages/parameters/src/types/DynamoDBProvider.ts index 97b6241636..664e0dbac7 100644 --- a/packages/parameters/src/types/DynamoDBProvider.ts +++ b/packages/parameters/src/types/DynamoDBProvider.ts @@ -5,87 +5,101 @@ import type { GetItemCommandInput, QueryCommandInput, } from '@aws-sdk/client-dynamodb'; +import type { DynamoDBProvider } from '../dynamodb/DynamoDBProvider.js'; import type { GetMultipleOptionsInterface, GetOptionsInterface, } from './BaseProvider.js'; /** - * Base interface for DynamoDBProviderOptions. + * Base interface for {@link DynamoDBProviderOptions | `DynamoDBProviderOptions`}. * - * @interface - * @property {string} tableName - The DynamoDB table name. - * @property {string} [keyAttr] - The DynamoDB table key attribute name. Defaults to 'id'. - * @property {string} [sortAttr] - The DynamoDB table sort attribute name. Defaults to 'sk'. - * @property {string} [valueAttr] - The DynamoDB table value attribute name. Defaults to 'value'. + * @property tableName - The DynamoDB table name. + * @property keyAttr - Optional DynamoDB table key attribute name. Defaults to 'id'. + * @property sortAttr - Optional DynamoDB table sort attribute name. Defaults to 'sk'. + * @property valueAttr - Optional DynamoDB table value attribute name. Defaults to 'value'. */ interface DynamoDBProviderOptionsBase { + /** + * The DynamoDB table name. + */ tableName: string; + /** + * Optional DynamoDB table key attribute name. Defaults to 'id'. + */ keyAttr?: string; + /** + * Optional DynamoDB table sort attribute name. Defaults to 'sk'. + */ sortAttr?: string; + /** + * Optional DynamoDB table value attribute name. Defaults to 'value'. + */ valueAttr?: string; } /** - * Interface for DynamoDBProviderOptions with clientConfig property. + * Interface for {@link DynamoDBProviderOptions | `DynamoDBProviderOptions`} with `clientConfig` property. * - * @interface - * @extends DynamoDBProviderOptionsBase - * @property {DynamoDBClientConfig} [clientConfig] - Optional configuration to pass during client initialization, e.g. AWS region. - * @property {never} [awsSdkV3Client] - This property should never be passed. + * @property clientConfig - Optional configuration to pass during client initialization, e.g. AWS region. Accepts the same options as the AWS SDK v3 client ({@link DynamoDBClient | `DynamoDBClient`}). + * @property awsSdkV3Client - This property should never be passed when using `clientConfig`. */ interface DynamoDBProviderOptionsWithClientConfig extends DynamoDBProviderOptionsBase { /** - * Optional configuration to pass during client initialization, e.g. AWS region. It accepts the same configuration object as the AWS SDK v3 client (`DynamoDBClient`). + * Optional configuration to pass during client initialization, e.g. AWS region. Accepts the same options as the AWS SDK v3 client ({@link DynamoDBClient | `DynamoDBClient`}). */ clientConfig?: DynamoDBClientConfig; + /** + * This property should never be passed when using `clientConfig`. + */ awsSdkV3Client?: never; } /** - * Interface for DynamoDBProviderOptions with awsSdkV3Client property. + * Interface for {@link DynamoDBProviderOptions | `DynamoDBProviderOptions`} with `awsSdkV3Client` property. * - * @interface - * @extends DynamoDBProviderOptionsBase - * @property {DynamoDBClient} [awsSdkV3Client] - Optional AWS SDK v3 client to pass during DynamoDBProvider class instantiation - * @property {never} [clientConfig] - This property should never be passed. + * @property awsSdkV3Client - Optional AWS SDK v3 client to pass during `DynamoDBProvider` class instantiation, should be an instance of {@link DynamoDBClient | `DynamoDBClient`}. + * @property clientConfig - This property should never be passed when using `awsSdkV3Client`. */ interface DynamoDBProviderOptionsWithClientInstance extends DynamoDBProviderOptionsBase { /** - * Optional AWS SDK v3 client instance (`DynamoDBClient`) to use for DynamoDB operations. If not provided, we will create a new instance of `DynamoDBClient`. + * Optional AWS SDK v3 client instance ({@link DynamoDBClient | `DynamoDBClient`}) to use for DynamoDB operations. If not provided, we will create a new instance of the client. */ awsSdkV3Client?: DynamoDBClient; + /** + * This property should never be passed when using `awsSdkV3Client`. + */ clientConfig?: never; } /** - * Options for the DynamoDBProvider class constructor. + * Options for the {@link DynamoDBProvider | `DynamoDBProvider`} class constructor. * - * @type DynamoDBProviderOptions - * @property {string} tableName - The DynamoDB table name. - * @property {string} [keyAttr] - The DynamoDB table key attribute name. Defaults to 'id'. - * @property {string} [sortAttr] - The DynamoDB table sort attribute name. Defaults to 'sk'. - * @property {string} [valueAttr] - The DynamoDB table value attribute name. Defaults to 'value'. - * @property {DynamoDBClientConfig} [clientConfig] - Optional configuration to pass during client initialization, e.g. AWS region. Mutually exclusive with awsSdkV3Client. - * @property {DynamoDBClient} [awsSdkV3Client] - Optional AWS SDK v3 client to pass during DynamoDBProvider class instantiation. Mutually exclusive with clientConfig. + * @property tableName - The DynamoDB table name. + * @property keyAttr - Optional DynamoDB table key attribute name. Defaults to 'id'. + * @property sortAttr - Optional DynamoDB table sort attribute name. Defaults to 'sk'. + * @property valueAttr - Optional DynamoDB table value attribute name. Defaults to 'value'. + * @property clientConfig - Optional configuration to pass during client initialization, e.g. AWS region. Mutually exclusive with `awsSdkV3Client`, accepts the same options as the AWS SDK v3 client ({@link DynamoDBClient | `DynamoDBClient`}). + * @property awsSdkV3Client - Optional AWS SDK v3 client to pass during DynamoDBProvider class instantiation. Mutually exclusive with `clientConfig`, should be an instance of {@link DynamoDBClient | `DynamoDBClient`}. */ type DynamoDBProviderOptions = | DynamoDBProviderOptionsWithClientConfig | DynamoDBProviderOptionsWithClientInstance; /** - * Options for the DynamoDBProvider get method. + * Options for the {@link DynamoDBProvider.get | `DynamoDBProvider.get()`} get method. * - * @interface DynamoDBGetOptionsBase - * @extends {GetOptionsInterface} - * @property {number} maxAge - Maximum age of the value in the cache, in seconds. - * @property {boolean} forceFetch - Force fetch the value from the parameter store, ignoring the cache. - * @property {GetItemCommandInput} [sdkOptions] - Additional options to pass to the AWS SDK v3 client. - * @property {TransformOptions} transform - Transform to be applied, can be 'json' or 'binary'. + * @property maxAge - Maximum age of the value in the cache, in seconds. + * @property forceFetch - Force fetch the value from the parameter store, ignoring the cache. + * @property sdkOptions - Additional options to pass to the AWS SDK v3 client, supports all options from {@link GetItemCommandInput | `GetItemCommandInput`} except `Key`, `TableName`, and `ProjectionExpression`. + * @property transform - Transform to be applied, can be 'json' or 'binary'. */ interface DynamoDBGetOptionsBase extends GetOptionsInterface { + /** + * Additional options to pass to the AWS SDK v3 client, supports all options from {@link GetItemCommandInput | `GetItemCommandInput`} except `Key`, `TableName`, and `ProjectionExpression`. + */ sdkOptions?: Omit< Partial, 'Key' | 'TableName' | 'ProjectionExpression' @@ -104,6 +118,14 @@ interface DynamoDBGetOptionsTransformNone extends DynamoDBGetOptionsBase { transform?: never; } +/** + * Options for the {@link DynamoDBProvider.get | `DynamoDBProvider.get()`} get method. + * + * @property maxAge - Maximum age of the value in the cache, in seconds. + * @property forceFetch - Force fetch the value from the parameter store, ignoring the cache. + * @property sdkOptions - Additional options to pass to the AWS SDK v3 client, supports all options from {@link GetItemCommandInput | `GetItemCommandInput`} except `Key`, `TableName`, and `ProjectionExpression`. + * @property transform - Transform to be applied, can be 'json' or 'binary'. + */ type DynamoDBGetOptions = | DynamoDBGetOptionsTransformNone | DynamoDBGetOptionsTransformJson @@ -111,7 +133,7 @@ type DynamoDBGetOptions = | undefined; /** - * Generic output type for DynamoDBProvider get method. + * Generic output type for {@link DynamoDBProvider.get | `DynamoDBProvider.get()`} method. */ type DynamoDBGetOutput< ExplicitUserProvidedType = undefined, @@ -129,15 +151,13 @@ type DynamoDBGetOutput< : ExplicitUserProvidedType; /** - * Options for the DynamoDBProvider getMultiple method. + * Options for the {@link DynamoDBProvider.getMultiple | `DynamoDBProvider.getMultiple()`} method. * - * @interface DynamoDBGetMultipleOptions - * @extends {GetMultipleOptionsInterface} - * @property {number} maxAge - Maximum age of the value in the cache, in seconds. - * @property {boolean} forceFetch - Force fetch the value from the parameter store, ignoring the cache. - * @property {QueryCommandInput} [sdkOptions] - Additional options to pass to the AWS SDK v3 client. - * @property {TransformOptions} transform - Transform to be applied, can be 'json' or 'binary'. - * @property {boolean} throwOnTransformError - Whether to throw an error if the transform fails (default: `true`) + * @property maxAge - Maximum age of the value in the cache, in seconds. + * @property forceFetch - Force fetch the value from the parameter store, ignoring the cache. + * @property sdkOptions - Additional options to pass to the AWS SDK v3 client, supports all options from {@link QueryCommandInput | `QueryCommandInput`} except `TableName` and `KeyConditionExpression`. + * @property transform - Transform to be applied, can be 'json' or 'binary'. + * @property throwOnTransformError - Whether to throw an error if the transform fails (default: `true`) */ interface DynamoDBGetMultipleOptionsBase extends GetMultipleOptionsInterface { sdkOptions?: Partial; @@ -170,7 +190,7 @@ type DynamoDBGetMultipleOptions = | DynamoDBGetMultipleOptionsTransformNone; /** - * Generic output type for DynamoDBProvider getMultiple method. + * Generic output type for {@link DynamoDBProvider.getMultiple | `DynamoDBProvider.getMultiple()`} method. */ type DynamoDBGetMultipleOutput< ExplicitUserProvidedType = undefined, diff --git a/packages/parameters/src/types/SSMProvider.ts b/packages/parameters/src/types/SSMProvider.ts index 889438db7e..547f5ffa04 100644 --- a/packages/parameters/src/types/SSMProvider.ts +++ b/packages/parameters/src/types/SSMProvider.ts @@ -15,9 +15,8 @@ import type { /** * Interface for SSMProvider with clientConfig property. * - * @interface - * @property {SSMClientConfig} [clientConfig] - Optional configuration to pass during client initialization, e.g. AWS region. - * @property {never} [awsSdkV3Client] - This property should never be passed. + * @property clientConfig - Optional configuration to pass during client initialization, e.g. AWS region. + * @property awsSdkV3Client - This property should never be passed. */ interface SSMProviderOptionsWithClientConfig { /** @@ -30,9 +29,8 @@ interface SSMProviderOptionsWithClientConfig { /** * Interface for SSMProvider with awsSdkV3Client property. * - * @interface - * @property {SSMClient} [awsSdkV3Client] - Optional AWS SDK v3 client to pass during SSMProvider class instantiation - * @property {never} [clientConfig] - This property should never be passed. + * @property awsSdkV3Client - Optional AWS SDK v3 client to pass during SSMProvider class instantiation + * @property clientConfig - This property should never be passed. */ interface SSMProviderOptionsWithClientInstance { /** @@ -45,9 +43,8 @@ interface SSMProviderOptionsWithClientInstance { /** * Options for the SSMProvider class constructor. * - * @type SSMProviderOptions - * @property {SSMClientConfig} [clientConfig] - Optional configuration to pass during client initialization, e.g. AWS region. Mutually exclusive with awsSdkV3Client. - * @property {SSMClient} [awsSdkV3Client] - Optional AWS SDK v3 client to pass during DynamoDBProvider class instantiation. Mutually exclusive with clientConfig. + * @property clientConfig - Optional configuration to pass during client initialization, e.g. AWS region. Mutually exclusive with awsSdkV3Client. + * @property awsSdkV3Client - Optional AWS SDK v3 client to pass during DynamoDBProvider class instantiation. Mutually exclusive with clientConfig. */ type SSMProviderOptions = | SSMProviderOptionsWithClientConfig @@ -58,11 +55,12 @@ type SSMProviderOptions = * * @interface SSMGetOptionsBase * @extends {GetOptionsInterface} - * @property {number} maxAge - Maximum age of the value in the cache, in seconds. - * @property {boolean} forceFetch - Force fetch the value from the parameter store, ignoring the cache. - * @property {GetItemCommandInput} [sdkOptions] - Additional options to pass to the AWS SDK v3 client. Supports all options from `GetParameterCommandInput`. - * @property {TransformOptions} transform - Transform to be applied, can be 'json' or 'binary'. - * @property {boolean} decrypt - If true, the parameter will be decrypted. Defaults to `false`. + * + * @property maxAge - Maximum age of the value in the cache, in seconds. + * @property forceFetch - Force fetch the value from the parameter store, ignoring the cache. + * @property sdkOptions - Optional options to pass to the AWS SDK v3 client. Supports all options from {@link GetParameterCommandInput | `GetParameterCommandInput`}. + * @property transform - Transform to be applied, can be 'json' or 'binary'. + * @property decrypt - If true, the parameter will be decrypted. Defaults to `false`. */ interface SSMGetOptionsBase extends GetOptionsInterface { /** @@ -154,15 +152,15 @@ type SSMGetOutput< /** * Options for the SSMProvider getMultiple method. * - * @interface SSMGetMultipleOptionsBase * @extends {GetMultipleOptionsInterface} - * @property {number} maxAge - Maximum age of the value in the cache, in seconds. - * @property {boolean} forceFetch - Force fetch the value from the parameter store, ignoring the cache. - * @property {GetItemCommandInput} [sdkOptions] - Additional options to pass to the AWS SDK v3 client. - * @property {TransformOptions} transform - Transform to be applied, can be 'json' or 'binary'. - * @property {boolean} decrypt - If true, the parameter will be decrypted. - * @property {boolean} recursive - If true, the parameter will be fetched recursively. - * @property {boolean} throwOnTransformError - If true, the method will throw an error if the transform fails. + * + * @property maxAge - Maximum age of the value in the cache, in seconds. + * @property forceFetch - Force fetch the value from the parameter store, ignoring the cache. + * @property [sdkOptions] - Additional options to pass to the AWS SDK v3 client. + * @property transform - Transform to be applied, can be 'json' or 'binary'. + * @property decrypt - If true, the parameter will be decrypted. + * @property recursive - If true, the parameter will be fetched recursively. + * @property throwOnTransformError - If true, the method will throw an error if the transform fails. */ interface SSMGetMultipleOptionsBase extends GetMultipleOptionsInterface { /** @@ -230,11 +228,10 @@ type SSMGetMultipleOutput< /** * Options for the SSMProvider getParametersByName method. * - * @interface SSMGetParametersByNameOptions - * @property {number} maxAge - Maximum age of the value in the cache, in seconds. - * @property {TransformOptions} transform - Transform to be applied, can be 'json' or 'binary'. - * @property {boolean} decrypt - If true, the parameter will be decrypted. - * @property {boolean} throwOnError - If true, the method will throw an error if one of the parameters cannot be fetched. Otherwise it will aggregate the errors under an _errors key in the response. + * @property maxAge - Maximum age of the value in the cache, in seconds. + * @property transform - Transform to be applied, can be 'json' or 'binary'. + * @property decrypt - If `true`, the parameter will be decrypted. + * @property throwOnError - If `true`, the method will throw an error if one of the parameters cannot be fetched. Otherwise it will aggregate the errors under an `_errors` key in the response. */ interface SSMGetParametersByNameOptions { maxAge?: number; diff --git a/packages/parameters/src/types/SecretsProvider.ts b/packages/parameters/src/types/SecretsProvider.ts index 0d31a66192..5db8d9ef7d 100644 --- a/packages/parameters/src/types/SecretsProvider.ts +++ b/packages/parameters/src/types/SecretsProvider.ts @@ -4,34 +4,32 @@ import type { SecretsManagerClient, SecretsManagerClientConfig, } from '@aws-sdk/client-secrets-manager'; +import type { SecretsProvider } from '../secrets/SecretsProvider.js'; import type { GetOptionsInterface, TransformOptions } from './BaseProvider.js'; /** - * Base interface for SecretsProviderOptions. + * Base interface for {@link SecretsProviderOptions | SecretsProviderOptions}. * - * @interface - * @property {SecretsManagerClientConfig} [clientConfig] - Optional configuration to pass during client initialization, e.g. AWS region. - * @property {never} [awsSdkV3Client] - This property should never be passed. + * @property clientConfig - Optional configuration to pass during client initialization, e.g. AWS region. + * @property awsSdkV3Client - This property should never be passed. */ interface SecretsProviderOptionsWithClientConfig { /** - * Optional configuration to pass during client initialization, e.g. AWS region. It accepts the same configuration object as the AWS SDK v3 client (`SecretsManagerClient`). + * Optional configuration to pass during client initialization, e.g. AWS region. Accepts the same configuration object as the AWS SDK v3 client ({@link SecretsManagerClientConfig | `SecretsManagerClientConfig`}). */ clientConfig?: SecretsManagerClientConfig; awsSdkV3Client?: never; } /** - * Interface for SecretsProviderOptions with awsSdkV3Client property. + * Interface for {@link SecretsProviderOptions | SecretsProviderOptions} with `awsSdkV3Client` property. * - * @interface - * @extends SecretsProviderOptionsWithClientConfig - * @property {SecretsManagerClient} [awsSdkV3Client] - Optional AWS SDK v3 client to pass during SecretsProvider class instantiation - * @property {never} [clientConfig] - This property should never be passed. + * @property awsSdkV3Client - Optional AWS SDK v3 client to pass during {@link SecretsProvider | `SecretsProvider`} class instantiation + * @property clientConfig - This property should never be passed. */ interface SecretsProviderOptionsWithClientInstance { /** - * Optional AWS SDK v3 client instance (`SecretsManagerClient`) to use for Secrets Manager operations. If not provided, we will create a new instance of `SecretsManagerClient`. + * Optional AWS SDK v3 client instance ({@link SecretsManagerClient | `SecretsManagerClient`}) to use for Secrets Manager operations. If not provided, we will create a new instance of the client. */ awsSdkV3Client?: SecretsManagerClient; clientConfig?: never; @@ -40,9 +38,8 @@ interface SecretsProviderOptionsWithClientInstance { /** * Options for the SecretsProvider class constructor. * - * @type SecretsProviderOptions - * @property {SecretsManagerClientConfig} [clientConfig] - Optional configuration to pass during client initialization, e.g. AWS region. Mutually exclusive with awsSdkV3Client. - * @property {SecretsManagerClient} [awsSdkV3Client] - Optional AWS SDK v3 client to pass during SecretsProvider class instantiation. Mutually exclusive with clientConfig. + * @property clientConfig - Optional configuration to pass during client initialization, e.g. AWS region. Mutually exclusive with `awsSdkV3Client`. + * @property awsSdkV3Client - Optional AWS SDK v3 client to pass during {@link SecretsProvider | `SecretsProvider`} class instantiation. Mutually exclusive with `clientConfig`. */ type SecretsProviderOptions = | SecretsProviderOptionsWithClientConfig @@ -51,18 +48,19 @@ type SecretsProviderOptions = /** * Options to configure the retrieval of a secret. * - * @interface SecretsGetOptionsBase - * @extends {GetOptionsInterface} - * @property {number} maxAge - Maximum age of the value in the cache, in seconds. - * @property {boolean} forceFetch - Force fetch the value from the parameter store, ignoring the cache. - * @property {GetSecretValueCommandInput} sdkOptions - Options to pass to the underlying SDK. - * @property {TransformOptions} transform - Transform to be applied, can be 'json' or 'binary'. + * @property maxAge - Maximum age of the value in the cache, in seconds. + * @property forceFetch - Force fetch the value from the parameter store, ignoring the cache. + * @property sdkOptions - Options to pass to the underlying SDK, supports all options from {@link GetSecretValueCommandInput | `GetSecretValueCommandInput`} except `SecretId`. + * @property transform - Transform to be applied, can be 'json' or 'binary'. */ interface SecretsGetOptionsBase extends GetOptionsInterface { /** - * Additional options to pass to the AWS SDK v3 client. Supports all options from `GetSecretValueCommandInput` except `SecretId`. + * Additional options to pass to the AWS SDK v3 client. Supports all options from {@link GetSecretValueCommandInput | `GetSecretValueCommandInput`} except `SecretId`. */ sdkOptions?: Omit, 'SecretId'>; + /** + * Transform to be applied, can be `json` or `binary`. + */ transform?: Exclude; } @@ -85,7 +83,7 @@ type SecretsGetOptions = | undefined; /** - * Generic output type for the SecretsProvider get method. + * Generic output type for the {@link SecretsProvider.get | `SecretsProvider.get()`} method. */ type SecretsGetOutput< ExplicitUserProvidedType = undefined, diff --git a/packages/parameters/tests/e2e/appConfigProvider.class.test.ts b/packages/parameters/tests/e2e/appConfigProvider.class.test.ts index af28e69110..938ae423e1 100644 --- a/packages/parameters/tests/e2e/appConfigProvider.class.test.ts +++ b/packages/parameters/tests/e2e/appConfigProvider.class.test.ts @@ -171,7 +171,7 @@ describe('Parameters E2E tests, AppConfig provider', () => { describe('AppConfigProvider usage', () => { // Test 1 - get a single parameter as-is (no transformation - should return an Uint8Array) - it('should retrieve single parameter as-is', () => { + it('retrieves single parameter as-is', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[0]); @@ -182,7 +182,7 @@ describe('Parameters E2E tests, AppConfig provider', () => { }); // Test 2 - get a free-form JSON and apply json transformation (should return an object) - it('should retrieve a free-form JSON parameter with JSON transformation', () => { + it('retrieves a free-form JSON parameter with JSON transformation', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[1]); @@ -194,7 +194,7 @@ describe('Parameters E2E tests, AppConfig provider', () => { // Test 3 - get a free-form base64-encoded plain text and apply binary transformation // (should return a decoded string) - it('should retrieve a base64-encoded plain text parameter with binary transformation', () => { + it('retrieves a base64-encoded plain text parameter with binary transformation', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[2]); @@ -205,7 +205,7 @@ describe('Parameters E2E tests, AppConfig provider', () => { }); // Test 4 - get a feature flag and apply json transformation (should return an object) - it('should retrieve a feature flag parameter with JSON transformation', () => { + it('retrieves a feature flag parameter with JSON transformation', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[3]); @@ -217,7 +217,7 @@ describe('Parameters E2E tests, AppConfig provider', () => { // Test 5 - get parameter twice with middleware, which counts the number // of requests, we check later if we only called AppConfig API once - it('should retrieve single parameter cached', () => { + it('retrieves single parameter cached', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[4]); @@ -229,7 +229,7 @@ describe('Parameters E2E tests, AppConfig provider', () => { // Test 6 - get parameter twice, but force fetch 2nd time, // we count number of SDK requests and check that we made two API calls - it('should retrieve single parameter twice without caching', async () => { + it('retrieves single parameter twice without caching', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[5]); @@ -242,7 +242,7 @@ describe('Parameters E2E tests, AppConfig provider', () => { // Test 7 - get parameter twice, using maxAge to avoid primary cache // we count number of SDK requests and check that we made two API calls // and check that the values match - it('should retrieve single parameter twice, with expiration between and matching values', async () => { + it('retrieves single parameter twice, with expiration between and matching values', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[6]); const result = freeFormPlainTextValue; diff --git a/packages/parameters/tests/e2e/dynamoDBProvider.class.test.ts b/packages/parameters/tests/e2e/dynamoDBProvider.class.test.ts index f4fa7c4ba4..9c3ac74cc6 100644 --- a/packages/parameters/tests/e2e/dynamoDBProvider.class.test.ts +++ b/packages/parameters/tests/e2e/dynamoDBProvider.class.test.ts @@ -263,7 +263,7 @@ describe('Parameters E2E tests, dynamoDB provider', () => { describe('DynamoDBProvider usage', () => { // Test 1 - get a single parameter with default options (keyAttr: 'id', valueAttr: 'value') - it('should retrieve a single parameter', async () => { + it('retrieves a single parameter', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[0]); @@ -274,7 +274,7 @@ describe('Parameters E2E tests, dynamoDB provider', () => { }); // Test 2 - get multiple parameters with default options (keyAttr: 'id', sortAttr: 'sk', valueAttr: 'value') - it('should retrieve multiple parameters', async () => { + it('retrieves multiple parameters', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[1]); @@ -285,7 +285,7 @@ describe('Parameters E2E tests, dynamoDB provider', () => { }); // Test 3 - get a single parameter with custom options (keyAttr: 'key', valueAttr: 'val') - it('should retrieve a single parameter', async () => { + it('retrieves a single parameter', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[2]); @@ -296,7 +296,7 @@ describe('Parameters E2E tests, dynamoDB provider', () => { }); // Test 4 - get multiple parameters with custom options (keyAttr: 'key', sortAttr: 'sort', valueAttr: 'val') - it('should retrieve multiple parameters', async () => { + it('retrieves multiple parameters', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[3]); @@ -307,7 +307,7 @@ describe('Parameters E2E tests, dynamoDB provider', () => { }); // Test 5 - get a single parameter with json transform - it('should retrieve a single parameter with json transform', async () => { + it('retrieves a single parameter with json transform', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[4]); @@ -318,7 +318,7 @@ describe('Parameters E2E tests, dynamoDB provider', () => { }); // Test 6 - get a single parameter with binary transform - it('should retrieve a single parameter with binary transform', async () => { + it('retrieves a single parameter with binary transform', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[5]); @@ -329,7 +329,7 @@ describe('Parameters E2E tests, dynamoDB provider', () => { }); // Test 7 - get multiple parameters with auto transforms (json and binary) - it('should retrieve multiple parameters with auto transforms', async () => { + it('retrieves multiple parameters with auto transforms', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[6]); @@ -343,7 +343,7 @@ describe('Parameters E2E tests, dynamoDB provider', () => { }); // Test 8 - Get a parameter twice and check that the value is cached. - it('should retrieve multiple parameters with auto transforms', async () => { + it('retrieves multiple parameters with auto transforms', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[7]); @@ -354,7 +354,7 @@ describe('Parameters E2E tests, dynamoDB provider', () => { }); // Test 9 - Get a cached parameter and force retrieval. - it('should retrieve multiple parameters with auto transforms', async () => { + it('retrieves multiple parameters with auto transforms', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[8]); diff --git a/packages/parameters/tests/e2e/secretsProvider.class.test.ts b/packages/parameters/tests/e2e/secretsProvider.class.test.ts index b52481cbed..2899b1ac2d 100644 --- a/packages/parameters/tests/e2e/secretsProvider.class.test.ts +++ b/packages/parameters/tests/e2e/secretsProvider.class.test.ts @@ -136,7 +136,7 @@ describe('Parameters E2E tests, Secrets Manager provider', () => { }); describe('SecretsProvider usage', () => { - it('should retrieve a secret as plain string', async () => { + it('retrieves a secret as plain string', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[0]); @@ -146,7 +146,7 @@ describe('Parameters E2E tests, Secrets Manager provider', () => { }); }); - it('should retrieve a secret using transform json option', async () => { + it('retrieves a secret using transform json option', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[1]); @@ -156,7 +156,7 @@ describe('Parameters E2E tests, Secrets Manager provider', () => { }); }); - it('should retrieve a secret using transform binary option', async () => { + it('retrieves a secret using transform binary option', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[2]); @@ -167,7 +167,7 @@ describe('Parameters E2E tests, Secrets Manager provider', () => { }); }); - it('should retrieve a secret twice with cached value', async () => { + it('retrieves a secret twice with cached value', () => { const logs = invocationLogs.getFunctionLogs(); const testLogFirst = TestInvocationLogs.parseFunctionLog(logs[3]); @@ -178,7 +178,7 @@ describe('Parameters E2E tests, Secrets Manager provider', () => { }); }); - it('should retrieve a secret twice with forceFetch second time', async () => { + it('retrieves a secret twice with forceFetch second time', () => { const logs = invocationLogs.getFunctionLogs(); const testLogFirst = TestInvocationLogs.parseFunctionLog(logs[4]); diff --git a/packages/parameters/tests/e2e/ssmProvider.class.test.ts b/packages/parameters/tests/e2e/ssmProvider.class.test.ts index c5a28619fc..f65fb0c88f 100644 --- a/packages/parameters/tests/e2e/ssmProvider.class.test.ts +++ b/packages/parameters/tests/e2e/ssmProvider.class.test.ts @@ -188,7 +188,7 @@ describe('Parameters E2E tests, SSM provider', () => { describe('SSMProvider usage', () => { // Test 1 - get a single parameter by name with default options - it('should retrieve a single parameter', async () => { + it('retrieves a single parameter', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[0]); @@ -199,7 +199,7 @@ describe('Parameters E2E tests, SSM provider', () => { }); // Test 2 - get a single parameter by name with decrypt - it('should retrieve a single parameter with decryption', async () => { + it('retrieves a single parameter with decryption', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[1]); @@ -210,7 +210,7 @@ describe('Parameters E2E tests, SSM provider', () => { }); // Test 3 - get multiple parameters by path with default options - it('should retrieve multiple parameters', async () => { + it('retrieves multiple parameters', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[2]); const expectedParameterNameA = paramA.substring( @@ -232,7 +232,7 @@ describe('Parameters E2E tests, SSM provider', () => { // Test 4 - get multiple parameters by path recursively // (aka. get all parameters under a path recursively) i.e. // given /param, retrieve /param/get/a and /param/get/b (note path depth) - it('should retrieve multiple parameters recursively', async () => { + it('retrieves multiple parameters recursively', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[3]); const expectedParameterNameA = paramA.substring( @@ -251,7 +251,7 @@ describe('Parameters E2E tests, SSM provider', () => { }); }); - it('should retrieve multiple parameters with decryption', async () => { + it('retrieves multiple parameters with decryption', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[4]); const expectedParameterNameA = paramEncryptedA.substring( @@ -271,7 +271,7 @@ describe('Parameters E2E tests, SSM provider', () => { }); // Test 6 - get multiple parameters by name with default options - it('should retrieve multiple parameters by name', async () => { + it('retrieves multiple parameters by name', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[5]); @@ -285,7 +285,7 @@ describe('Parameters E2E tests, SSM provider', () => { }); // Test 7 - get multiple parameters by name, some of them encrypted and some not - it('should retrieve multiple parameters by name with mixed decryption', async () => { + it('retrieves multiple parameters by name with mixed decryption', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[6]); @@ -301,7 +301,7 @@ describe('Parameters E2E tests, SSM provider', () => { // Test 8 - get parameter twice with middleware, which counts the number // of requests, we check later if we only called SSM API once - it('should retrieve single parameter cached', async () => { + it('retrieves single parameter cached', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[7]); @@ -313,7 +313,7 @@ describe('Parameters E2E tests, SSM provider', () => { // Test 9 - get parameter twice, but force fetch 2nd time, // we count number of SDK requests and check that we made two API calls - it('should retrieve single parameter twice without caching', async () => { + it('retrieves single parameter twice without caching', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[8]); @@ -324,7 +324,7 @@ describe('Parameters E2E tests, SSM provider', () => { }); // Test 10 - store and overwrite single parameter - it('should store and overwrite single parameter', async () => { + it('stores and overwrite single parameter', () => { const logs = invocationLogs.getFunctionLogs(); const testLog = TestInvocationLogs.parseFunctionLog(logs[9]); diff --git a/packages/parameters/tests/unit/AppConfigProvider.test.ts b/packages/parameters/tests/unit/AppConfigProvider.test.ts index 5bfb01ace3..2112bcdf45 100644 --- a/packages/parameters/tests/unit/AppConfigProvider.test.ts +++ b/packages/parameters/tests/unit/AppConfigProvider.test.ts @@ -9,7 +9,7 @@ import { mockClient } from 'aws-sdk-client-mock'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { AppConfigProvider } from '../../src/appconfig/index.js'; import { ExpirableValue } from '../../src/base/ExpirableValue.js'; -import { APPCONFIG_TOKEN_EXPIRATION } from '../../src/constants'; +import { APPCONFIG_TOKEN_EXPIRATION } from '../../src/constants.js'; import type { AppConfigProviderOptions } from '../../src/types/AppConfigProvider.js'; vi.mock('@aws-lambda-powertools/commons', async (importOriginal) => ({ @@ -27,7 +27,7 @@ describe('Class: AppConfigProvider', () => { }); describe('Method: constructor', () => { - it('instantiates a new AWS SDK and adds a middleware to it', async () => { + it('instantiates a new AWS SDK and adds a middleware to it', () => { // Prepare const options: AppConfigProviderOptions = { application: 'MyApp', @@ -66,7 +66,7 @@ describe('Class: AppConfigProvider', () => { expect(addUserAgentMiddleware).toHaveBeenCalled(); }); - it('uses the provided AWS SDK client', async () => { + it('uses the provided AWS SDK client', () => { // Prepare const awsSdkV3Client = new AppConfigDataClient({ endpoint: 'http://localhost:8000', @@ -90,7 +90,7 @@ describe('Class: AppConfigProvider', () => { ); }); - it('falls back on a new SDK client and logs a warning when an unknown object is provided instead of a client', async () => { + it('falls back on a new SDK client and logs a warning when an unknown object is provided instead of a client', () => { // Prepare const awsSdkV3Client = {}; const options: AppConfigProviderOptions = { @@ -179,7 +179,7 @@ describe('Class: AppConfigProvider', () => { expect(result).toBe(mockData); }); - it('throws when no application is set', async () => { + it('throws when no application is set', () => { // Prepare process.env.POWERTOOLS_SERVICE_NAME = ''; const options = { diff --git a/packages/parameters/tests/unit/DynamoDBProvider.test.ts b/packages/parameters/tests/unit/DynamoDBProvider.test.ts index 195a766d3d..7b7018d889 100644 --- a/packages/parameters/tests/unit/DynamoDBProvider.test.ts +++ b/packages/parameters/tests/unit/DynamoDBProvider.test.ts @@ -27,7 +27,7 @@ describe('Class: DynamoDBProvider', () => { }); describe('Method: constructor', () => { - it('instantiates a new AWS SDK with default options', async () => { + it('instantiates a new AWS SDK with default options', () => { // Prepare const options: DynamoDBProviderOptions = { tableName: 'test-table', @@ -64,7 +64,7 @@ describe('Class: DynamoDBProvider', () => { expect(addUserAgentMiddleware).toHaveBeenCalled(); }); - it('uses the provided AWS SDK client', async () => { + it('uses the provided AWS SDK client', () => { // Prepare const awsSdkV3Client = new DynamoDBClient({ endpoint: 'http://localhost:8000', @@ -87,7 +87,7 @@ describe('Class: DynamoDBProvider', () => { ); }); - it('falls back on a new SDK client and logs a warning when an unknown object is provided instead of a client', async () => { + it('falls back on a new SDK client and logs a warning when an unknown object is provided instead of a client', () => { // Prepare const awsSdkV3Client = {}; const options: DynamoDBProviderOptions = { diff --git a/packages/parameters/tests/unit/SSMProvider.test.ts b/packages/parameters/tests/unit/SSMProvider.test.ts index 0b28f6863a..ab7da09989 100644 --- a/packages/parameters/tests/unit/SSMProvider.test.ts +++ b/packages/parameters/tests/unit/SSMProvider.test.ts @@ -36,7 +36,7 @@ describe('Class: SSMProvider', () => { }); describe('Method: constructor', () => { - it('adds the middleware to the created AWS SDK', async () => { + it('adds the middleware to the created AWS SDK', () => { // Prepare const options: SSMProviderOptions = {}; @@ -70,7 +70,7 @@ describe('Class: SSMProvider', () => { expect(addUserAgentMiddleware).toHaveBeenCalled(); }); - it('uses the provided AWS SDK client', async () => { + it('uses the provided AWS SDK client', () => { // Prepare const awsSdkV3Client = new SSMClient({ endpoint: 'http://localhost:3000', @@ -92,7 +92,7 @@ describe('Class: SSMProvider', () => { ); }); - it('falls back on a new SDK client and logs a warning when an unknown object is provided instead of a client', async () => { + it('falls back on a new SDK client and logs a warning when an unknown object is provided instead of a client', () => { // Prepare const awsSdkV3Client = {}; const options: SSMProviderOptions = { @@ -657,7 +657,7 @@ describe('Class: SSMProvider', () => { it('returns parameters from cache when present', async () => { // Prepare const provider = new SSMProviderMock(); - provider.getParametersByNameFromCache.mockResolvedValueOnce({ + provider.getParametersByNameFromCache.mockReturnValueOnce({ cached: { '/foo/bar': 'bar', '/foo/baz': 'baz', @@ -690,7 +690,7 @@ describe('Class: SSMProvider', () => { it('retrieves the parameters from remote when not present in the cache', async () => { // Prepare const provider = new SSMProviderMock(); - provider.getParametersByNameFromCache.mockResolvedValueOnce({ + provider.getParametersByNameFromCache.mockReturnValueOnce({ cached: {}, toFetch: { '/foo/bar': {}, @@ -738,7 +738,7 @@ describe('Class: SSMProvider', () => { it('retrieves the parameters not present in the cache and returns them, together with the cached ones', async () => { // Prepare const provider = new SSMProviderMock(); - provider.getParametersByNameFromCache.mockResolvedValueOnce({ + provider.getParametersByNameFromCache.mockReturnValueOnce({ cached: { '/foo/bar': 'bar', }, @@ -790,14 +790,14 @@ describe('Class: SSMProvider', () => { this.store.set(key, value); } - public async getParametersByNameFromCache( + public getParametersByNameFromCache( parameters: Record - ): Promise { + ): SSMGetParametersByNameFromCacheOutputType { return super.getParametersByNameFromCache(parameters); } } - it('returns an object with parameters split by cached and to fetch', async () => { + it('returns an object with parameters split by cached and to fetch', () => { // Prepare const provider = new SSMProviderMock(); const parameters = { @@ -811,7 +811,7 @@ describe('Class: SSMProvider', () => { // Act const { cached, toFetch } = - await provider.getParametersByNameFromCache(parameters); + provider.getParametersByNameFromCache(parameters); // Assess expect(cached).toEqual({ @@ -828,7 +828,7 @@ describe('Class: SSMProvider', () => { public _getParametersByName = vi.fn(); public maxGetParametersItems = 1; - public async getParametersByNameInChunks( + public getParametersByNameInChunks( parameters: Record, throwOnError: boolean, decrypt: boolean @@ -933,7 +933,7 @@ describe('Class: SSMProvider', () => { class SSMProviderMock extends SSMProvider { public _get = vi.fn(); - public async getParametersByNameWithDecryptOption( + public getParametersByNameWithDecryptOption( parameters: Record, throwOnError: boolean ): Promise { diff --git a/packages/parameters/tests/unit/SecretsProvider.test.ts b/packages/parameters/tests/unit/SecretsProvider.test.ts index 7a9bc71a4f..b79c46b6af 100644 --- a/packages/parameters/tests/unit/SecretsProvider.test.ts +++ b/packages/parameters/tests/unit/SecretsProvider.test.ts @@ -23,7 +23,7 @@ describe('Class: SecretsProvider', () => { }); describe('Method: constructor', () => { - it('instantiates a new AWS SDK with default options', async () => { + it('instantiates a new AWS SDK with default options', () => { // Prepare const options: SecretsProviderOptions = {}; @@ -57,7 +57,7 @@ describe('Class: SecretsProvider', () => { expect(addUserAgentMiddleware).toHaveBeenCalled(); }); - it('uses the provided AWS SDK client', async () => { + it('uses the provided AWS SDK client', () => { // Prepare const awsSdkV3Client = new SecretsManagerClient({ endpoint: 'http://localhost:3000', @@ -79,7 +79,7 @@ describe('Class: SecretsProvider', () => { ); }); - it('falls back on a new SDK client and logs a warning when an unknown object is provided instead of a client', async () => { + it('falls back on a new SDK client and logs a warning when an unknown object is provided instead of a client', () => { // Prepare const awsSdkV3Client = {}; const options: SecretsProviderOptions = { diff --git a/packages/parameters/tests/unit/setParameter.test.ts b/packages/parameters/tests/unit/setParameter.test.ts index b9a0ebf01d..fa03b2ed58 100644 --- a/packages/parameters/tests/unit/setParameter.test.ts +++ b/packages/parameters/tests/unit/setParameter.test.ts @@ -49,7 +49,7 @@ describe('Function: setParameter', () => { expect(DEFAULT_PROVIDERS.ssm).toBe(provider); }); - it('rethrows the error thrown by the underlying sdk client', async () => { + it('rethrows the error thrown by the underlying sdk client', () => { // Prepare const options: SSMSetOptions = { value: 'my-value' }; client.on(PutParameterCommand).rejects(new Error('Could not send command')); diff --git a/packages/parameters/typedoc.json b/packages/parameters/typedoc.json index 90daedca0b..6f77a07a12 100644 --- a/packages/parameters/typedoc.json +++ b/packages/parameters/typedoc.json @@ -13,5 +13,22 @@ "./src/errors.ts", "./src/constants.ts" ], - "readme": "README.md" + "readme": "README.md", + "externalSymbolLinkMappings": { + "@aws-sdk/client-secrets-manager": { + "GetSecretValueCommandInput": "https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-secrets-manager/Interface/GetSecretValueCommandInput/" + }, + "@aws-sdk/client-dynamodb": { + "DynamoDBClient": "https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/dynamodb/", + "GetItemCommandInput": "https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-dynamodb/Interface/GetItemCommandInput/", + "QueryCommandInput": "https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-dynamodb/Interface/QueryCommandInput/" + }, + "@aws-sdk/client-appconfigdata": { + "AppConfigDataClient": "https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/appconfigdata/", + "StartConfigurationSessionCommandInput": "https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-appconfigdata/Interface/StartConfigurationSessionCommandInput/" + }, + "@aws-sdk/client-ssm": { + "GetParameterCommandInput": "https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ssm/Interface/GetParameterCommandInput/" + } + } } diff --git a/packages/parser/package.json b/packages/parser/package.json index 5f4e93bce9..0c7f631c29 100644 --- a/packages/parser/package.json +++ b/packages/parser/package.json @@ -23,6 +23,7 @@ "build": "npm run build:esm & npm run build:cjs", "lint": "biome lint .", "lint:fix": "biome check --write .", + "lint:ci": "biome ci .", "prepack": "node ../../.github/scripts/release_patch_package_json.js ." }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/parser#readme", diff --git a/packages/parser/src/envelopes/sns-sqs.ts b/packages/parser/src/envelopes/sns-sqs.ts index 1aa17288e0..452930c0ed 100644 --- a/packages/parser/src/envelopes/sns-sqs.ts +++ b/packages/parser/src/envelopes/sns-sqs.ts @@ -150,11 +150,11 @@ export const SnsSqsEnvelope = { }>( (acc, record, index) => { const parsed = parseRecord(record, index); - if (!parsed.success) { + if (parsed.success) { + acc.records.push(parsed.data); + } else { acc.success = false; acc.errors[index] = parsed.error; - } else { - acc.records.push(parsed.data); } return acc; }, diff --git a/packages/parser/src/parserDecorator.ts b/packages/parser/src/parserDecorator.ts index 2089091894..d0166a4518 100644 --- a/packages/parser/src/parserDecorator.ts +++ b/packages/parser/src/parserDecorator.ts @@ -84,7 +84,7 @@ export const parser = < const { schema, envelope, safeParse } = options; - descriptor.value = async function ( + descriptor.value = function ( this: Handler, ...args: [ParserOutput, Context, Callback] ) { diff --git a/packages/parser/src/schemas/appsync-events.ts b/packages/parser/src/schemas/appsync-events.ts index 5c7b39f809..14bcdd1556 100644 --- a/packages/parser/src/schemas/appsync-events.ts +++ b/packages/parser/src/schemas/appsync-events.ts @@ -169,12 +169,14 @@ const AppSyncEventsSubscribeSchema = AppSyncEventsBaseSchema.extend({ export { AppSyncEventsBaseSchema, - AppSyncCognitoIdentity, - AppSyncIamIdentity, AppSyncLambdaAuthIdentity, - AppSyncOidcIdentity, AppSyncEventsRequestSchema, AppSyncEventsInfoSchema, AppSyncEventsPublishSchema, AppSyncEventsSubscribeSchema, }; +export { + AppSyncCognitoIdentity, + AppSyncIamIdentity, + AppSyncOidcIdentity, +} from './appsync-shared.js'; diff --git a/packages/parser/src/schemas/appsync.ts b/packages/parser/src/schemas/appsync.ts index ca2c554bec..dfdef7c29c 100644 --- a/packages/parser/src/schemas/appsync.ts +++ b/packages/parser/src/schemas/appsync.ts @@ -236,8 +236,10 @@ const AppSyncBatchResolverSchema = z.array(AppSyncResolverSchema); export { AppSyncResolverSchema, AppSyncBatchResolverSchema, + AppSyncLambdaIdentity, +}; +export { AppSyncCognitoIdentity, AppSyncIamIdentity, AppSyncOidcIdentity, - AppSyncLambdaIdentity, -}; +} from './appsync-shared.js'; diff --git a/packages/parser/src/schemas/cognito.ts b/packages/parser/src/schemas/cognito.ts index e7240cd0e8..08bcc5ac97 100644 --- a/packages/parser/src/schemas/cognito.ts +++ b/packages/parser/src/schemas/cognito.ts @@ -132,7 +132,7 @@ const PostConfirmationTriggerSchema = CognitoTriggerBaseSchema.extend({ * } * ``` * - * * @see {@link https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-authentication.html | Amazon Cognito Developer Guide} + * @see {@link https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-authentication.html | Amazon Cognito Developer Guide} */ const PreAuthenticationTriggerSchema = CognitoTriggerBaseSchema.extend({ triggerSource: z.literal('PreAuthentication_Authentication'), diff --git a/packages/parser/src/schemas/kafka.ts b/packages/parser/src/schemas/kafka.ts index 3747755a2d..28962752e0 100644 --- a/packages/parser/src/schemas/kafka.ts +++ b/packages/parser/src/schemas/kafka.ts @@ -23,7 +23,7 @@ const KafkaRecordSchema = z.object({ z.record( z.string(), z.array(z.number()).transform((value) => { - return String.fromCharCode(...value); + return String.fromCodePoint(...value); }) ) ), diff --git a/packages/parser/src/types/parser.ts b/packages/parser/src/types/parser.ts index 56f4f1d109..de6c4c982d 100644 --- a/packages/parser/src/types/parser.ts +++ b/packages/parser/src/types/parser.ts @@ -85,7 +85,7 @@ type ParserOutput< /** * The parser function that can parse the data using the provided schema and envelope * we use function overloads to provide the correct return type based on the provided envelope - **/ + */ type ParseFunction = { // No envelope, no safeParse ( diff --git a/packages/parser/tests/types/parser.test-d.ts b/packages/parser/tests/types/parser.test-d.ts index 6ac8f86cf5..3cc9ec3a95 100644 --- a/packages/parser/tests/types/parser.test-d.ts +++ b/packages/parser/tests/types/parser.test-d.ts @@ -73,7 +73,7 @@ describe('Parser types', () => { envelope: SqsEnvelope, }) ) - .handler(async (event) => { + .handler((event) => { expectTypeOf(event).toEqualTypeOf(); }); }); diff --git a/packages/parser/tests/unit/parser.decorator.test.ts b/packages/parser/tests/unit/parser.decorator.test.ts index 7955bca551..13ca3f32b9 100644 --- a/packages/parser/tests/unit/parser.decorator.test.ts +++ b/packages/parser/tests/unit/parser.decorator.test.ts @@ -1,3 +1,4 @@ +import { setTimeout } from 'node:timers/promises'; import type { LambdaInterface } from '@aws-lambda-powertools/commons/types'; import type { Context } from 'aws-lambda'; import { describe, expect, it } from 'vitest'; @@ -30,6 +31,7 @@ describe('Decorator: parser', () => { class TestClass implements LambdaInterface { @parser({ schema: extendedSchema }) public async handler(event: event, _context: Context): Promise { + await setTimeout(1); // simulate some processing time return event; } @@ -38,6 +40,7 @@ describe('Decorator: parser', () => { event: z.infer, _context: Context ): Promise { + await setTimeout(1); // simulate some processing time return this.anotherMethod(event); } @@ -49,6 +52,7 @@ describe('Decorator: parser', () => { event: ParsedResult, _context: Context ): Promise> { + await setTimeout(1); // simulate some processing time return event; } @@ -61,10 +65,11 @@ describe('Decorator: parser', () => { event: ParsedResult, _context: Context ): Promise { + await setTimeout(1); // simulate some processing time return event; } - private async anotherMethod(event: unknown): Promise { + private anotherMethod(event: unknown): unknown { return event; } } diff --git a/packages/parser/tests/unit/parser.middy.test.ts b/packages/parser/tests/unit/parser.middy.test.ts index 34a3f1caf8..c138a3e5cf 100644 --- a/packages/parser/tests/unit/parser.middy.test.ts +++ b/packages/parser/tests/unit/parser.middy.test.ts @@ -54,7 +54,7 @@ describe('Middleware: parser', () => { const event = structuredClone(baseEventBridgeEvent); // Act & Assess - expect( + await expect( middy() .use(parser({ schema: z.string(), envelope: SqsEnvelope })) .handler((event) => event)(event as unknown as string[], {} as Context) @@ -68,7 +68,7 @@ describe('Middleware: parser', () => { event.Records[1].body = undefined; // Act & Assess - expect( + await expect( handlerWithSchemaAndEnvelope(event as unknown as string[], {} as Context) ).rejects.toThrow(); }); @@ -91,7 +91,7 @@ describe('Middleware: parser', () => { const event = structuredClone(JSONPayload); // Act & Assess - expect( + await expect( middy((event) => event).use(parser({ schema: z.number() }))( event as unknown as number, {} as Context diff --git a/packages/parser/tests/unit/parser.test.ts b/packages/parser/tests/unit/parser.test.ts index 374e41c245..a7fb4fee58 100644 --- a/packages/parser/tests/unit/parser.test.ts +++ b/packages/parser/tests/unit/parser.test.ts @@ -24,7 +24,7 @@ describe('Parser', () => { }); const JSONPayload = { name: 'John', age: 18 }; - it('parses an event with schema and envelope', async () => { + it('parses an event with schema and envelope', () => { // Prepare const event = structuredClone(baseSqsEvent); event.Records[1].body = 'bar'; @@ -37,7 +37,7 @@ describe('Parser', () => { expect(result).toStrictEqual(['Test message.', 'bar']); }); - it('throws when envelope does not match', async () => { + it('throws when envelope does not match', () => { // Prepare const event = structuredClone(baseEventBridgeEvent); @@ -45,7 +45,7 @@ describe('Parser', () => { expect(() => parse(event, SqsEnvelope, z.string())).toThrow(); }); - it('throws when schema does not match', async () => { + it('throws when schema does not match', () => { // Prepare const event = structuredClone(baseSqsEvent); // @ts-expect-error - setting an invalid body @@ -55,7 +55,7 @@ describe('Parser', () => { expect(() => parse(event, SqsEnvelope, z.string())).toThrow(); }); - it('parses the event successfully', async () => { + it('parses the event successfully', () => { // Prepare const event = 42; @@ -66,7 +66,7 @@ describe('Parser', () => { expect(result).toEqual(event); }); - it('throws when the event does not match the schema', async () => { + it('throws when the event does not match the schema', () => { // Prepare const event = structuredClone(JSONPayload); @@ -74,7 +74,7 @@ describe('Parser', () => { expect(() => parse(event, undefined, z.number())).toThrow(); }); - it('returns the payload when using safeParse', async () => { + it('returns the payload when using safeParse', () => { // Prepare const event = structuredClone(JSONPayload); @@ -88,7 +88,7 @@ describe('Parser', () => { }); }); - it('returns the error when using safeParse and the payload is invalid', async () => { + it('returns the error when using safeParse and the payload is invalid', () => { // Prepare const event = structuredClone(JSONPayload); @@ -103,7 +103,7 @@ describe('Parser', () => { }); }); - it('returns the payload when using safeParse with envelope', async () => { + it('returns the payload when using safeParse with envelope', () => { // Prepare const detail = structuredClone(JSONPayload); const event = structuredClone(baseEventBridgeEvent); @@ -119,7 +119,7 @@ describe('Parser', () => { }); }); - it('returns an error when using safeParse with envelope and the payload is invalid', async () => { + it('returns an error when using safeParse with envelope and the payload is invalid', () => { // Prepare const event = structuredClone(baseEventBridgeEvent); diff --git a/packages/testing/package.json b/packages/testing/package.json index 734dbe77a5..5357c036f8 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -16,6 +16,7 @@ "build": "npm run build:esm & npm run build:cjs", "lint": "biome lint .", "lint:fix": "biome check --write .", + "lint:ci": "biome ci .", "prepack": "node ../../.github/scripts/release_patch_package_json.js ." }, "repository": { diff --git a/packages/testing/src/TestStack.ts b/packages/testing/src/TestStack.ts index 59bb975385..c42c30c7cd 100644 --- a/packages/testing/src/TestStack.ts +++ b/packages/testing/src/TestStack.ts @@ -80,6 +80,8 @@ class TestStack { * Otherwise, we log messages that are either warnings or errors as well as periodic * updates on the stack creation and destruction process. * + * biome-ignore lint/suspicious/useAwait: The CDK interface requires this to be async + * * @param msg - Message to log sent by the CDK CLI */ async notify(msg) { @@ -115,6 +117,7 @@ class TestStack { testConsole.log(msg); } }, + // biome-ignore lint/suspicious/useAwait: The CDK interface requires this to be async async requestResponse(msg) { if ( process.env.RUNNER_DEBUG === '1' || diff --git a/packages/testing/src/setupEnv.ts b/packages/testing/src/setupEnv.ts index 7363a80828..4960f75795 100644 --- a/packages/testing/src/setupEnv.ts +++ b/packages/testing/src/setupEnv.ts @@ -228,7 +228,7 @@ expect.addEqualityTesters([ // or this.equals(a.message, b.message) return this.equals(a.issues, b.issues); } - return aOk !== bOk ? false : undefined; + return aOk === bOk ? undefined : false; }, ]); diff --git a/packages/testing/src/xray-traces-utils.ts b/packages/testing/src/xray-traces-utils.ts index df1071e12d..b6115b3b88 100644 --- a/packages/testing/src/xray-traces-utils.ts +++ b/packages/testing/src/xray-traces-utils.ts @@ -16,7 +16,7 @@ import type { const retryOptions = { retries: 20, - minTimeout: 5_000, + minTimeout: 5000, maxTimeout: 10_000, factor: 1.25, }; diff --git a/packages/tracer/package.json b/packages/tracer/package.json index ac27c2e654..e36d2eed6b 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -23,6 +23,7 @@ "build": "npm run build:esm & npm run build:cjs", "lint": "biome lint .", "lint:fix": "biome check --write .", + "lint:ci": "biome ci .", "prepack": "node ../../.github/scripts/release_patch_package_json.js ." }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/tracer#readme", diff --git a/packages/tracer/src/Tracer.ts b/packages/tracer/src/Tracer.ts index 3c3cfb94e1..b498f7e74e 100644 --- a/packages/tracer/src/Tracer.ts +++ b/packages/tracer/src/Tracer.ts @@ -41,29 +41,24 @@ import type { const { Subsegment: XraySubsegment } = xraySdk; /** - * ## Intro * Tracer is an opinionated thin wrapper for [AWS X-Ray SDK for Node.js](https://github.com/aws/aws-xray-sdk-node). * * Tracing data can be visualized through AWS X-Ray Console. * - * ## Key features - * * Auto capture cold start as annotation, and responses or full exceptions as metadata - * * Auto-disable when not running in AWS Lambda environment - * * Automatically trace HTTP(s) clients and generate segments for each request - * * Support tracing functions via decorators, middleware, and manual instrumentation - * * Support tracing AWS SDK v2 and v3 via AWS X-Ray SDK for Node.js + * **Key features** + * - Auto capture cold start as annotation, and responses or full exceptions as metadata + * - Auto-disable when not running in AWS Lambda environment + * - Automatically trace HTTP(s) clients and generate segments for each request + * - Support tracing functions via decorators, middleware, and manual instrumentation + * - Support tracing AWS SDK v2 and v3 via AWS X-Ray SDK for Node.js * - * ## Usage - * - * For more usage examples, see [our documentation](https://docs.powertools.aws.dev/lambda/typescript/latest/core/tracer/). - * - * ### Functions usage with middleware + * **Functions usage with middleware** * * If you use function-based Lambda handlers you can use the {@link Tracer.captureLambdaHandler} middy middleware to automatically: - * * handle the subsegment lifecycle - * * add the `ServiceName` and `ColdStart` annotations - * * add the function response as metadata - * * add the function error as metadata (if any) + * - handle the subsegment lifecycle + * - add the `ServiceName` and `ColdStart` annotations + * - add the function response as metadata + * - add the function error as metadata (if any) * * @example * ```typescript @@ -80,13 +75,13 @@ const { Subsegment: XraySubsegment } = xraySdk; * export const handler = middy(lambdaHandler).use(captureLambdaHandler(tracer)); * ``` * - * ### Object oriented usage with decorators + * **Object oriented usage with decorators** * * If instead you use TypeScript Classes to wrap your Lambda handler you can use the {@link Tracer.captureLambdaHandler} decorator to automatically: - * * handle the subsegment lifecycle - * * add the `ServiceName` and `ColdStart` annotations - * * add the function response as metadata - * * add the function error as metadata (if any) + * - handle the subsegment lifecycle + * - add the `ServiceName` and `ColdStart` annotations + * - add the function response as metadata + * - add the function error as metadata (if any) * * @example * ```typescript @@ -106,7 +101,7 @@ const { Subsegment: XraySubsegment } = xraySdk; * export const handler = handlerClass.handler.bind(handlerClass); * ``` * - * ### Functions usage with manual instrumentation + * **Functions usage with manual instrumentation** * * If you prefer to manually instrument your Lambda handler you can use the methods in the tracer class directly. * @@ -391,10 +386,10 @@ class Tracer extends Utility implements TracerInterface { * A decorator automating capture of metadata and annotations on segments or subsegments for a Lambda Handler. * * Using this decorator on your handler function will automatically: - * * handle the subsegment lifecycle - * * add the `ColdStart` annotation - * * add the function response as metadata - * * add the function error as metadata (if any) + * - handle the subsegment lifecycle + * - add the `ColdStart` annotation + * - add the function response as metadata + * - add the function error as metadata (if any) * * Note: Currently TypeScript only supports decorators on classes and methods. If you are using the * function syntax, you should use the middleware instead. @@ -475,9 +470,9 @@ class Tracer extends Utility implements TracerInterface { * A decorator automating capture of metadata and annotations on segments or subsegments for an arbitrary function. * * Using this decorator on your function will automatically: - * * handle the subsegment lifecycle - * * add the function response as metadata - * * add the function error as metadata (if any) + * - handle the subsegment lifecycle + * - add the function response as metadata + * - add the function error as metadata (if any) * * Note: Currently TypeScript only supports decorators on classes and methods. If you are using the * function syntax, you should use the middleware instead. diff --git a/packages/tracer/src/middleware/middy.ts b/packages/tracer/src/middleware/middy.ts index 90207d7664..793bd94a93 100644 --- a/packages/tracer/src/middleware/middy.ts +++ b/packages/tracer/src/middleware/middy.ts @@ -11,10 +11,10 @@ import type { CaptureLambdaHandlerOptions } from '../types/Tracer.js'; * A middy middleware automating capture of metadata and annotations on segments or subsegments for a Lambda Handler. * * Using this middleware on your handler function will automatically: - * * handle the subsegment lifecycle - * * add the `ColdStart` annotation - * * add the function response as metadata - * * add the function error as metadata (if any) + * - handle the subsegment lifecycle + * - add the `ColdStart` annotation + * - add the function response as metadata + * - add the function error as metadata (if any) * * @example * ```typescript @@ -33,7 +33,6 @@ import type { CaptureLambdaHandlerOptions } from '../types/Tracer.js'; * * @param target - The Tracer instance to use for tracing * @param options - (_optional_) Options for the middleware - * @returns middleware - The middy middleware object */ const captureLambdaHandler = ( target: Tracer, @@ -83,9 +82,7 @@ const captureLambdaHandler = ( target.setSegment(lambdaSegment); }; - const captureLambdaHandlerBefore = async ( - request: MiddyLikeRequest - ): Promise => { + const before = (request: MiddyLikeRequest) => { if (target.isTracingEnabled()) { open(); setCleanupFunction(request); @@ -94,9 +91,7 @@ const captureLambdaHandler = ( } }; - const captureLambdaHandlerAfter = async ( - request: MiddyLikeRequest - ): Promise => { + const after = (request: MiddyLikeRequest) => { if (target.isTracingEnabled()) { if (options?.captureResponse ?? true) { target.addResponseAsMetadata(request.response, process.env._HANDLER); @@ -105,9 +100,7 @@ const captureLambdaHandler = ( } }; - const captureLambdaHandlerError = async ( - request: MiddyLikeRequest - ): Promise => { + const onError = (request: MiddyLikeRequest) => { if (target.isTracingEnabled()) { target.addErrorAsMetadata(request.error as Error); close(); @@ -115,9 +108,9 @@ const captureLambdaHandler = ( }; return { - before: captureLambdaHandlerBefore, - after: captureLambdaHandlerAfter, - onError: captureLambdaHandlerError, + before, + after, + onError, }; }; diff --git a/packages/tracer/src/provider/ProviderService.ts b/packages/tracer/src/provider/ProviderService.ts index a17331e3f1..44a1488af5 100644 --- a/packages/tracer/src/provider/ProviderService.ts +++ b/packages/tracer/src/provider/ProviderService.ts @@ -27,8 +27,8 @@ import { subscribe } from 'node:diagnostics_channel'; import http from 'node:http'; import https from 'node:https'; import { addUserAgentMiddleware } from '@aws-lambda-powertools/commons'; -import type { DiagnosticsChannel } from 'undici-types'; import { getXRayTraceIdFromEnv } from '@aws-lambda-powertools/commons/utils/env'; +import type { DiagnosticsChannel } from 'undici-types'; import { findHeaderAndDecode, getRequestURL, @@ -172,7 +172,7 @@ class ProviderService implements ProviderServiceInterface { response: { status, ...(contentLenght && { - content_length: Number.parseInt(contentLenght), + content_length: Number.parseInt(contentLenght, 10), }), }, }; diff --git a/packages/tracer/src/types/Tracer.ts b/packages/tracer/src/types/Tracer.ts index 8978e0bd6a..3767f7b10c 100644 --- a/packages/tracer/src/types/Tracer.ts +++ b/packages/tracer/src/types/Tracer.ts @@ -32,10 +32,8 @@ type TracerOptions = { /** * Options for handler decorators and middleware. * - * Options supported: - * * `captureResponse` - (_optional_) - Disable response serialization as subsegment metadata + * **Middleware usage** * - * Middleware usage: * @example * ```typescript * import middy from '@middy/core'; @@ -48,7 +46,8 @@ type TracerOptions = { * .use(captureLambdaHandler(tracer, { captureResponse: false })); * ``` * - * Decorator usage: + * **Decorator usage** + * * @example * ```typescript * const tracer = new Tracer(); @@ -61,6 +60,8 @@ type TracerOptions = { * const handlerClass = new Lambda(); * export const handler = handlerClass.handler.bind(handlerClass); * ``` + * + * @property captureResponse - Whether to capture the Lambda handler response as subsegment metadata (default: true) */ type CaptureLambdaHandlerOptions = { captureResponse?: boolean; @@ -69,22 +70,18 @@ type CaptureLambdaHandlerOptions = { /** * Options for method decorators. * - * Options supported: - * * `subSegmentName` - (_optional_) - Set a custom name for the subsegment - * * `captureResponse` - (_optional_) - Disable response serialization as subsegment metadata - * * Usage: * @example * ```typescript * const tracer = new Tracer(); * * class Lambda implements LambdaInterface { - * @tracer.captureMethod({ subSegmentName: 'gettingChargeId', captureResponse: false }) + * ⁣@tracer.captureMethod({ subSegmentName: 'gettingChargeId', captureResponse: false }) * private getChargeId(): string { * return 'foo bar'; * } * - * @tracer.captureLambdaHandler({ captureResponse: false }) + * ⁣@tracer.captureLambdaHandler({ captureResponse: false }) * public async handler(_event: any, _context: any): Promise { * this.getChargeId(); * } @@ -93,6 +90,9 @@ type CaptureLambdaHandlerOptions = { * const handlerClass = new Lambda(); * export const handler = handlerClass.handler.bind(handlerClass); * ``` + * + * @property subSegmentName - (_optional_) - Set a custom name for the subsegment + * @property captureResponse - (_optional_) - Disable response serialization as subsegment metadata (default: true) */ type CaptureMethodOptions = { subSegmentName?: string; diff --git a/packages/tracer/tests/e2e/decorator.test.ts b/packages/tracer/tests/e2e/decorator.test.ts index 2c5b14a6af..64ee1cbf5c 100644 --- a/packages/tracer/tests/e2e/decorator.test.ts +++ b/packages/tracer/tests/e2e/decorator.test.ts @@ -88,7 +88,7 @@ describe('Tracer E2E tests, decorator instrumentation', () => { } }); - it('should generate all trace data correctly', async () => { + it('should generate all trace data correctly', () => { // Assess const mainSubsegment = traceData[0]; const { subsegments, annotations, metadata } = mainSubsegment; diff --git a/packages/tracer/tests/e2e/manual.test.ts b/packages/tracer/tests/e2e/manual.test.ts index c553a7e181..c2fdf8b12f 100644 --- a/packages/tracer/tests/e2e/manual.test.ts +++ b/packages/tracer/tests/e2e/manual.test.ts @@ -85,7 +85,7 @@ describe('Tracer E2E tests, manual instantiation', () => { } }); - it('should generate all trace data correctly', async () => { + it('should generate all trace data correctly', () => { // Assess const mainSubsegment = traceData[0]; const { subsegments, annotations, metadata } = mainSubsegment; diff --git a/packages/tracer/tests/helpers/mockRequests.ts b/packages/tracer/tests/helpers/mockRequests.ts index 4385d06be4..3568646f00 100644 --- a/packages/tracer/tests/helpers/mockRequests.ts +++ b/packages/tracer/tests/helpers/mockRequests.ts @@ -49,7 +49,7 @@ const mockFetch = ({ }); if (throwError) { - const error = new AggregateError('Mock fetch error'); + const error = new AggregateError([], 'Mock fetch error'); errorChannel.publish({ request, @@ -62,8 +62,7 @@ const mockFetch = ({ const encoder = new TextEncoder(); const encodedHeaders = []; for (const [key, value] of Object.entries(headers ?? {})) { - encodedHeaders.push(encoder.encode(key)); - encodedHeaders.push(encoder.encode(value)); + encodedHeaders.push(encoder.encode(key), encoder.encode(value)); } responseHeadersChannel.publish({ request, diff --git a/packages/tracer/tests/unit/ProviderService.test.ts b/packages/tracer/tests/unit/ProviderService.test.ts index d10ddd4eb1..9cea095984 100644 --- a/packages/tracer/tests/unit/ProviderService.test.ts +++ b/packages/tracer/tests/unit/ProviderService.test.ts @@ -306,7 +306,7 @@ describe('Class: ProviderService', () => { }); describe('Method: instrumentFetch', () => { - it('subscribes to the diagnostics channel', async () => { + it('subscribes to the diagnostics channel', () => { // Prepare const provider: ProviderService = new ProviderService(); @@ -319,7 +319,7 @@ describe('Class: ProviderService', () => { expect(channel('undici:request:error').hasSubscribers).toBe(true); }); - it('traces a successful request', async () => { + it('traces a successful request', () => { // Prepare const provider: ProviderService = new ProviderService(); const segment = new Subsegment('## dummySegment'); @@ -367,7 +367,7 @@ describe('Class: ProviderService', () => { ); }); - it('excludes the content_length header when invalid or not found', async () => { + it('excludes the content_length header when invalid or not found', () => { // Prepare const provider: ProviderService = new ProviderService(); const segment = new Subsegment('## dummySegment'); @@ -406,7 +406,7 @@ describe('Class: ProviderService', () => { expect(provider.setSegment).toHaveBeenLastCalledWith(segment); }); - it('adds a throttle flag to the segment when the status code is 429', async () => { + it('adds a throttle flag to the segment when the status code is 429', () => { // Prepare const provider: ProviderService = new ProviderService(); const segment = new Subsegment('## dummySegment'); @@ -442,7 +442,7 @@ describe('Class: ProviderService', () => { expect(provider.setSegment).toHaveBeenLastCalledWith(segment); }); - it('adds an error flag to the segment when the status code is 4xx', async () => { + it('adds an error flag to the segment when the status code is 4xx', () => { // Prepare const provider: ProviderService = new ProviderService(); const segment = new Subsegment('## dummySegment'); @@ -478,7 +478,7 @@ describe('Class: ProviderService', () => { expect(provider.setSegment).toHaveBeenLastCalledWith(segment); }); - it('adds a fault flag to the segment when the status code is 5xx', async () => { + it('adds a fault flag to the segment when the status code is 5xx', () => { // Prepare const provider: ProviderService = new ProviderService(); const segment = new Subsegment('## dummySegment'); @@ -514,7 +514,7 @@ describe('Class: ProviderService', () => { expect(provider.setSegment).toHaveBeenLastCalledWith(segment); }); - it('skips the segment creation when the request has no origin', async () => { + it('skips the segment creation when the request has no origin', () => { // Prepare const provider: ProviderService = new ProviderService(); const segment = new Subsegment('## dummySegment'); @@ -531,7 +531,7 @@ describe('Class: ProviderService', () => { expect(provider.setSegment).toHaveBeenCalledTimes(0); }); - it('does not add any path to the segment when the request has no path', async () => { + it('does not add any path to the segment when the request has no path', () => { // Prepare const provider: ProviderService = new ProviderService(); const segment = new Subsegment('## dummySegment'); @@ -564,7 +564,7 @@ describe('Class: ProviderService', () => { }); }); - it('closes the segment and adds a fault flag when the connection fails', async () => { + it('closes the segment and adds a fault flag when the connection fails', () => { // Prepare const provider: ProviderService = new ProviderService(); const segment = new Subsegment('## dummySegment'); @@ -595,7 +595,7 @@ describe('Class: ProviderService', () => { expect(provider.setSegment).toHaveBeenLastCalledWith(segment); }); - it('forwards the correct sampling decision in the request header', async () => { + it('forwards the correct sampling decision in the request header', () => { // Prepare const provider: ProviderService = new ProviderService(); const segment = new Subsegment('## dummySegment'); diff --git a/packages/tracer/tests/unit/Tracer.test.ts b/packages/tracer/tests/unit/Tracer.test.ts index a59a125a9c..8f9046a171 100644 --- a/packages/tracer/tests/unit/Tracer.test.ts +++ b/packages/tracer/tests/unit/Tracer.test.ts @@ -1,3 +1,4 @@ +import { setTimeout } from 'node:timers/promises'; import type { LambdaInterface } from '@aws-lambda-powertools/commons/types'; import context from '@aws-lambda-powertools/testing-utils/context'; import type { Context } from 'aws-lambda'; @@ -884,7 +885,7 @@ describe('Class: Tracer', () => { const lambda = getLambdaClass(tracer, { shouldThrow: true }); // Act & Assess - expect(lambda.handler({}, context)).rejects.toThrow(Error); + await expect(lambda.handler({}, context)).rejects.toThrow(Error); expect(captureAsyncFuncSpy).toHaveBeenCalledTimes(1); expect(addErrorFlagSpy).toHaveBeenCalledTimes(1); expect(addErrorSpy).toHaveBeenCalledTimes(0); @@ -905,7 +906,7 @@ describe('Class: Tracer', () => { const lambda = getLambdaClass(tracer, { shouldThrow: true }); // Act & Assess - expect(lambda.handler({}, context)).rejects.toThrow(Error); + await expect(lambda.handler({}, context)).rejects.toThrow(Error); expect(captureAsyncFuncSpy).toHaveBeenCalledTimes(1); expect(addErrorAsMetadataSpy).toHaveBeenCalledTimes(1); expect(addErrorAsMetadataSpy).toHaveBeenCalledWith(expect.any(Error)); @@ -922,7 +923,7 @@ describe('Class: Tracer', () => { const lambda = getLambdaClass(tracer); // Act - lambda.handler(event, context); + await lambda.handler(event, context); // Assess expect(captureAsyncFuncSpy).toHaveBeenCalledTimes(1); @@ -978,6 +979,7 @@ describe('Class: Tracer', () => { } public async dummyMethod(): Promise { + await setTimeout(0); // Simulate some async operation return this.memberVariable; } @@ -1057,6 +1059,7 @@ describe('Class: Tracer', () => { class Lambda implements LambdaInterface { @tracer.captureMethod() public async dummyMethod(some: string): Promise { + await setTimeout(0); // Simulate some async operation return some; } @@ -1087,6 +1090,7 @@ describe('Class: Tracer', () => { class Lambda implements LambdaInterface { @tracer.captureMethod() public async dummyMethod(some: string): Promise { + await setTimeout(0); // Simulate some async operation return some; } @@ -1126,6 +1130,7 @@ describe('Class: Tracer', () => { class Lambda implements LambdaInterface { @tracer.captureMethod({ captureResponse: false }) public async dummyMethod(some: string): Promise { + await setTimeout(0); // Simulate some async operation return some; } @@ -1161,6 +1166,7 @@ describe('Class: Tracer', () => { class Lambda implements LambdaInterface { @tracer.captureMethod() public async dummyMethod(some: string): Promise { + await setTimeout(0); // Simulate some async operation return some; } @@ -1197,6 +1203,7 @@ describe('Class: Tracer', () => { class Lambda implements LambdaInterface { @tracer.captureMethod() public async dummyMethod(_some: string): Promise { + await setTimeout(0); // Simulate some async operation throw new Error('Exception thrown!'); } @@ -1245,6 +1252,7 @@ describe('Class: Tracer', () => { @tracer.captureMethod() public async dummyMethod(): Promise { + await setTimeout(0); // Simulate some async operation return `memberVariable:${this.memberVariable}`; } @@ -1279,7 +1287,7 @@ describe('Class: Tracer', () => { class Lambda implements LambdaInterface { @tracer.captureMethod() public async dummyMethod(): Promise { - return; + await setTimeout(0); // Simulate some async operation } public async handler( @@ -1288,12 +1296,10 @@ describe('Class: Tracer', () => { ): Promise { await this.dummyMethod(); this.otherDummyMethod(); - - return; } - public otherDummyMethod(): void { - return; + public otherDummyMethod(): boolean { + return false; } } @@ -1336,6 +1342,7 @@ describe('Class: Tracer', () => { @tracer.captureMethod() @passThrough() public async dummyMethod(): Promise { + await setTimeout(0); // Simulate some async operation return 'foo'; } @@ -1374,6 +1381,7 @@ describe('Class: Tracer', () => { class Lambda implements LambdaInterface { @tracer.captureMethod({ subSegmentName: '#### myCustomMethod' }) public async dummyMethod(some: string): Promise { + await setTimeout(0); // Simulate some async operation return some; } @@ -1419,6 +1427,7 @@ describe('Class: Tracer', () => { class Lambda implements LambdaInterface { @tracer.captureMethod() public async dummyMethod(some: string): Promise { + await setTimeout(0); // Simulate some async operation return some; } diff --git a/packages/tracer/tests/unit/middy.test.ts b/packages/tracer/tests/unit/middy.test.ts index bb529a3af7..93e37b6309 100644 --- a/packages/tracer/tests/unit/middy.test.ts +++ b/packages/tracer/tests/unit/middy.test.ts @@ -1,3 +1,4 @@ +import { setTimeout } from 'node:timers/promises'; import { cleanupMiddlewares } from '@aws-lambda-powertools/commons'; import context from '@aws-lambda-powertools/testing-utils/context'; import middy from '@middy/core'; @@ -13,6 +14,10 @@ import { captureLambdaHandler } from '../../src/middleware/middy.js'; describe('Middy middleware', () => { const ENVIRONMENT_VARIABLES = process.env; + const lambdaHandler: Handler = async (_event: unknown, _context: Context) => { + await setTimeout(0); // Simulate some async operation + throw new Error('Exception thrown!'); + }; beforeEach(() => { vi.clearAllMocks(); @@ -64,12 +69,6 @@ describe('Middy middleware', () => { () => new Segment('facade', process.env._X_AMZN_TRACE_ID || null) ) .mockImplementationOnce(() => new Subsegment('## index.handler')); - const lambdaHandler: Handler = async ( - _event: unknown, - _context: Context - ) => { - throw new Error('Exception thrown!'); - }; const handler = middy(lambdaHandler).use(captureLambdaHandler(tracer)); // Act & Assess @@ -173,12 +172,6 @@ describe('Middy middleware', () => { setContextMissingStrategy(() => null); const addErrorSpy = vi.spyOn(newSubsegment, 'addError'); const addErrorFlagSpy = vi.spyOn(newSubsegment, 'addErrorFlag'); - const lambdaHandler: Handler = async ( - _event: unknown, - _context: Context - ) => { - throw new Error('Exception thrown!'); - }; const handler = middy(lambdaHandler).use(captureLambdaHandler(tracer)); // Act & Assess @@ -208,12 +201,6 @@ describe('Middy middleware', () => { ); setContextMissingStrategy(() => null); const addErrorSpy = vi.spyOn(newSubsegment, 'addError'); - const lambdaHandler: Handler = async ( - _event: unknown, - _context: Context - ) => { - throw new Error('Exception thrown!'); - }; const handler = middy(lambdaHandler).use(captureLambdaHandler(tracer)); // Act & Assess diff --git a/packages/tracer/vitest.config.ts b/packages/tracer/vitest.config.ts index baa5cf7463..e962bb6d1c 100644 --- a/packages/tracer/vitest.config.ts +++ b/packages/tracer/vitest.config.ts @@ -4,7 +4,7 @@ export default defineProject({ test: { environment: 'node', setupFiles: ['../testing/src/setupEnv.ts'], - hookTimeout: 1_000 * 60 * 10, // 10 minutes - testTimeout: 1_000 * 60 * 3, // 3 minutes + hookTimeout: 1000 * 60 * 10, // 10 minutes + testTimeout: 1000 * 60 * 3, // 3 minutes }, }); diff --git a/packages/validation/package.json b/packages/validation/package.json index 0aa16cd4b2..f254e48dc8 100644 --- a/packages/validation/package.json +++ b/packages/validation/package.json @@ -19,6 +19,7 @@ "build": "npm run build:esm & npm run build:cjs", "lint": "biome lint .", "lint:fix": "biome check --write .", + "lint:ci": "biome ci .", "prepack": "node ../../.github/scripts/release_patch_package_json.js ." }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript#readme", diff --git a/packages/validation/src/middleware.ts b/packages/validation/src/middleware.ts index af6d953033..59a5093c62 100644 --- a/packages/validation/src/middleware.ts +++ b/packages/validation/src/middleware.ts @@ -105,7 +105,7 @@ import { validate } from './validate.js'; * @param options.ajv - Optional Ajv instance to use for validation, if not provided a new instance will be created. */ const validator = (options: ValidatorOptions) => { - const before: MiddlewareFn = async (request) => { + const before: MiddlewareFn = (request) => { if (options.inboundSchema) { const originalEvent = structuredClone(request.event); try { @@ -125,7 +125,7 @@ const validator = (options: ValidatorOptions) => { } }; - const after = async (handler: MiddyLikeRequest) => { + const after = (handler: MiddyLikeRequest) => { if (options.outboundSchema) { try { handler.response = validate({ diff --git a/packages/validation/tests/unit/decorator.test.ts b/packages/validation/tests/unit/decorator.test.ts index 28e6cd27fd..423ab34cc6 100644 --- a/packages/validation/tests/unit/decorator.test.ts +++ b/packages/validation/tests/unit/decorator.test.ts @@ -1,3 +1,4 @@ +import { setTimeout } from 'node:timers/promises'; import { describe, expect, it } from 'vitest'; import { validator } from '../../src/decorator.js'; import { SchemaValidationError } from '../../src/errors.js'; @@ -21,11 +22,12 @@ const outboundSchema = { }; describe('Decorator: validator', () => { - it('should validate inbound and outbound successfully', async () => { + it('validates both inbound and outbound successfully', async () => { // Prepare class TestClass { @validator({ inboundSchema, outboundSchema }) async multiply(input: { value: number }): Promise<{ result: number }> { + await setTimeout(1); // simulate some processing time return { result: input.value * 2 }; } } @@ -39,11 +41,12 @@ describe('Decorator: validator', () => { expect(output).toEqual({ result: 10 }); }); - it('should throw error on inbound validation failure', async () => { + it('throws an error on inbound validation failure', async () => { // Prepare class TestClass { @validator({ inboundSchema, outboundSchema }) async multiply(input: { value: number }): Promise<{ result: number }> { + await setTimeout(1); // simulate some processing time return { result: input.value * 2 }; } } @@ -58,11 +61,12 @@ describe('Decorator: validator', () => { ); }); - it('should throw error on outbound validation failure', async () => { + it('throws an error on outbound validation failure', async () => { // Prepare class TestClassInvalid { @validator({ inboundSchema, outboundSchema }) async multiply(_input: { value: number }) { + await setTimeout(1); // simulate some processing time return { result: 'invalid' }; } } @@ -74,11 +78,12 @@ describe('Decorator: validator', () => { ); }); - it('should no-op when no schemas are provided', async () => { + it('results in a no-op when no schemas are provided', async () => { // Prepare class TestClassNoOp { @validator({}) async echo(input: unknown): Promise { + await setTimeout(1); // simulate some processing time return input; } } @@ -92,11 +97,12 @@ describe('Decorator: validator', () => { expect(result).toEqual(data); }); - it('should validate inbound only', async () => { + it('validates the inbound schema only', async () => { // Prepare class TestClassInbound { @validator({ inboundSchema }) async process(input: { value: number }): Promise<{ data: string }> { + await setTimeout(1); // simulate some processing time return { data: JSON.stringify(input) }; } } @@ -110,11 +116,12 @@ describe('Decorator: validator', () => { expect(output).toEqual({ data: JSON.stringify(input) }); }); - it('should validate outbound only', async () => { + it('validates the outbound schema only', async () => { // Prepare class TestClassOutbound { @validator({ outboundSchema }) async process(_input: { text: string }): Promise<{ result: number }> { + await setTimeout(1); // simulate some processing time return { result: 42 }; } } diff --git a/packages/validation/tests/unit/middleware.test.ts b/packages/validation/tests/unit/middleware.test.ts index 1d2796638a..6b76d66d65 100644 --- a/packages/validation/tests/unit/middleware.test.ts +++ b/packages/validation/tests/unit/middleware.test.ts @@ -22,7 +22,7 @@ const outboundSchema = { additionalProperties: false, }; -const baseHandler = async (event: { inputValue: unknown }) => { +const baseHandler = (event: { inputValue: unknown }) => { return { outputValue: event.inputValue, }; From 8cc55cca1aff18a3374b74486aca94446abdeff5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Sep 2025 17:36:09 +0200 Subject: [PATCH 190/255] chore(deps): bump tsx from 4.20.5 to 4.20.6 (#4580) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/app/package.json | 2 +- layers/package.json | 2 +- package-lock.json | 72 +++++++++++++++++++-------------------- 3 files changed, 38 insertions(+), 38 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 338dbebd36..6040d1c610 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -34,7 +34,7 @@ "aws-cdk-lib": "^2.216.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", - "tsx": "^4.20.5", + "tsx": "^4.20.6", "typescript": "^5.9.2", "vitest": "^3.0.5" }, diff --git a/layers/package.json b/layers/package.json index d8bdebfae9..330a86c90f 100644 --- a/layers/package.json +++ b/layers/package.json @@ -44,6 +44,6 @@ "aws-cdk": "^2.1029.2", "aws-cdk-lib": "^2.216.0", "esbuild": "^0.25.10", - "tsx": "^4.20.5" + "tsx": "^4.20.6" } } diff --git a/package-lock.json b/package-lock.json index 06f45c00dd..d713d3135b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,12 +50,12 @@ "version": "2.27.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/batch": "^2.26.1", - "@aws-lambda-powertools/idempotency": "^2.26.1", - "@aws-lambda-powertools/logger": "^2.26.1", - "@aws-lambda-powertools/metrics": "^2.26.1", - "@aws-lambda-powertools/parameters": "^2.26.1", - "@aws-lambda-powertools/tracer": "^2.26.1", + "@aws-lambda-powertools/batch": "^2.27.0", + "@aws-lambda-powertools/idempotency": "^2.27.0", + "@aws-lambda-powertools/logger": "^2.27.0", + "@aws-lambda-powertools/metrics": "^2.27.0", + "@aws-lambda-powertools/parameters": "^2.27.0", + "@aws-lambda-powertools/tracer": "^2.27.0", "@aws-sdk/client-ssm": "^3.893.0", "@aws-sdk/lib-dynamodb": "^3.893.0", "@middy/core": "^4.7.0", @@ -72,7 +72,7 @@ "aws-cdk-lib": "^2.216.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", - "tsx": "^4.20.5", + "tsx": "^4.20.6", "typescript": "^5.9.2", "vitest": "^3.0.5" } @@ -86,15 +86,15 @@ "valibot": "^1.1.0" }, "devDependencies": { - "@aws-lambda-powertools/batch": "^2.26.1", - "@aws-lambda-powertools/event-handler": "^2.26.1", - "@aws-lambda-powertools/idempotency": "^2.26.1", - "@aws-lambda-powertools/jmespath": "^2.26.1", - "@aws-lambda-powertools/logger": "^2.26.1", - "@aws-lambda-powertools/metrics": "^2.26.1", - "@aws-lambda-powertools/parameters": "^2.26.1", - "@aws-lambda-powertools/parser": "^2.26.1", - "@aws-lambda-powertools/tracer": "^2.26.1", + "@aws-lambda-powertools/batch": "^2.27.0", + "@aws-lambda-powertools/event-handler": "^2.27.0", + "@aws-lambda-powertools/idempotency": "^2.27.0", + "@aws-lambda-powertools/jmespath": "^2.27.0", + "@aws-lambda-powertools/logger": "^2.27.0", + "@aws-lambda-powertools/metrics": "^2.27.0", + "@aws-lambda-powertools/parameters": "^2.27.0", + "@aws-lambda-powertools/parser": "^2.27.0", + "@aws-lambda-powertools/tracer": "^2.27.0", "@aws-sdk/client-appconfigdata": "^3.893.0", "@aws-sdk/client-dynamodb": "^3.893.0", "@aws-sdk/client-secrets-manager": "^3.893.0", @@ -131,13 +131,13 @@ } }, "layers": { - "version": "2.26.1", + "version": "2.27.0", "license": "MIT-0", "dependencies": { "aws-cdk": "^2.1029.2", "aws-cdk-lib": "^2.216.0", "esbuild": "^0.25.10", - "tsx": "^4.20.5" + "tsx": "^4.20.6" }, "bin": { "layer": "bin/layers.js" @@ -9983,9 +9983,9 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/tsx": { - "version": "4.20.5", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", - "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", + "version": "4.20.6", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.6.tgz", + "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", "license": "MIT", "dependencies": { "esbuild": "~0.25.0", @@ -10682,11 +10682,11 @@ "version": "2.27.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1", + "@aws-lambda-powertools/commons": "2.27.0", "@standard-schema/spec": "^1.0.0" }, "devDependencies": { - "@aws-lambda-powertools/parser": "2.26.1", + "@aws-lambda-powertools/parser": "2.27.0", "@aws-lambda-powertools/testing-utils": "file:../testing", "zod": "^4.1.11" } @@ -10704,7 +10704,7 @@ "version": "2.27.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1" + "@aws-lambda-powertools/commons": "2.27.0" } }, "packages/idempotency": { @@ -10712,8 +10712,8 @@ "version": "2.27.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1", - "@aws-lambda-powertools/jmespath": "2.26.1" + "@aws-lambda-powertools/commons": "2.27.0", + "@aws-lambda-powertools/jmespath": "2.27.0" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", @@ -10751,7 +10751,7 @@ "version": "2.27.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1" + "@aws-lambda-powertools/commons": "2.27.0" } }, "packages/kafka": { @@ -10759,7 +10759,7 @@ "version": "2.27.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1", + "@aws-lambda-powertools/commons": "2.27.0", "@standard-schema/spec": "^1.0.0" }, "devDependencies": { @@ -10789,7 +10789,7 @@ "version": "2.27.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1", + "@aws-lambda-powertools/commons": "2.27.0", "lodash.merge": "^4.6.2" }, "devDependencies": { @@ -10797,7 +10797,7 @@ "@types/lodash.merge": "^4.6.9" }, "peerDependencies": { - "@aws-lambda-powertools/jmespath": "2.26.1", + "@aws-lambda-powertools/jmespath": "2.27.0", "@middy/core": "4.x || 5.x || 6.x" }, "peerDependenciesMeta": { @@ -10814,7 +10814,7 @@ "version": "2.27.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1" + "@aws-lambda-powertools/commons": "2.27.0" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", @@ -10836,7 +10836,7 @@ "version": "2.27.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1" + "@aws-lambda-powertools/commons": "2.27.0" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", @@ -10882,7 +10882,7 @@ "version": "2.27.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1", + "@aws-lambda-powertools/commons": "2.27.0", "@standard-schema/spec": "^1.0.0" }, "devDependencies": { @@ -10923,7 +10923,7 @@ "version": "2.27.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1", + "@aws-lambda-powertools/commons": "2.27.0", "aws-xray-sdk-core": "^3.10.3" }, "devDependencies": { @@ -10945,8 +10945,8 @@ "version": "2.27.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.26.1", - "@aws-lambda-powertools/jmespath": "2.26.1", + "@aws-lambda-powertools/commons": "2.27.0", + "@aws-lambda-powertools/jmespath": "2.27.0", "ajv": "^8.17.1" } } From de62353852274e56f02ffaf5d1357be6cf516fb7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Sep 2025 18:32:07 +0200 Subject: [PATCH 191/255] chore(deps-dev): bump lint-staged from 16.2.0 to 16.2.1 (#4581) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi --- package-lock.json | 22 +++++++++++----------- package.json | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index d713d3135b..8b369d2d4b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "@types/node": "^24.5.2", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", - "lint-staged": "^16.2.0", + "lint-staged": "^16.2.1", "markdownlint-cli2": "^0.18.1", "middy5": "npm:@middy/core@^5.4.3", "middy6": "npm:@middy/core@^6.0.0", @@ -8044,19 +8044,19 @@ } }, "node_modules/lint-staged": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.0.tgz", - "integrity": "sha512-spdYSOCQ2MdZ9CM1/bu/kDmaYGsrpNOeu1InFFV8uhv14x6YIubGxbCpSmGILFoxkiheNQPDXSg5Sbb5ZuVnug==", + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.1.tgz", + "integrity": "sha512-KMeYmH9wKvHsXdUp+z6w7HN3fHKHXwT1pSTQTYxB9kI6ekK1rlL3kLZEoXZCppRPXFK9PFW/wfQctV7XUqMrPQ==", "dev": true, "license": "MIT", "dependencies": { - "commander": "14.0.1", - "listr2": "9.0.4", - "micromatch": "4.0.8", - "nano-spawn": "1.0.3", - "pidtree": "0.6.0", - "string-argv": "0.3.2", - "yaml": "2.8.1" + "commander": "^14.0.1", + "listr2": "^9.0.4", + "micromatch": "^4.0.8", + "nano-spawn": "^1.0.3", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.8.1" }, "bin": { "lint-staged": "bin/lint-staged.js" diff --git a/package.json b/package.json index 788d8d8c03..fb837b78f1 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "@types/node": "^24.5.2", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", - "lint-staged": "^16.2.0", + "lint-staged": "^16.2.1", "markdownlint-cli2": "^0.18.1", "middy5": "npm:@middy/core@^5.4.3", "middy6": "npm:@middy/core@^6.0.0", From 222be51b5684332705907e8ebad6cf8e55be5396 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Mon, 29 Sep 2025 14:32:12 +0200 Subject: [PATCH 192/255] ci: add `--delete` flag to docs publish command (#4584) --- .github/workflows/reusable_publish_docs.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/reusable_publish_docs.yml b/.github/workflows/reusable_publish_docs.yml index b2f67a70bd..79943e3ba2 100644 --- a/.github/workflows/reusable_publish_docs.yml +++ b/.github/workflows/reusable_publish_docs.yml @@ -109,7 +109,8 @@ jobs: set -euo pipefail aws s3 sync \ site/ \ - "s3://$AWS_DOCS_BUCKET/lambda-typescript/$VERSION/" + "s3://$AWS_DOCS_BUCKET/lambda-typescript/$VERSION/" \ + --delete - name: Deploy Docs (Alias) env: VERSION: ${{ inputs.version }} @@ -119,7 +120,8 @@ jobs: set -euo pipefail aws s3 sync \ site/ \ - "s3://$AWS_DOCS_BUCKET/lambda-typescript/$ALIAS/" + "s3://$AWS_DOCS_BUCKET/lambda-typescript/$ALIAS/" \ + --delete - name: Deploy Docs (Version JSON) env: VERSION: ${{ inputs.version }} From abd7b8b0634b5d981e5a9f694b76151f33a0c950 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Mon, 29 Sep 2025 15:50:40 +0200 Subject: [PATCH 193/255] docs: update install command for parser (#4585) Co-authored-by: Swopnil Dangol --- docs/getting-started/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md index ed453b72f4..d4c6ac822e 100644 --- a/docs/getting-started/installation.md +++ b/docs/getting-started/installation.md @@ -29,7 +29,7 @@ Some features use additional dependencies like the AWS SDK for JavaScript v3, wh | **[Parameters (SSM)](../features/parameters.md)** | **`npm i @aws-lambda-powertools/parameters @aws-sdk/client-ssm`**{.copyMe} | | | **[Parameters (Secrets Manager)](../features/parameters.md)** | **`npm i @aws-lambda-powertools/parameters @aws-sdk/client-secrets-manager`**{.copyMe} | | | **[Parameters (AppConfig)](../features/parameters.md)** | **`npm i @aws-lambda-powertools/parameters @aws-sdk/client-appconfigdata`**{.copyMe} | | -| **[Parser](../features/parser.md)** | **`npm i @aws-lambda-powertools/parser zod@~3`**{.copyMe} | | +| **[Parser](../features/parser.md)** | **`npm i @aws-lambda-powertools/parser zod`**{.copyMe} | | | **[Validation](../features/validation.md)** | **`npm i @aws-lambda-powertools/validation`**{.copyMe} | `ajv` | | **[Kafka (Protocol Buffers)](../features/kafka.md)** | **`npm i @aws-lambda-powertools/kafka protobufjs`**{.copyMe} | | | **[Kafka (Avro)](../features/kafka.md)** | **`npm i @aws-lambda-powertools/kafka avro-js`**{.copyMe} | | From f466638a6a3d4ffb3807810f81053277101d9eee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Sep 2025 10:03:28 +0200 Subject: [PATCH 194/255] chore(deps): bump the aws-sdk-v3 group across 1 directory with 45 updates (#4592) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/app/package.json | 4 +- examples/snippets/package.json | 10 +- package-lock.json | 1168 ++++++++++++++--------------- packages/idempotency/package.json | 4 +- packages/metrics/package.json | 2 +- packages/parameters/package.json | 10 +- packages/testing/package.json | 2 +- packages/tracer/package.json | 4 +- 8 files changed, 593 insertions(+), 611 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 6040d1c610..545eedb415 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -45,8 +45,8 @@ "@aws-lambda-powertools/metrics": "^2.27.0", "@aws-lambda-powertools/parameters": "^2.27.0", "@aws-lambda-powertools/tracer": "^2.27.0", - "@aws-sdk/client-ssm": "^3.893.0", - "@aws-sdk/lib-dynamodb": "^3.893.0", + "@aws-sdk/client-ssm": "^3.896.0", + "@aws-sdk/lib-dynamodb": "^3.896.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", "@types/node": "24.5.2", diff --git a/examples/snippets/package.json b/examples/snippets/package.json index 0af61ca5b1..4d781c60c7 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -34,11 +34,11 @@ "@aws-lambda-powertools/parameters": "^2.27.0", "@aws-lambda-powertools/parser": "^2.27.0", "@aws-lambda-powertools/tracer": "^2.27.0", - "@aws-sdk/client-appconfigdata": "^3.893.0", - "@aws-sdk/client-dynamodb": "^3.893.0", - "@aws-sdk/client-secrets-manager": "^3.893.0", - "@aws-sdk/client-ssm": "^3.893.0", - "@aws-sdk/util-dynamodb": "^3.893.0", + "@aws-sdk/client-appconfigdata": "^3.896.0", + "@aws-sdk/client-dynamodb": "^3.896.0", + "@aws-sdk/client-secrets-manager": "^3.896.0", + "@aws-sdk/client-ssm": "^3.896.0", + "@aws-sdk/util-dynamodb": "^3.896.0", "@middy/core": "^4.7.0", "@redis/client": "^5.8.2", "@valkey/valkey-glide": "^2.1.0", diff --git a/package-lock.json b/package-lock.json index 8b369d2d4b..42cc3ed10a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,8 +56,8 @@ "@aws-lambda-powertools/metrics": "^2.27.0", "@aws-lambda-powertools/parameters": "^2.27.0", "@aws-lambda-powertools/tracer": "^2.27.0", - "@aws-sdk/client-ssm": "^3.893.0", - "@aws-sdk/lib-dynamodb": "^3.893.0", + "@aws-sdk/client-ssm": "^3.896.0", + "@aws-sdk/lib-dynamodb": "^3.896.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", "@types/node": "24.5.2", @@ -95,11 +95,11 @@ "@aws-lambda-powertools/parameters": "^2.27.0", "@aws-lambda-powertools/parser": "^2.27.0", "@aws-lambda-powertools/tracer": "^2.27.0", - "@aws-sdk/client-appconfigdata": "^3.893.0", - "@aws-sdk/client-dynamodb": "^3.893.0", - "@aws-sdk/client-secrets-manager": "^3.893.0", - "@aws-sdk/client-ssm": "^3.893.0", - "@aws-sdk/util-dynamodb": "^3.893.0", + "@aws-sdk/client-appconfigdata": "^3.896.0", + "@aws-sdk/client-dynamodb": "^3.896.0", + "@aws-sdk/client-secrets-manager": "^3.896.0", + "@aws-sdk/client-ssm": "^3.896.0", + "@aws-sdk/util-dynamodb": "^3.896.0", "@middy/core": "^4.7.0", "@redis/client": "^5.8.2", "@valkey/valkey-glide": "^2.1.0", @@ -874,46 +874,46 @@ "link": true }, "node_modules/@aws-sdk/client-appconfigdata": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.893.0.tgz", - "integrity": "sha512-u2+rbcmDAooQp8gzMlJIAvFE5Ea2ZVBzj7SZJzJJ4bWmCushAm/tN5EyI5COYKxnfEZcSqBaQLKzwNS/0NDXkw==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.896.0.tgz", + "integrity": "sha512-C0ns/l6STvDei0Y8CTLwSbz0QmtSZxJJyHGCNE4vDXc57eTGjDy/y8YOCpDCknqzfTTYdAfm6TllOsXj1uaJ9Q==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.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.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", @@ -926,45 +926,45 @@ } }, "node_modules/@aws-sdk/client-appsync": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-appsync/-/client-appsync-3.893.0.tgz", - "integrity": "sha512-/5RLLWv1TDJFcyzAPznfOARVhQLvA7gJ6oEa9l+7RdmPQ37gTdsT/XmvE3atOaA0J16Z87a+HqOjeWK4vh1KyA==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appsync/-/client-appsync-3.896.0.tgz", + "integrity": "sha512-QT4PcrOZu00HshRAlkQSc7nHiQ6X8a52AFdYx6bk3/vI4dUgpuSawqeKgitx5axPmMQGudsGgF7mAKME9xBz0Q==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.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.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", @@ -977,153 +977,151 @@ } }, "node_modules/@aws-sdk/client-cloudcontrol": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudcontrol/-/client-cloudcontrol-3.893.0.tgz", - "integrity": "sha512-RjE8sl6nN9CLA7v2Gkm79GxpX9Uk5tf5KE/YcLWOeC63+1zF8jRpK/SNzbCmRUsEP9KA141UcF3FqxbMC46grA==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudcontrol/-/client-cloudcontrol-3.896.0.tgz", + "integrity": "sha512-CctiVyI8hwLHcPFnH8WQ13CSZfJQchaqniPcNKwmKV7JPtImeL5DtYeLobqOCNfcFnlddAvMqAx2Ak2OjVVrhw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.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.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@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", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@smithy/uuid": "^1.0.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-cloudformation": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.893.0.tgz", - "integrity": "sha512-6um0kN8bNfA55gmG7ag85BRqhLWp40Du+KJgErwSwW0v66pXnuQ4Gny6VuAQrEIMQTfaOR30uMhZKRcRvQULQA==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.896.0.tgz", + "integrity": "sha512-jNt7SabJK94Y2HmUNrEK38OV67DGcU1Yx8suz5W/qmzU4760fPGlsizmZ9dWa3JDa3FpJS5fl6uo4sm1QUYlNA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.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.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@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", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@smithy/uuid": "^1.0.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-cloudwatch": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.893.0.tgz", - "integrity": "sha512-UlyZmcseKIY9RmMLxyi86RLPGnbe0bY+M6w1TLtpzIzglNmid3n15EaO/JCe/5+tYUFp+6BxdXuyEEmM/eOBKA==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.896.0.tgz", + "integrity": "sha512-DZ5C1WXjQcDhiPHxEHeZHMSsc6DChNGdWM4tu/HX0dkX15hTc1g925Y7fpYJa4XXPrU77ivYkZgbITz5PLp+8A==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.0", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", - "@smithy/middleware-compression": "^4.2.3", + "@smithy/middleware-compression": "^4.2.4", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", @@ -1136,26 +1134,26 @@ } }, "node_modules/@aws-sdk/client-cloudwatch-logs": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.893.0.tgz", - "integrity": "sha512-US6nrUpWER+yxIVL6aa6CZnozwdzavWwEzTuSeHpBlbyHhgyA2/6E1wiqC+J6M97S1dAks0AA56tmz1uD+mTYw==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.896.0.tgz", + "integrity": "sha512-5vo3e9XsRftCut0FLASE1OsW7EWFk/pDQIbWOKx65f+kg8uXaNGOa61WuRU4JhdDdulM86JkLtMlsoUkVtxb4Q==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.0", "@smithy/eventstream-serde-browser": "^4.1.1", "@smithy/eventstream-serde-config-resolver": "^4.2.1", "@smithy/eventstream-serde-node": "^4.1.1", @@ -1163,73 +1161,72 @@ "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@smithy/uuid": "^1.0.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-codebuild": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-codebuild/-/client-codebuild-3.893.0.tgz", - "integrity": "sha512-kuH1aYHAnjnJ2W8MeFb3m3hD4j+aD2b/36Dymt9cJftpi1J5cLMmqUQv5psyJjSOQbybEk9kmjn3lgjGkD7kPg==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-codebuild/-/client-codebuild-3.896.0.tgz", + "integrity": "sha512-HtwoDIelFV2fzuAPvROsF67Uj8dPJqEfCDfrWdTKfo4QlW0auoWHVtGdp6cTvd6AcU0aSgB6L5TjJ/jk26enoQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.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.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", @@ -1241,45 +1238,45 @@ } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.893.0.tgz", - "integrity": "sha512-oK9ntzYAHgRtQzLD6k+je9mSfNCVeDOQr9QODVPnSw/wri0hgY5joqUVUCVpLdPmtDoG38iQ3iaOYiRUVQadkg==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.896.0.tgz", + "integrity": "sha512-W1q+Csw5WKeJIeWsE9U3FCBLfLEZQ5Wkrk+Owf/TVAk9tObW8KrTjMxrJOpB1kcLXIGs0xyL8x0u86pOHy2Ryw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.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.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", @@ -1291,153 +1288,151 @@ } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.893.0.tgz", - "integrity": "sha512-rojJDqmrpzwVfcE+EZ1Q1dnSWhHZQYwk9GinsvvnQNDCrARMyH+Q24jSLXk9rKSiY9UUj0P5o3kH2RdCOS3rGw==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.896.0.tgz", + "integrity": "sha512-f52lWRtrcG7IMS3wAGOOkq5Ra4rhqu9VlAnMn8wwsvKz2WmCYDvxQTuTpaIXuvTeMGVVhBT4lUR1aRtzBHxSHw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-endpoint-discovery": "3.893.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.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.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@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", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@smithy/uuid": "^1.0.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-ec2": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ec2/-/client-ec2-3.893.0.tgz", - "integrity": "sha512-VsHvXWUH20xKvEKRKJhLFhyRidh7OxFbXwvwZRioMCh1PDr18eXCDQ5Oq4qJpmsyUdqenytnF4gf9bfkaeqGJw==", + "version": "3.898.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ec2/-/client-ec2-3.898.0.tgz", + "integrity": "sha512-r2GnOh/h/rwDMSu82fDoXuOTUOAIl9hRwJp694rbgRz1fQ1kFGwiIwQJyq7WLx/m5fjYXu9Qt+MFKLcwr0h6BQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-sdk-ec2": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-sdk-ec2": "3.896.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.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.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@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", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@smithy/uuid": "^1.0.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-ecr": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.893.0.tgz", - "integrity": "sha512-gtnkWt01vZEHfrER573RcEzsLLX8ufEmepggk3OXlZ0UaotUF8yoMUT+Vom5YLIE7cfY+6pN82PgNd+52Ue3DQ==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.896.0.tgz", + "integrity": "sha512-/pLuF5c6MoOWWXTu7juoxKWcdeNXbNbK+DQMk2sgVHrhH6RVpb5K9dyziiu32xtYvEFYfa3SULr447GLzFMNRw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.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.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", @@ -1450,98 +1445,97 @@ } }, "node_modules/@aws-sdk/client-ecs": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecs/-/client-ecs-3.893.0.tgz", - "integrity": "sha512-5EHP/znlKVR266L8xSd/o04sYvoJ/1qzUsyjtj8rQL+IMC/rSYsXO1FN3N4Tt9iiNlHJsYcOxz9sLHV/RAvYrg==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecs/-/client-ecs-3.896.0.tgz", + "integrity": "sha512-AhsYZZ84gl8q61NbXhgtqDvUTozAIsaJV+Yk0fxBbMnbeBC3GV4AtvalWYzeVyXN8vLML4q73iExwkr87/tG9Q==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.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.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@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", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@smithy/uuid": "^1.0.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-elastic-load-balancing-v2": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-elastic-load-balancing-v2/-/client-elastic-load-balancing-v2-3.893.0.tgz", - "integrity": "sha512-T1WmHs8FKOqDRT8T+WEwFZA/03x5w9PR3WLxf95CgwvigQVQcGwUPxRNbBP/xUZ1LLyGFwqlajmvwNo7sqBXeg==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-elastic-load-balancing-v2/-/client-elastic-load-balancing-v2-3.896.0.tgz", + "integrity": "sha512-3nBzKlXytcpqx8IegcVhYZMPyw9CqJ8BV/kXYK+aiAa6uPd86Ag6G4A/D+2DLZMXnRO7Jx3OBfHINXbb/cejvg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.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.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", @@ -1554,45 +1548,45 @@ } }, "node_modules/@aws-sdk/client-iam": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-iam/-/client-iam-3.893.0.tgz", - "integrity": "sha512-izChkooyT0BsvsNJkLrHwRkU/I6i+p5cmaLIzqC6g1t74RXBzq7KZTabryXQQ61++n6QVeiRurE2eCQoRNoaCg==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-iam/-/client-iam-3.896.0.tgz", + "integrity": "sha512-WLZJtfc322wFEVKPIQQRifGrfwQ9YZIGRcAVRVn8a1FHmItZk/kKjjA/ZkWJ1YOLGp2QY0MuqrK65CUGSsvFfw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.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.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", @@ -1605,45 +1599,45 @@ } }, "node_modules/@aws-sdk/client-kms": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.893.0.tgz", - "integrity": "sha512-qHHfyqdBTxJVuKQxOhB0QtN5pBsKt44LWY+4DV6o6GrgpUecrMDtBV7WDagfo7W1sdYEggDdyeExKAzyAinm8g==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.896.0.tgz", + "integrity": "sha512-6kVxV+s8xEQFaEIRXacMgGxuRBqMVS0tR5ucjWa5bfjWbmlbzCDfddWUopMR3J3HvfuKvyAeap53FP9CDQ6Dyw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.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.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", @@ -1655,26 +1649,26 @@ } }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.893.0.tgz", - "integrity": "sha512-mhu6KfOJtfuAUjtzT/6mEX3LJWqD4e8u+No5a+uyECfOE795lgOBege999A4GrEci3gIIBalAT2bHy66oUp65Q==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.896.0.tgz", + "integrity": "sha512-zZX06gmp1GHE+HF1xbNidDF5lzNcm+hkXepJtYkpLEdvJk7Zv8+p6hRZ3kPpmswHmGpb4en1hqSIGgUimQBCXw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.0", "@smithy/eventstream-serde-browser": "^4.1.1", "@smithy/eventstream-serde-config-resolver": "^4.2.1", "@smithy/eventstream-serde-node": "^4.1.1", @@ -1682,21 +1676,21 @@ "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", @@ -1710,47 +1704,47 @@ } }, "node_modules/@aws-sdk/client-route-53": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-route-53/-/client-route-53-3.893.0.tgz", - "integrity": "sha512-VWclo9j4F4tLtPcH9bMjBdLy5G6hOOPkitWTIkE8WluYccL7dD7d+szUPM7eAJQDiTpyNI+qWI/fDqjrTrORGQ==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-route-53/-/client-route-53-3.896.0.tgz", + "integrity": "sha512-87KUzqSAQXPifJPgO5m2kTcbyeXL8djJ4Hvi95ok+kOm84k5mYoXhzVfjWlUL4nKs9WInBcQXYcX8YBxnDZEJg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-sdk-route53": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-sdk-route53": "3.894.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", - "@aws-sdk/xml-builder": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", + "@aws-sdk/xml-builder": "3.894.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.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.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", @@ -1763,35 +1757,35 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.893.0.tgz", - "integrity": "sha512-/P74KDJhOijnIAQR93sq1DQn8vbU3WaPZDyy1XUMRJJIY6iEJnDo1toD9XY6AFDz5TRto8/8NbcXT30AMOUtJQ==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.896.0.tgz", + "integrity": "sha512-UETVuMLQRqgrWxTnavotY0TlB/jaR9sL3hkIFPx4KtjmigNBdwRaiVfOuTnIXKd+w9RPINYG//nnrK+5gIyZkA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-bucket-endpoint": "3.893.0", "@aws-sdk/middleware-expect-continue": "3.893.0", - "@aws-sdk/middleware-flexible-checksums": "3.893.0", + "@aws-sdk/middleware-flexible-checksums": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-location-constraint": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-sdk-s3": "3.893.0", + "@aws-sdk/middleware-sdk-s3": "3.896.0", "@aws-sdk/middleware-ssec": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/signature-v4-multi-region": "3.893.0", + "@aws-sdk/signature-v4-multi-region": "3.896.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", - "@aws-sdk/xml-builder": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", + "@aws-sdk/xml-builder": "3.894.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.0", "@smithy/eventstream-serde-browser": "^4.1.1", "@smithy/eventstream-serde-config-resolver": "^4.2.1", "@smithy/eventstream-serde-node": "^4.1.1", @@ -1802,231 +1796,227 @@ "@smithy/invalid-dependency": "^4.1.1", "@smithy/md5-js": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", "@smithy/util-stream": "^4.3.2", "@smithy/util-utf8": "^4.1.0", "@smithy/util-waiter": "^4.1.1", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@smithy/uuid": "^1.0.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.893.0.tgz", - "integrity": "sha512-apbUdDawlhr9QpbzCyGR0T0mMEPOFtjm6B+1ZqxJBYS+WiyyIy+c5DYQkmylayeubXAJfA9QGyWPZaUp/XE8fA==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.896.0.tgz", + "integrity": "sha512-0e/9jcLDqAosEWNHPLj13KAhQn7oIqmVv78eR+DCxP4HOwL/1saQ/ZDRzqdwn9gUuq4Rjh1JZQdEFZyLWtVOYg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.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.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@smithy/uuid": "^1.0.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-sfn": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sfn/-/client-sfn-3.893.0.tgz", - "integrity": "sha512-jhMD0AO7FsCML1niDQK80mmaIFx5RVtugswz1+1/pwe2ORckLQo/hUkXXc15nEgD9M8HJAUjkgE/7c8PDq037w==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sfn/-/client-sfn-3.896.0.tgz", + "integrity": "sha512-LtsY8e+JWP64ssyEHplo49nUfiNuvTmad/eEYD1+qIUwACOkRJYyMsrbKl4UM/XpJWOrqsl4TuBixPV8WUDxOw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.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.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", "@smithy/util-utf8": "^4.1.0", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@smithy/uuid": "^1.0.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-ssm": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.893.0.tgz", - "integrity": "sha512-Z+M7pYozeGQhtmgD2yuWoHYLw4aJulxHZ5G991hdIEMPcx9/huuwnVVSTlRX3cI6ALLvihjaMvLlxdkf7StfCg==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.896.0.tgz", + "integrity": "sha512-tMTwUZ5/DkWuP7/1U805gXIFRoKQnFvuT0v082VorPx9oqGo33D4jz7miDHFDNx+gy/w+wfiPENJd2n9aRY/CA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.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.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@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", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@smithy/uuid": "^1.0.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.893.0.tgz", - "integrity": "sha512-0+qRGq7H8UNfxI0F02ObyOgOiYxkN4DSlFfwQUQMPfqENDNYOrL++2H9X3EInyc1lUM/+aK8TZqSbh473gdxcg==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.896.0.tgz", + "integrity": "sha512-mpE3mrNili1dcvEvxaYjyoib8HlRXkb2bY5a3WeK++KObFY+HUujKtgQmiNSRX5YwQszm//fTrmGMmv9zpMcKg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", + "@aws-sdk/core": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.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.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", @@ -2038,45 +2028,45 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.893.0.tgz", - "integrity": "sha512-0gagbyKzxvBi8nVtYLwTveMslZYlgZtY6n466uRVjGhA6r4cRrfE0uG+0aG5nDWZp1W4jmbgRyEg0A4y4b570A==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.896.0.tgz", + "integrity": "sha512-mEbbWGwGZbKCHgwAIm9aRCRcCnv6N9AZf3U0dMFwpYtVXVJvRWTK0OW2d49I2swaZ/GikMIccI3wxWT188OW8w==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.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.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", @@ -2088,46 +2078,46 @@ } }, "node_modules/@aws-sdk/client-xray": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.893.0.tgz", - "integrity": "sha512-NEJXLUeFAOG91xEjLrg8hDsjt4DZ0WflZ7gWZalbfs9XPzJCwwXoC2LfM3/22q5SamaVlDqF7WYBSEPSjem26Q==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.896.0.tgz", + "integrity": "sha512-Njatn0y3GKWlSAJtMKr7yEdaxr1EiSmkh4tiiOOxYXHZmUCAr/5yFvzYYKJl6/DqvBCDJ2o+nR/KEQ3XUT+K7g==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.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.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", @@ -2139,25 +2129,23 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.893.0.tgz", - "integrity": "sha512-E1NAWHOprBXIJ9CVb6oTsRD/tNOozrKBD/Sb4t7WZd3dpby6KpYfM6FaEGfRGcJBIcB4245hww8Rmg16qDMJWg==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.896.0.tgz", + "integrity": "sha512-uJaoyWKeGNyCyeI+cIJrD7LEB4iF/W8/x2ij7zg32OFpAAJx96N34/e+XSKp/xkJpO5FKiBOskKLnHeUsJsAPA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.893.0", - "@aws-sdk/xml-builder": "3.893.0", - "@smithy/core": "^3.11.1", + "@aws-sdk/xml-builder": "3.894.0", + "@smithy/core": "^3.12.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.3", + "@smithy/smithy-client": "^4.6.4", "@smithy/types": "^4.5.0", "@smithy/util-base64": "^4.1.0", - "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-middleware": "^4.1.1", "@smithy/util-utf8": "^4.1.0", - "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, "engines": { @@ -2165,12 +2153,12 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.893.0.tgz", - "integrity": "sha512-HUYDc/6/3UYM3HmJKFpxzhjSpz1bZC5u4xkwgnCjNChn4SVwrWAseYLXYT6wZEjn6kRd/0uNlDi6nA+PuXhIWA==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.896.0.tgz", + "integrity": "sha512-5Tucq01aiXl+z1u+PH8Weow84TvrvQpiCzQtu/3Or4W/IiEQ83gxgbuGEyD+aGhHlXEYwC2SuSszsT75zfH+5Q==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.893.0", + "@aws-sdk/client-cognito-identity": "3.896.0", "@aws-sdk/types": "3.893.0", "@smithy/property-provider": "^4.1.1", "@smithy/types": "^4.5.0", @@ -2181,12 +2169,12 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.893.0.tgz", - "integrity": "sha512-h4sYNk1iDrSZQLqFfbuD1GWY6KoVCvourfqPl6JZCYj8Vmnox5y9+7taPxwlU2VVII0hiV8UUbO79P35oPBSyA==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.896.0.tgz", + "integrity": "sha512-Cnqhupdkp825ICySrz4QTI64Nq3AmUAscPW8dueanni0avYBDp7RBppX4H0+6icqN569B983XNfQ0YSImQhfhg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.893.0", + "@aws-sdk/core": "3.896.0", "@aws-sdk/types": "3.893.0", "@smithy/property-provider": "^4.1.1", "@smithy/types": "^4.5.0", @@ -2197,18 +2185,18 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.893.0.tgz", - "integrity": "sha512-xYoC7DRr++zWZ9jG7/hvd6YjCbGDQzsAu2fBHHf91RVmSETXUgdEaP9rOdfCM02iIK/MYlwiWEIVBcBxWY/GQw==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.896.0.tgz", + "integrity": "sha512-CN0fTCKCUA1OTSx1c76o8XyJCy2WoI/av3J8r8mL6GmxTerhLRyzDy/MwxzPjTYPoL+GLEg6V4a9fRkWj1hBUA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.893.0", + "@aws-sdk/core": "3.896.0", "@aws-sdk/types": "3.893.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.3", + "@smithy/smithy-client": "^4.6.4", "@smithy/types": "^4.5.0", "@smithy/util-stream": "^4.3.2", "tslib": "^2.6.2" @@ -2218,18 +2206,18 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.893.0.tgz", - "integrity": "sha512-ZQWOl4jdLhJHHrHsOfNRjgpP98A5kw4YzkMOUoK+TgSQVLi7wjb957V0htvwpi6KmGr3f2F8J06D6u2OtIc62w==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-env": "3.893.0", - "@aws-sdk/credential-provider-http": "3.893.0", - "@aws-sdk/credential-provider-process": "3.893.0", - "@aws-sdk/credential-provider-sso": "3.893.0", - "@aws-sdk/credential-provider-web-identity": "3.893.0", - "@aws-sdk/nested-clients": "3.893.0", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.896.0.tgz", + "integrity": "sha512-+rbYG98czzwZLTYHJasK+VBjnIeXk73mRpZXHvaa4kDNxBezdN2YsoGNpLlPSxPdbpq18LY3LRtkdFTaT6DIQA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-env": "3.896.0", + "@aws-sdk/credential-provider-http": "3.896.0", + "@aws-sdk/credential-provider-process": "3.896.0", + "@aws-sdk/credential-provider-sso": "3.896.0", + "@aws-sdk/credential-provider-web-identity": "3.896.0", + "@aws-sdk/nested-clients": "3.896.0", "@aws-sdk/types": "3.893.0", "@smithy/credential-provider-imds": "^4.1.2", "@smithy/property-provider": "^4.1.1", @@ -2242,17 +2230,17 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.893.0.tgz", - "integrity": "sha512-NjvDUXciC2+EaQnbL/u/ZuCXj9PZQ/9ciPhI62LGCoJ3ft91lI1Z58Dgut0OFPpV6i16GhpFxzmbuf40wTgDbA==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.896.0.tgz", + "integrity": "sha512-J0Jm+56MNngk1PIyqoJFf5FC2fjA4CYXlqODqNRDtid7yk7HB9W3UTtvxofmii5KJOLcHGNPdGnHWKkUc+xYgw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.893.0", - "@aws-sdk/credential-provider-http": "3.893.0", - "@aws-sdk/credential-provider-ini": "3.893.0", - "@aws-sdk/credential-provider-process": "3.893.0", - "@aws-sdk/credential-provider-sso": "3.893.0", - "@aws-sdk/credential-provider-web-identity": "3.893.0", + "@aws-sdk/credential-provider-env": "3.896.0", + "@aws-sdk/credential-provider-http": "3.896.0", + "@aws-sdk/credential-provider-ini": "3.896.0", + "@aws-sdk/credential-provider-process": "3.896.0", + "@aws-sdk/credential-provider-sso": "3.896.0", + "@aws-sdk/credential-provider-web-identity": "3.896.0", "@aws-sdk/types": "3.893.0", "@smithy/credential-provider-imds": "^4.1.2", "@smithy/property-provider": "^4.1.1", @@ -2265,12 +2253,12 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.893.0.tgz", - "integrity": "sha512-5XitkZdiQhjWJV71qWqrH7hMXwuK/TvIRwiwKs7Pj0sapGSk3YgD3Ykdlolz7sQOleoKWYYqgoq73fIPpTTmFA==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.896.0.tgz", + "integrity": "sha512-UfWVMQPZy7dus40c4LWxh5vQ+I51z0q4vf09Eqas5848e9DrGRG46GYIuc/gy+4CqEypjbg/XNMjnZfGLHxVnQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.893.0", + "@aws-sdk/core": "3.896.0", "@aws-sdk/types": "3.893.0", "@smithy/property-provider": "^4.1.1", "@smithy/shared-ini-file-loader": "^4.2.0", @@ -2282,14 +2270,14 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.893.0.tgz", - "integrity": "sha512-ms8v13G1r0aHZh5PLcJu6AnQZPs23sRm3Ph0A7+GdqbPvWewP8M7jgZTKyTXi+oYXswdYECU1zPVur8zamhtLg==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.896.0.tgz", + "integrity": "sha512-77Te8WrVdLABKlv7QyetXP6aYEX1UORiahLA1PXQb/p66aFBw18Xc6JiN/6zJ4RqdyV1Xr9rwYBwGYua93ANIA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.893.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/token-providers": "3.893.0", + "@aws-sdk/client-sso": "3.896.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/token-providers": "3.896.0", "@aws-sdk/types": "3.893.0", "@smithy/property-provider": "^4.1.1", "@smithy/shared-ini-file-loader": "^4.2.0", @@ -2301,13 +2289,13 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.893.0.tgz", - "integrity": "sha512-wWD8r2ot4jf/CoogdPTl13HbwNLW4UheGUCu6gW7n9GoHh1JImYyooPHK8K7kD42hihydIA7OW7iFAf7//JYTw==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.896.0.tgz", + "integrity": "sha512-gwMwZWumo+V0xJplO8j2HIb1TfPsF9fbcRGXS0CanEvjg4fF2Xs1pOQl2oCw3biPZpxHB0plNZjqSF2eneGg9g==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.893.0", - "@aws-sdk/nested-clients": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/nested-clients": "3.896.0", "@aws-sdk/types": "3.893.0", "@smithy/property-provider": "^4.1.1", "@smithy/shared-ini-file-loader": "^4.2.0", @@ -2319,25 +2307,25 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.893.0.tgz", - "integrity": "sha512-nsnVpa6GNR8c/nP6kNTb9SMRtaKMGdqqL7HxiF2I6B09PwQ2u2Mm4PaJxsw1dm1Br2HIWA86ZYOvz4cB7lb8VA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.893.0", - "@aws-sdk/core": "3.893.0", - "@aws-sdk/credential-provider-cognito-identity": "3.893.0", - "@aws-sdk/credential-provider-env": "3.893.0", - "@aws-sdk/credential-provider-http": "3.893.0", - "@aws-sdk/credential-provider-ini": "3.893.0", - "@aws-sdk/credential-provider-node": "3.893.0", - "@aws-sdk/credential-provider-process": "3.893.0", - "@aws-sdk/credential-provider-sso": "3.893.0", - "@aws-sdk/credential-provider-web-identity": "3.893.0", - "@aws-sdk/nested-clients": "3.893.0", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.896.0.tgz", + "integrity": "sha512-0hj809k7+BPq/tYF7cbTX43c7MTT1cksSwPvkRai4NZDLhsRRHMy/Op419CcdQB4d4QMl0z5+8PNzOOkh0XTCQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.896.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-cognito-identity": "3.896.0", + "@aws-sdk/credential-provider-env": "3.896.0", + "@aws-sdk/credential-provider-http": "3.896.0", + "@aws-sdk/credential-provider-ini": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", + "@aws-sdk/credential-provider-process": "3.896.0", + "@aws-sdk/credential-provider-sso": "3.896.0", + "@aws-sdk/credential-provider-web-identity": "3.896.0", + "@aws-sdk/nested-clients": "3.896.0", "@aws-sdk/types": "3.893.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.0", "@smithy/credential-provider-imds": "^4.1.2", "@smithy/node-config-provider": "^4.2.2", "@smithy/property-provider": "^4.1.1", @@ -2349,9 +2337,9 @@ } }, "node_modules/@aws-sdk/ec2-metadata-service": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/ec2-metadata-service/-/ec2-metadata-service-3.893.0.tgz", - "integrity": "sha512-x0eOZm6mCvQqZl+aq/AgazvedGYTK02dKwhE84xefXdspshfVdykco7MJ+u2Pyqy2hZrE8CXgAABIMsX/LlGIg==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/ec2-metadata-service/-/ec2-metadata-service-3.896.0.tgz", + "integrity": "sha512-oIZ83NvhS0jkpYiD2fu5ZxwZWbtjqL7pniWFvAChiPYmQkdPzefWumcJvQLkQVB3XJEWKve9HUyPiwV8+vfgYQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.893.0", @@ -2380,15 +2368,15 @@ } }, "node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.893.0.tgz", - "integrity": "sha512-uO1z6DOxDxGHKc1NISkmq1g2CXg/CQPS/eeoUxuze0a6KF3nOH4ZjbUIvd7lTAg1d2k3VaO05jwJhfl9m4W/ow==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.896.0.tgz", + "integrity": "sha512-PVYBwRo1iZnDIh19YSB8qRs3Rzk6/Wi7WM2m2EdWo/QySfBXIR2Bqieqz/PehjZf8PVSZtDOKOCYVv+Agvtj4w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.893.0", - "@aws-sdk/util-dynamodb": "3.893.0", - "@smithy/core": "^3.11.1", - "@smithy/smithy-client": "^4.6.3", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/util-dynamodb": "3.896.0", + "@smithy/core": "^3.12.0", + "@smithy/smithy-client": "^4.6.4", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -2396,18 +2384,18 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.893.0" + "@aws-sdk/client-dynamodb": "^3.896.0" } }, "node_modules/@aws-sdk/lib-storage": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.893.0.tgz", - "integrity": "sha512-fsCDTpn4WyFV/H4tS5ubYxY4wE1AVMDv6trl2JdRSgUh5G+3ov9x1MOKXfnUjShhZ4KUSyq3KNezzlA2gAJIzQ==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.896.0.tgz", + "integrity": "sha512-EJWXL/5LxBJFujsOud3+EfRbIwy/SZiWy5ld70RdoqLS/RsfZh9+mZMJGvd3hewy7xHgDYVbxZfDh14bsvfYIQ==", "license": "Apache-2.0", "dependencies": { "@smithy/abort-controller": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.3", - "@smithy/smithy-client": "^4.6.3", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/smithy-client": "^4.6.4", "buffer": "5.6.0", "events": "3.3.0", "stream-browserify": "3.0.0", @@ -2417,7 +2405,7 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-s3": "^3.893.0" + "@aws-sdk/client-s3": "^3.896.0" } }, "node_modules/@aws-sdk/lib-storage/node_modules/events": { @@ -2479,15 +2467,15 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.893.0.tgz", - "integrity": "sha512-2swRPpyGK6xpZwIFmmFSFKp10iuyBLZEouhrt1ycBVA8iHGmPkuJSCim6Vb+JoRKqINp5tizWeQwdg9boIxJPw==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.896.0.tgz", + "integrity": "sha512-bB3W/IFG7HNNziACOp1aZVGGnrIahXc0PxZoU055JirEGQtDFIU1ZD7S9zLKmy9FFUvQsAeRL9nDFHbx8cwx/w==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.893.0", + "@aws-sdk/core": "3.896.0", "@aws-sdk/types": "3.893.0", "@smithy/is-array-buffer": "^4.1.0", "@smithy/node-config-provider": "^4.2.2", @@ -2562,17 +2550,17 @@ } }, "node_modules/@aws-sdk/middleware-sdk-ec2": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-ec2/-/middleware-sdk-ec2-3.893.0.tgz", - "integrity": "sha512-Jev9GulnC62aLpl4JpWozIJ2KZaLF/PYybqVR58UKWOOxj9pgksEDMdARI9sgnICb1Xhzkme7vkghqZtJ677Ew==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-ec2/-/middleware-sdk-ec2-3.896.0.tgz", + "integrity": "sha512-xs9jPXprV+a1PpMJ+K+qhoi5E6keAkOEwUEPTmqYW26/89NfJEZE7Qv4Y3UnVA9xGySJIqM7M65F2D5TAvf+/Q==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.893.0", "@aws-sdk/util-format-url": "3.893.0", - "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-endpoint": "^4.2.4", "@smithy/protocol-http": "^5.2.1", "@smithy/signature-v4": "^5.2.1", - "@smithy/smithy-client": "^4.6.3", + "@smithy/smithy-client": "^4.6.4", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -2581,9 +2569,9 @@ } }, "node_modules/@aws-sdk/middleware-sdk-route53": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-route53/-/middleware-sdk-route53-3.893.0.tgz", - "integrity": "sha512-waFIzyqq4CIyLUxBpPT+xBvvYDHFy7S/XtLanKfbQI28deapp4cQjVcGx4oDrLSzB5R1/aewnN72PLNiBBNbzg==", + "version": "3.894.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-route53/-/middleware-sdk-route53-3.894.0.tgz", + "integrity": "sha512-R2qw6EfDcAYmFij5Qwm3+21S7C6NdY9hQlTZzQL84Om+QPp3hceU09cPGM5vR5w0vSBs1mmd00jUbYRohrqjRg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.893.0", @@ -2595,19 +2583,19 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.893.0.tgz", - "integrity": "sha512-J2v7jOoSlE4o416yQiuka6+cVJzyrU7mbJEQA9VFCb+TYT2cG3xQB0bDzE24QoHeonpeBDghbg/zamYMnt+GsQ==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.896.0.tgz", + "integrity": "sha512-hlPu/AZ5Afa4ZafP+aXIjRtKm7BX57lurA+TJ+7nXm1Az8Du3Sg2tZXP2/GfqTztLIFQYj/Jy5smkJ0+1HNAPQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.893.0", + "@aws-sdk/core": "3.896.0", "@aws-sdk/types": "3.893.0", "@aws-sdk/util-arn-parser": "3.893.0", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.0", "@smithy/node-config-provider": "^4.2.2", "@smithy/protocol-http": "^5.2.1", "@smithy/signature-v4": "^5.2.1", - "@smithy/smithy-client": "^4.6.3", + "@smithy/smithy-client": "^4.6.4", "@smithy/types": "^4.5.0", "@smithy/util-config-provider": "^4.1.0", "@smithy/util-middleware": "^4.1.1", @@ -2634,15 +2622,15 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.893.0.tgz", - "integrity": "sha512-n1vHj7bdC4ycIAKkny0rmgvgvGOIgYnGBAqfPAFPR26WuGWmCxH2cT9nQTNA+li8ofxX9F9FIFBTKkW92Pc8iQ==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.896.0.tgz", + "integrity": "sha512-so/3tZH34YIeqG/QJgn5ZinnmHRdXV1ehsj4wVUrezL/dVW86jfwIkQIwpw8roOC657UoUf91c9FDhCxs3J5aQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.893.0", + "@aws-sdk/core": "3.896.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", - "@smithy/core": "^3.11.1", + "@aws-sdk/util-endpoints": "3.895.0", + "@smithy/core": "^3.12.0", "@smithy/protocol-http": "^5.2.1", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" @@ -2652,44 +2640,44 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.893.0.tgz", - "integrity": "sha512-HIUCyNtWkxvc0BmaJPUj/A0/29OapT/dzBNxr2sjgKNZgO81JuDFp+aXCmnf7vQoA2D1RzCsAIgEtfTExNFZqA==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.896.0.tgz", + "integrity": "sha512-KaHALB6DIXScJL/ExmonADr3jtTV6dpOHoEeTRSskJ/aW+rhZo7kH8SLmrwOT/qX8d5tza17YyR/oRkIKY6Eaw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.893.0", + "@aws-sdk/core": "3.896.0", "@aws-sdk/middleware-host-header": "3.893.0", "@aws-sdk/middleware-logger": "3.893.0", "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/region-config-resolver": "3.893.0", "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.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.3", - "@smithy/middleware-retry": "^4.2.4", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", "@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.3", + "@smithy/smithy-client": "^4.6.4", "@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.3", - "@smithy/util-defaults-mode-node": "^4.1.3", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", @@ -2718,12 +2706,12 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.893.0.tgz", - "integrity": "sha512-pp4Bn8dL4i68P/mHgZ7sgkm8OSIpwjtGxP73oGseu9Cli0JRyJ1asTSsT60hUz3sbo+3oKk3hEobD6UxLUeGRA==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.896.0.tgz", + "integrity": "sha512-txiQDEZXL9tlNP8mbnNaDtuHBYc/FCqaZ8Y76qnfM3o6CTIn0t0tTAlnx1CyFe4EaikVBgQuZvj5KfNA8PmlzA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.893.0", + "@aws-sdk/middleware-sdk-s3": "3.896.0", "@aws-sdk/types": "3.893.0", "@smithy/protocol-http": "^5.2.1", "@smithy/signature-v4": "^5.2.1", @@ -2735,13 +2723,13 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.893.0.tgz", - "integrity": "sha512-nkzuE910TxW4pnIwJ+9xDMx5m+A8iXGM16Oa838YKsds07cgkRp7sPnpH9B8NbGK2szskAAkXfj7t1f59EKd1Q==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.896.0.tgz", + "integrity": "sha512-WBoD+RY7tUfW9M+wGrZ2vdveR+ziZOjGHWFY3lcGnDvI8KE+fcSccEOTxgJBNBS5Z8B+WHKU2sZjb+Z7QqGwjw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.893.0", - "@aws-sdk/nested-clients": "3.893.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/nested-clients": "3.896.0", "@aws-sdk/types": "3.893.0", "@smithy/property-provider": "^4.1.1", "@smithy/shared-ini-file-loader": "^4.2.0", @@ -2778,9 +2766,9 @@ } }, "node_modules/@aws-sdk/util-dynamodb": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.893.0.tgz", - "integrity": "sha512-zjXv6ejXF2bzSB+EEmfATm1VoyejJmncNYunOLQ+ThiSepfLQ5jKYtbDc7niqjfHysGpVTSYji4DG25Yj+WQZA==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.896.0.tgz", + "integrity": "sha512-1vOPb4LnDDMnrZFif9uZYxydoyr1bijkovh1c+u2TxDd9cZDh+X/eyuRSuIvsPeueOwXWTdcKsojRZkn3w1mnA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2789,13 +2777,13 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.893.0" + "@aws-sdk/client-dynamodb": "^3.896.0" } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.893.0.tgz", - "integrity": "sha512-xeMcL31jXHKyxRwB3oeNjs8YEpyvMnSYWr2OwLydgzgTr0G349AHlJHwYGCF9xiJ2C27kDxVvXV/Hpdp0p7TWw==", + "version": "3.895.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.895.0.tgz", + "integrity": "sha512-MhxBvWbwxmKknuggO2NeMwOVkHOYL98pZ+1ZRI5YwckoCL3AvISMnPJgfN60ww6AIXHGpkp+HhpFdKOe8RHSEg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.893.0", @@ -2848,12 +2836,12 @@ } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.893.0.tgz", - "integrity": "sha512-tTRkJo/fth9NPJ2AO/XLuJWVsOhbhejQRLyP0WXG3z0Waa5IWK5YBxBC1tWWATUCwsN748JQXU03C1aF9cRD9w==", + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.896.0.tgz", + "integrity": "sha512-jegizucAwoxyBddKl0kRGNEgRHcfGuMeyhP1Nf+wIUmHz/9CxobIajqcVk/KRNLdZY5mSn7YG2VtP3z0BcBb0w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", "@aws-sdk/types": "3.893.0", "@smithy/node-config-provider": "^4.2.2", "@smithy/types": "^4.5.0", @@ -2872,12 +2860,13 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.893.0.tgz", - "integrity": "sha512-qKkJ2E0hU60iq0o2+hBSIWS8sf34xhqiRRGw5nbRhwEnE2MsWsWBpRoysmr32uq9dHMWUzII0c/fS29+wOSdMA==", + "version": "3.894.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.894.0.tgz", + "integrity": "sha512-E6EAMc9dT1a2DOdo4zyOf3fp5+NJ2wI+mcm7RaW1baFIWDwcb99PpvWoV7YEiK7oaBDshuOEGWKUSYXdW+JYgA==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.5.0", + "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, "engines": { @@ -4313,9 +4302,9 @@ } }, "node_modules/@smithy/core": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.11.1.tgz", - "integrity": "sha512-REH7crwORgdjSpYs15JBiIWOYjj0hJNC3aCecpJvAlMMaaqL5i2CLb1i6Hc4yevToTKSqslLMI9FKjhugEwALA==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.13.0.tgz", + "integrity": "sha512-BI6ALLPOKnPOU1Cjkc+1TPhOlP3JXSR/UH14JmnaLq41t3ma+IjuXrKfhycVjr5IQ0XxRh2NnQo3olp+eCVrGg==", "license": "Apache-2.0", "dependencies": { "@smithy/middleware-serde": "^4.1.1", @@ -4326,9 +4315,8 @@ "@smithy/util-middleware": "^4.1.1", "@smithy/util-stream": "^4.3.2", "@smithy/util-utf8": "^4.1.0", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@smithy/uuid": "^1.0.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" @@ -4520,13 +4508,13 @@ } }, "node_modules/@smithy/middleware-compression": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-4.2.3.tgz", - "integrity": "sha512-g23ZBhZqznGWds27uRXqASuDAJ9u71N39rEMHwaBiUREDWmHhIqTGPqOmAndbTRKcQ3UGm0eZ4NKTmXEanFksw==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-4.2.5.tgz", + "integrity": "sha512-QUtV6J8u1N7WDHgtjNOig+ht7AANfMIu+ZopZtJoUG9qVuy1nIh9wYq47Gr1lnTLzD/NvCpzpBOs+lN0cvNHgA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.13.0", "@smithy/is-array-buffer": "^4.1.0", "@smithy/node-config-provider": "^4.2.2", "@smithy/protocol-http": "^5.2.1", @@ -4556,12 +4544,12 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.2.3.tgz", - "integrity": "sha512-+1H5A28DeffRVrqmVmtqtRraEjoaC6JVap3xEQdVoBh2EagCVY7noPmcBcG4y7mnr9AJitR1ZAse2l+tEtK5vg==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.2.5.tgz", + "integrity": "sha512-DdOIpssQ5LFev7hV6GX9TMBW5ChTsQBxqgNW1ZGtJNSAi5ksd5klwPwwMY0ejejfEzwXXGqxgVO3cpaod4veiA==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.13.0", "@smithy/middleware-serde": "^4.1.1", "@smithy/node-config-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.2.0", @@ -4575,21 +4563,20 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.2.4.tgz", - "integrity": "sha512-amyqYQFewnAviX3yy/rI/n1HqAgfvUdkEhc04kDjxsngAUREKuOI24iwqQUirrj6GtodWmR4iO5Zeyl3/3BwWg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.3.1.tgz", + "integrity": "sha512-aH2bD1bzb6FB04XBhXA5mgedEZPKx3tD/qBuYCAKt5iieWvWO1Y2j++J9uLqOndXb9Pf/83Xka/YjSnMbcPchA==", "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^4.2.2", "@smithy/protocol-http": "^5.2.1", "@smithy/service-error-classification": "^4.1.2", - "@smithy/smithy-client": "^4.6.3", + "@smithy/smithy-client": "^4.6.5", "@smithy/types": "^4.5.0", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@smithy/uuid": "^1.0.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" @@ -4751,13 +4738,13 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.6.3.tgz", - "integrity": "sha512-K27LqywsaqKz4jusdUQYJh/YP2VbnbdskZ42zG8xfV+eovbTtMc2/ZatLWCfSkW0PDsTUXlpvlaMyu8925HsOw==", + "version": "4.6.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.6.5.tgz", + "integrity": "sha512-6J2hhuWu7EjnvLBIGltPCqzNswL1cW/AkaZx6i56qLsQ0ix17IAhmDD9aMmL+6CN9nCJODOXpBTCQS6iKAA7/g==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.11.1", - "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/core": "^3.13.0", + "@smithy/middleware-endpoint": "^4.2.5", "@smithy/middleware-stack": "^4.1.1", "@smithy/protocol-http": "^5.2.1", "@smithy/types": "^4.5.0", @@ -4858,13 +4845,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.1.3.tgz", - "integrity": "sha512-5fm3i2laE95uhY6n6O6uGFxI5SVbqo3/RWEuS3YsT0LVmSZk+0eUqPhKd4qk0KxBRPaT5VNT/WEBUqdMyYoRgg==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.1.5.tgz", + "integrity": "sha512-FGBhlmFZVSRto816l6IwrmDcQ9pUYX6ikdR1mmAhdtSS1m77FgADukbQg7F7gurXfAvloxE/pgsrb7SGja6FQA==", "license": "Apache-2.0", "dependencies": { "@smithy/property-provider": "^4.1.1", - "@smithy/smithy-client": "^4.6.3", + "@smithy/smithy-client": "^4.6.5", "@smithy/types": "^4.5.0", "bowser": "^2.11.0", "tslib": "^2.6.2" @@ -4874,16 +4861,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.1.3.tgz", - "integrity": "sha512-lwnMzlMslZ9GJNt+/wVjz6+fe9Wp5tqR1xAyQn+iywmP+Ymj0F6NhU/KfHM5jhGPQchRSCcau5weKhFdLIM4cA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.1.5.tgz", + "integrity": "sha512-Gwj8KLgJ/+MHYjVubJF0EELEh9/Ir7z7DFqyYlwgmp4J37KE+5vz6b3pWUnSt53tIe5FjDfVjDmHGYKjwIvW0Q==", "license": "Apache-2.0", "dependencies": { "@smithy/config-resolver": "^4.2.2", "@smithy/credential-provider-imds": "^4.1.2", "@smithy/node-config-provider": "^4.2.2", "@smithy/property-provider": "^4.1.1", - "@smithy/smithy-client": "^4.6.3", + "@smithy/smithy-client": "^4.6.5", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -5002,6 +4989,18 @@ "node": ">=18.0.0" } }, + "node_modules/@smithy/uuid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.0.0.tgz", + "integrity": "sha512-OlA/yZHh0ekYFnbUkmYBDQPE6fGfdrvgz39ktp8Xf+FA6BfxLejPTMDOG0Nfk5/rDySAz1dRbFf24zaAFYVXlQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@standard-schema/spec": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", @@ -5142,11 +5141,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/uuid": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==" - }, "node_modules/@valkey/valkey-glide": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/@valkey/valkey-glide/-/valkey-glide-1.3.4.tgz", @@ -10154,18 +10148,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/valibot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.1.0.tgz", @@ -10717,8 +10699,8 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.893.0", - "@aws-sdk/lib-dynamodb": "^3.893.0", + "@aws-sdk/client-dynamodb": "^3.896.0", + "@aws-sdk/lib-dynamodb": "^3.896.0", "aws-sdk-client-mock": "^4.1.0" }, "peerDependencies": { @@ -10818,7 +10800,7 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.893.0", + "@aws-sdk/client-cloudwatch": "^3.896.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, @@ -10840,11 +10822,11 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.893.0", - "@aws-sdk/client-dynamodb": "^3.893.0", - "@aws-sdk/client-secrets-manager": "^3.893.0", - "@aws-sdk/client-ssm": "^3.893.0", - "@aws-sdk/util-dynamodb": "^3.893.0", + "@aws-sdk/client-appconfigdata": "^3.896.0", + "@aws-sdk/client-dynamodb": "^3.896.0", + "@aws-sdk/client-secrets-manager": "^3.896.0", + "@aws-sdk/client-ssm": "^3.896.0", + "@aws-sdk/util-dynamodb": "^3.896.0", "@smithy/util-base64": "^4.0.0", "aws-sdk-client-mock": "^4.1.0" }, @@ -10907,7 +10889,7 @@ "license": "MIT-0", "dependencies": { "@aws-cdk/toolkit-lib": "^1.8.2", - "@aws-sdk/client-lambda": "^3.893.0", + "@aws-sdk/client-lambda": "^3.896.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.216.0", "esbuild": "^0.25.10", @@ -10928,8 +10910,8 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.893.0", - "@aws-sdk/client-xray": "^3.893.0" + "@aws-sdk/client-dynamodb": "^3.896.0", + "@aws-sdk/client-xray": "^3.896.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x" diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index 9f106dc7b9..797c10f651 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -151,8 +151,8 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.893.0", - "@aws-sdk/lib-dynamodb": "^3.893.0", + "@aws-sdk/client-dynamodb": "^3.896.0", + "@aws-sdk/lib-dynamodb": "^3.896.0", "aws-sdk-client-mock": "^4.1.0" } } diff --git a/packages/metrics/package.json b/packages/metrics/package.json index dbf2fc043f..f8dfecfb76 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -65,7 +65,7 @@ "main": "./lib/cjs/index.js", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.893.0", + "@aws-sdk/client-cloudwatch": "^3.896.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, diff --git a/packages/parameters/package.json b/packages/parameters/package.json index 17f2f3dc4c..4f28072fc4 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -156,11 +156,11 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.893.0", - "@aws-sdk/client-dynamodb": "^3.893.0", - "@aws-sdk/client-secrets-manager": "^3.893.0", - "@aws-sdk/client-ssm": "^3.893.0", - "@aws-sdk/util-dynamodb": "^3.893.0", + "@aws-sdk/client-appconfigdata": "^3.896.0", + "@aws-sdk/client-dynamodb": "^3.896.0", + "@aws-sdk/client-secrets-manager": "^3.896.0", + "@aws-sdk/client-ssm": "^3.896.0", + "@aws-sdk/util-dynamodb": "^3.896.0", "@smithy/util-base64": "^4.0.0", "aws-sdk-client-mock": "^4.1.0" }, diff --git a/packages/testing/package.json b/packages/testing/package.json index 5357c036f8..ce1e8267c1 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -99,7 +99,7 @@ "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/testing#readme", "dependencies": { "@aws-cdk/toolkit-lib": "^1.8.2", - "@aws-sdk/client-lambda": "^3.893.0", + "@aws-sdk/client-lambda": "^3.896.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.216.0", "esbuild": "^0.25.10", diff --git a/packages/tracer/package.json b/packages/tracer/package.json index e36d2eed6b..9c8cf5911f 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -30,8 +30,8 @@ "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.893.0", - "@aws-sdk/client-xray": "^3.893.0" + "@aws-sdk/client-dynamodb": "^3.896.0", + "@aws-sdk/client-xray": "^3.896.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x" From eab2a9355c08066b0b92b29be64f176a735db399 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Sep 2025 10:06:32 +0200 Subject: [PATCH 195/255] chore(deps-dev): bump lint-staged from 16.2.1 to 16.2.3 (#4590) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 42cc3ed10a..f1ce71b0c1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "@types/node": "^24.5.2", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", - "lint-staged": "^16.2.1", + "lint-staged": "^16.2.3", "markdownlint-cli2": "^0.18.1", "middy5": "npm:@middy/core@^5.4.3", "middy6": "npm:@middy/core@^6.0.0", @@ -8038,9 +8038,9 @@ } }, "node_modules/lint-staged": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.1.tgz", - "integrity": "sha512-KMeYmH9wKvHsXdUp+z6w7HN3fHKHXwT1pSTQTYxB9kI6ekK1rlL3kLZEoXZCppRPXFK9PFW/wfQctV7XUqMrPQ==", + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.3.tgz", + "integrity": "sha512-1OnJEESB9zZqsp61XHH2fvpS1es3hRCxMplF/AJUDa8Ho8VrscYDIuxGrj3m8KPXbcWZ8fT9XTMUhEQmOVKpKw==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index fb837b78f1..0cf1f915eb 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "@types/node": "^24.5.2", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", - "lint-staged": "^16.2.1", + "lint-staged": "^16.2.3", "markdownlint-cli2": "^0.18.1", "middy5": "npm:@middy/core@^5.4.3", "middy6": "npm:@middy/core@^6.0.0", From 9e2b5be215ce6bf2c90d2a720f7dba77e68310c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Sep 2025 11:37:38 +0200 Subject: [PATCH 196/255] chore(deps): bump github/codeql-action from 3.30.4 to 3.30.5 (#4588) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi --- .github/workflows/ossf_scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ossf_scorecard.yml b/.github/workflows/ossf_scorecard.yml index a23689d416..2ce47b2d77 100644 --- a/.github/workflows/ossf_scorecard.yml +++ b/.github/workflows/ossf_scorecard.yml @@ -43,6 +43,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@303c0aef88fc2fe5ff6d63d3b1596bfd83dfa1f9 # v3.29.5 + uses: github/codeql-action/upload-sarif@3599b3baa15b485a2e49ef411a7a4bb2452e7f93 # v3.29.5 with: sarif_file: results.sarif From 6e907fdeae9bdaa00051085fc8568832736fc19b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Oct 2025 10:14:23 +0100 Subject: [PATCH 197/255] chore(deps): bump @types/node from 24.5.2 to 24.6.0 (#4595) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/app/package.json | 4 ++-- package-lock.json | 20 ++++++++++---------- package.json | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 545eedb415..57101d38c2 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -30,7 +30,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.152", - "@types/node": "24.5.2", + "@types/node": "24.6.0", "aws-cdk-lib": "^2.216.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -49,7 +49,7 @@ "@aws-sdk/lib-dynamodb": "^3.896.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", - "@types/node": "24.5.2", + "@types/node": "24.6.0", "aws-cdk": "^2.1029.2", "constructs": "^10.4.2", "esbuild": "^0.25.10", diff --git a/package-lock.json b/package-lock.json index f1ce71b0c1..e2c21cb6b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.4", "@types/aws-lambda": "^8.10.152", - "@types/node": "^24.5.2", + "@types/node": "^24.6.0", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.2.3", @@ -60,7 +60,7 @@ "@aws-sdk/lib-dynamodb": "^3.896.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", - "@types/node": "24.5.2", + "@types/node": "24.6.0", "aws-cdk": "^2.1029.2", "constructs": "^10.4.2", "esbuild": "^0.25.10", @@ -68,7 +68,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.152", - "@types/node": "24.5.2", + "@types/node": "24.6.0", "aws-cdk-lib": "^2.216.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -5096,12 +5096,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.5.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz", - "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==", + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.6.0.tgz", + "integrity": "sha512-F1CBxgqwOMc4GKJ7eY22hWhBVQuMYTtqI8L0FcszYcpYX0fzfDGpez22Xau8Mgm7O9fI+zA/TYIdq3tGWfweBA==", "license": "MIT", "dependencies": { - "undici-types": "~7.12.0" + "undici-types": "~7.13.0" } }, "node_modules/@types/promise-retry": { @@ -10094,9 +10094,9 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz", - "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.13.0.tgz", + "integrity": "sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==", "license": "MIT" }, "node_modules/unicorn-magic": { diff --git a/package.json b/package.json index 0cf1f915eb..1c4988d7e5 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.4", "@types/aws-lambda": "^8.10.152", - "@types/node": "^24.5.2", + "@types/node": "^24.6.0", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.2.3", From 92b5e92c98b484fab2c308d067080df820205ed6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Oct 2025 10:16:23 +0100 Subject: [PATCH 198/255] chore(deps): bump actions/dependency-review-action from 4.7.3 to 4.8.0 (#4591) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi Co-authored-by: Stefano Vozza --- .github/workflows/dependency-review.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index c0f2e6e009..70fb3b9a3e 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -19,4 +19,4 @@ jobs: - name: 'Checkout Repository' uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: 'Dependency Review' - uses: actions/dependency-review-action@595b5aeba73380359d98a5e087f648dbb0edce1b # v4.7.3 + uses: actions/dependency-review-action@56339e523c0409420f6c2c9a2f4292bbb3c07dd3 # v4.8.0 From e3215263e369acb581e113f08aa3893a170d0cb9 Mon Sep 17 00:00:00 2001 From: Stefano Vozza Date: Wed, 1 Oct 2025 15:31:52 +0100 Subject: [PATCH 199/255] feat(event-handler): add streaming functionality (#4586) --- packages/event-handler/src/rest/Router.ts | 104 ++++-- packages/event-handler/src/rest/converters.ts | 147 +++++++-- packages/event-handler/src/rest/index.ts | 2 +- packages/event-handler/src/rest/utils.ts | 68 +++- packages/event-handler/src/types/common.ts | 3 - packages/event-handler/src/types/rest.ts | 66 +++- .../tests/unit/rest/Router/decorators.test.ts | 135 ++++++-- .../tests/unit/rest/Router/middleware.test.ts | 58 +++- .../tests/unit/rest/Router/streaming.test.ts | 309 ++++++++++++++++++ .../tests/unit/rest/converters.test.ts | 133 +++++++- .../event-handler/tests/unit/rest/helpers.ts | 43 ++- .../tests/unit/rest/utils.test.ts | 45 ++- 12 files changed, 1010 insertions(+), 103 deletions(-) create mode 100644 packages/event-handler/tests/unit/rest/Router/streaming.test.ts diff --git a/packages/event-handler/src/rest/Router.ts b/packages/event-handler/src/rest/Router.ts index 8ce3f5e191..6c975d4f33 100644 --- a/packages/event-handler/src/rest/Router.ts +++ b/packages/event-handler/src/rest/Router.ts @@ -1,14 +1,13 @@ +import { Readable } from 'node:stream'; +import { pipeline } from 'node:stream/promises'; +import type streamWeb from 'node:stream/web'; import type { GenericLogger } from '@aws-lambda-powertools/commons/types'; import { getStringFromEnv, isDevMode, } from '@aws-lambda-powertools/commons/utils/env'; import type { APIGatewayProxyResult, Context } from 'aws-lambda'; -import type { - HandlerResponse, - HttpStatusCode, - ResolveOptions, -} from '../types/index.js'; +import type { HandlerResponse, ResolveOptions } from '../types/index.js'; import type { ErrorConstructor, ErrorHandler, @@ -17,6 +16,8 @@ import type { Middleware, Path, RequestContext, + ResolveStreamOptions, + ResponseStream, RestRouteOptions, RestRouterOptions, RouteHandler, @@ -26,6 +27,7 @@ import { handlerResultToProxyResult, handlerResultToWebResponse, proxyEventToWebRequest, + webHeadersToApiGatewayV1Headers, } from './converters.js'; import { ErrorHandlerRegistry } from './ErrorHandlerRegistry.js'; import { @@ -38,8 +40,9 @@ import { Route } from './Route.js'; import { RouteHandlerRegistry } from './RouteHandlerRegistry.js'; import { composeMiddleware, + HttpResponseStream, isAPIGatewayProxyEvent, - isAPIGatewayProxyResult, + isExtendedAPIGatewayProxyResult, isHttpMethod, resolvePrefixedPath, } from './utils.js'; @@ -187,21 +190,19 @@ class Router { } /** - * Resolves an API Gateway event by routing it to the appropriate handler - * and converting the result to an API Gateway proxy result. Handles errors - * using registered error handlers or falls back to default error handling - * (500 Internal Server Error). + * Core resolution logic shared by both resolve and resolveStream methods. + * Validates the event, routes to handlers, executes middleware, and handles errors. * * @param event - The Lambda event to resolve * @param context - The Lambda context * @param options - Optional resolve options for scope binding - * @returns An API Gateway proxy result + * @returns A handler response (Response, JSONObject, or ExtendedAPIGatewayProxyResult) */ - public async resolve( + async #resolve( event: unknown, context: Context, options?: ResolveOptions - ): Promise { + ): Promise { if (!isAPIGatewayProxyEvent(event)) { this.logger.error( 'Received an event that is not compatible with this resolver' @@ -276,18 +277,79 @@ class Router { }); // middleware result takes precedence to allow short-circuiting - const result = middlewareResult ?? requestContext.res; - - return handlerResultToProxyResult(result); + return middlewareResult ?? requestContext.res; } catch (error) { this.logger.debug(`There was an error processing the request: ${error}`); - const result = await this.handleError(error as Error, { + return this.handleError(error as Error, { ...requestContext, scope: options?.scope, }); - const statusCode = - result instanceof Response ? result.status : result.statusCode; - return handlerResultToProxyResult(result, statusCode as HttpStatusCode); + } + } + + /** + * Resolves an API Gateway event by routing it to the appropriate handler + * and converting the result to an API Gateway proxy result. Handles errors + * using registered error handlers or falls back to default error handling + * (500 Internal Server Error). + * + * @param event - The Lambda event to resolve + * @param context - The Lambda context + * @param options - Optional resolve options for scope binding + * @returns An API Gateway proxy result + */ + public async resolve( + event: unknown, + context: Context, + options?: ResolveOptions + ): Promise { + const result = await this.#resolve(event, context, options); + return handlerResultToProxyResult(result); + } + + /** + * Resolves an API Gateway event by routing it to the appropriate handler + * and streaming the response directly to the provided response stream. + * Used for Lambda response streaming. + * + * @param event - The Lambda event to resolve + * @param context - The Lambda context + * @param options - Stream resolve options including the response stream + */ + public async resolveStream( + event: unknown, + context: Context, + options: ResolveStreamOptions + ): Promise { + const result = await this.#resolve(event, context, options); + await this.#streamHandlerResponse(result, options.responseStream); + } + + /** + * Streams a handler response to the Lambda response stream. + * Converts the response to a web response and pipes it through the stream. + * + * @param response - The handler response to stream + * @param responseStream - The Lambda response stream to write to + */ + async #streamHandlerResponse( + response: HandlerResponse, + responseStream: ResponseStream + ) { + const webResponse = handlerResultToWebResponse(response); + const { headers } = webHeadersToApiGatewayV1Headers(webResponse.headers); + const resStream = HttpResponseStream.from(responseStream, { + statusCode: webResponse.status, + headers, + }); + + if (webResponse.body) { + const nodeStream = Readable.fromWeb( + webResponse.body as streamWeb.ReadableStream + ); + await pipeline(nodeStream, resStream); + } else { + resStream.write(''); } } @@ -320,7 +382,7 @@ class Router { try { const { scope, ...reqCtx } = options; const body = await handler.apply(scope ?? this, [error, reqCtx]); - if (body instanceof Response || isAPIGatewayProxyResult(body)) { + if (body instanceof Response || isExtendedAPIGatewayProxyResult(body)) { return body; } if (!body.statusCode) { diff --git a/packages/event-handler/src/rest/converters.ts b/packages/event-handler/src/rest/converters.ts index 56c4271d0b..73afeb4c02 100644 --- a/packages/event-handler/src/rest/converters.ts +++ b/packages/event-handler/src/rest/converters.ts @@ -1,11 +1,20 @@ +import { Readable } from 'node:stream'; +import type streamWeb from 'node:stream/web'; +import { isString } from '@aws-lambda-powertools/commons/typeutils'; import type { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; import type { CompressionOptions, + ExtendedAPIGatewayProxyResult, + ExtendedAPIGatewayProxyResultBody, HandlerResponse, HttpStatusCode, } from '../types/rest.js'; import { COMPRESSION_ENCODING_TYPES, HttpStatusCodes } from './constants.js'; -import { isAPIGatewayProxyResult } from './utils.js'; +import { + isExtendedAPIGatewayProxyResult, + isNodeReadableStream, + isWebReadableStream, +} from './utils.js'; /** * Creates a request body from API Gateway event body, handling base64 decoding if needed. @@ -72,18 +81,17 @@ const proxyEventToWebRequest = (event: APIGatewayProxyEvent): Request => { }; /** - * Converts a Web API Response object to an API Gateway proxy result. + * Converts Web API Headers to API Gateway v1 headers format. + * Splits multi-value headers by comma and organizes them into separate objects. * - * @param response - The Web API Response object - * @returns An API Gateway proxy result + * @param webHeaders - The Web API Headers object + * @returns Object containing headers and multiValueHeaders */ -const webResponseToProxyResult = async ( - response: Response -): Promise => { +const webHeadersToApiGatewayV1Headers = (webHeaders: Headers) => { const headers: Record = {}; const multiValueHeaders: Record> = {}; - for (const [key, value] of response.headers.entries()) { + for (const [key, value] of webHeaders.entries()) { const values = value.split(',').map((v) => v.trimStart()); if (values.length > 1) { multiValueHeaders[key] = values; @@ -92,6 +100,25 @@ const webResponseToProxyResult = async ( } } + return { + headers, + multiValueHeaders, + }; +}; + +/** + * Converts a Web API Response object to an API Gateway proxy result. + * + * @param response - The Web API Response object + * @returns An API Gateway proxy result + */ +const webResponseToProxyResult = async ( + response: Response +): Promise => { + const { headers, multiValueHeaders } = webHeadersToApiGatewayV1Headers( + response.headers + ); + // Check if response contains compressed/binary content const contentEncoding = response.headers.get( 'content-encoding' @@ -129,18 +156,47 @@ const webResponseToProxyResult = async ( return result; }; +/** + * Adds headers from an ExtendedAPIGatewayProxyResult to a Headers object. + * + * @param headers - The Headers object to mutate + * @param response - The response containing headers to add + * @remarks This function mutates the headers object by adding entries from + * response.headers and response.multiValueHeaders + */ +function addProxyEventHeaders( + headers: Headers, + response: ExtendedAPIGatewayProxyResult +) { + for (const [key, value] of Object.entries(response.headers ?? {})) { + if (value != null) { + headers.set(key, String(value)); + } + } + + for (const [key, values] of Object.entries( + response.multiValueHeaders ?? {} + )) { + for (const value of values ?? []) { + headers.append(key, String(value)); + } + } +} + /** * Converts a handler response to a Web API Response object. * Handles APIGatewayProxyResult, Response objects, and plain objects. * * @param response - The handler response (APIGatewayProxyResult, Response, or plain object) * @param resHeaders - Optional headers to be included in the response + * @returns A Web API Response object */ const handlerResultToWebResponse = ( response: HandlerResponse, resHeaders?: Headers ): Response => { if (response instanceof Response) { + if (resHeaders === undefined) return response; const headers = new Headers(resHeaders); for (const [key, value] of response.headers.entries()) { headers.set(key, value); @@ -154,22 +210,15 @@ const handlerResultToWebResponse = ( const headers = new Headers(resHeaders); headers.set('Content-Type', 'application/json'); - if (isAPIGatewayProxyResult(response)) { - for (const [key, value] of Object.entries(response.headers ?? {})) { - if (value != null) { - headers.set(key, String(value)); - } - } + if (isExtendedAPIGatewayProxyResult(response)) { + addProxyEventHeaders(headers, response); - for (const [key, values] of Object.entries( - response.multiValueHeaders ?? {} - )) { - for (const value of values ?? []) { - headers.append(key, String(value)); - } - } + const body = + response.body instanceof Readable + ? (Readable.toWeb(response.body) as ReadableStream) + : response.body; - return new Response(response.body, { + return new Response(body, { status: response.statusCode, headers, }); @@ -189,8 +238,24 @@ const handlerResultToProxyResult = async ( response: HandlerResponse, statusCode: HttpStatusCode = HttpStatusCodes.OK ): Promise => { - if (isAPIGatewayProxyResult(response)) { - return response; + if (isExtendedAPIGatewayProxyResult(response)) { + if (isString(response.body)) { + return { + ...response, + body: response.body, + }; + } + if ( + isNodeReadableStream(response.body) || + isWebReadableStream(response.body) + ) { + const nodeStream = bodyToNodeStream(response.body); + return { + ...response, + isBase64Encoded: true, + body: await nodeStreamToBase64(nodeStream), + }; + } } if (response instanceof Response) { return await webResponseToProxyResult(response); @@ -203,9 +268,43 @@ const handlerResultToProxyResult = async ( }; }; +/** + * Converts various body types to a Node.js Readable stream. + * Handles Node.js streams, web streams, and string bodies. + * + * @param body - The body to convert (Readable, ReadableStream, or string) + * @returns A Node.js Readable stream + */ +const bodyToNodeStream = (body: ExtendedAPIGatewayProxyResultBody) => { + if (isNodeReadableStream(body)) { + return body; + } + if (isWebReadableStream(body)) { + return Readable.fromWeb(body as streamWeb.ReadableStream); + } + return Readable.from(Buffer.from(body as string)); +}; + +/** + * Converts a Node.js Readable stream to a base64 encoded string. + * Handles both Buffer and string chunks by converting all to Buffers. + * + * @param stream - The Node.js Readable stream to convert + * @returns A Promise that resolves to a base64 encoded string + */ +async function nodeStreamToBase64(stream: Readable) { + const chunks: Buffer[] = []; + for await (const chunk of stream) { + chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)); + } + return Buffer.concat(chunks).toString('base64'); +} + export { proxyEventToWebRequest, webResponseToProxyResult, handlerResultToWebResponse, handlerResultToProxyResult, + bodyToNodeStream, + webHeadersToApiGatewayV1Headers, }; diff --git a/packages/event-handler/src/rest/index.ts b/packages/event-handler/src/rest/index.ts index 2a4d605ea4..95df1e226e 100644 --- a/packages/event-handler/src/rest/index.ts +++ b/packages/event-handler/src/rest/index.ts @@ -23,6 +23,6 @@ export { Router } from './Router.js'; export { composeMiddleware, isAPIGatewayProxyEvent, - isAPIGatewayProxyResult, + isExtendedAPIGatewayProxyResult, isHttpMethod, } from './utils.js'; diff --git a/packages/event-handler/src/rest/utils.ts b/packages/event-handler/src/rest/utils.ts index ca41f0a5a7..b0943d3e4f 100644 --- a/packages/event-handler/src/rest/utils.ts +++ b/packages/event-handler/src/rest/utils.ts @@ -1,11 +1,14 @@ +import { Readable, Writable } from 'node:stream'; import { isRecord, isString } from '@aws-lambda-powertools/commons/typeutils'; -import type { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; +import type { APIGatewayProxyEvent } from 'aws-lambda'; import type { CompiledRoute, + ExtendedAPIGatewayProxyResult, HandlerResponse, HttpMethod, Middleware, Path, + ResponseStream, ValidationResult, } from '../types/rest.js'; import { @@ -92,6 +95,28 @@ export const isHttpMethod = (method: string): method is HttpMethod => { return Object.keys(HttpVerbs).includes(method); }; +export const isNodeReadableStream = (value: unknown): value is Readable => { + return ( + value != null && + typeof value === 'object' && + value instanceof Readable && + 'readable' in value && + 'read' in value && + typeof value.read === 'function' + ); +}; + +export const isWebReadableStream = ( + value: unknown +): value is ReadableStream => { + return ( + value != null && + typeof value === 'object' && + 'getReader' in value && + typeof (value as Record).getReader === 'function' + ); +}; + /** * Type guard to check if the provided result is an API Gateway Proxy result. * @@ -100,13 +125,15 @@ export const isHttpMethod = (method: string): method is HttpMethod => { * * @param result - The result to check */ -export const isAPIGatewayProxyResult = ( +export const isExtendedAPIGatewayProxyResult = ( result: unknown -): result is APIGatewayProxyResult => { +): result is ExtendedAPIGatewayProxyResult => { if (!isRecord(result)) return false; return ( typeof result.statusCode === 'number' && - isString(result.body) && + (isString(result.body) || + isNodeReadableStream(result.body) || + isWebReadableStream(result.body)) && (result.headers === undefined || isRecord(result.headers)) && (result.multiValueHeaders === undefined || isRecord(result.multiValueHeaders)) && @@ -209,3 +236,36 @@ export const resolvePrefixedPath = (path: Path, prefix?: Path): Path => { } return path; }; + +export const HttpResponseStream = + globalThis.awslambda?.HttpResponseStream ?? + class LocalHttpResponseStream extends Writable { + #contentType: string | undefined; + + setContentType(contentType: string) { + this.#contentType = contentType; + } + + static from( + underlyingStream: ResponseStream, + prelude: Record + ) { + underlyingStream.setContentType( + "'application/vnd.awslambda.http-integration-response'" + ); + + // JSON.stringify is required. NULL byte is not allowed in metadataPrelude. + const metadataPrelude = JSON.stringify(prelude); + + underlyingStream._onBeforeFirstWrite = ( + write: (data: Uint8Array | string) => void + ) => { + write(metadataPrelude); + + // Write 8 null bytes after the JSON prelude. + write(new Uint8Array(8)); + }; + + return underlyingStream; + } + }; diff --git a/packages/event-handler/src/types/common.ts b/packages/event-handler/src/types/common.ts index 8efc28bf51..58e675e41d 100644 --- a/packages/event-handler/src/types/common.ts +++ b/packages/event-handler/src/types/common.ts @@ -1,6 +1,3 @@ -import type { AppSyncEventsResolver } from '../appsync-events/AppSyncEventsResolver.js'; -import type { AppSyncGraphQLResolver } from '../appsync-graphql/AppSyncGraphQLResolver.js'; - // biome-ignore lint/suspicious/noExplicitAny: We intentionally use `any` here to represent any type of data and keep the logger is as flexible as possible. type Anything = any; diff --git a/packages/event-handler/src/types/rest.ts b/packages/event-handler/src/types/rest.ts index b7a0d2e21e..ae7f9f8d5f 100644 --- a/packages/event-handler/src/types/rest.ts +++ b/packages/event-handler/src/types/rest.ts @@ -1,11 +1,16 @@ +import type { Readable } from 'node:stream'; import type { GenericLogger, JSONObject, } from '@aws-lambda-powertools/commons/types'; -import type { APIGatewayProxyEvent, Context } from 'aws-lambda'; +import type { + APIGatewayProxyEvent, + APIGatewayProxyResult, + Context, +} from 'aws-lambda'; import type { HttpStatusCodes, HttpVerbs } from '../rest/constants.js'; import type { Route } from '../rest/Route.js'; -import type { Router } from '../rest/Router.js'; +import type { HttpResponseStream } from '../rest/utils.js'; import type { ResolveOptions } from './common.js'; type RequestContext = { @@ -54,7 +59,13 @@ interface CompiledRoute { type DynamicRoute = Route & CompiledRoute; -type HandlerResponse = Response | JSONObject; +type ExtendedAPIGatewayProxyResultBody = string | Readable | ReadableStream; + +type ExtendedAPIGatewayProxyResult = Omit & { + body: ExtendedAPIGatewayProxyResultBody; +}; + +type HandlerResponse = Response | JSONObject | ExtendedAPIGatewayProxyResult; type RouteHandler = ( reqCtx: RequestContext @@ -111,6 +122,51 @@ type ValidationResult = { issues: string[]; }; +type ResponseStream = InstanceType & { + _onBeforeFirstWrite?: (write: (data: Uint8Array | string) => void) => void; +}; + +/** + * Object to pass to the {@link Router.resolveStream | `Router.resolveStream()`} method. + */ +type ResolveStreamOptions = { + /** + * Reference to `this` instance of the class that is calling the `resolveStream` method. + * + * This parameter should be used only when using {@link Router} route decorators like + * {@link Router.get | `Router.get()`}, {@link Router.post | `Router.post()`}, etc. as class method decorators, and + * it's used to bind the decorated methods to your class instance. + * + * @example + * ```ts + * import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest'; + * + * const app = new Router(); + * + * class Lambda { + * public scope = 'scoped'; + * + * @app.get('/test') + * public async getTest() { + * return { message: `${this.scope}: success` }; + * } + * + * public async handler(event: unknown, context: Context, responseStream: ResponseStream) { + * return app.resolveStream(event, context, { scope: this, responseStream }); + * } + * } + * const lambda = new Lambda(); + * const handler = lambda.handler.bind(lambda); + * ``` + */ + scope?: unknown; + /** + * The Lambda response stream used for streaming responses directly to the client. + * This stream is provided by the AWS Lambda runtime for response streaming. + */ + responseStream: ResponseStream; +}; + /** * Configuration options for CORS middleware */ @@ -159,6 +215,8 @@ type CompressionOptions = { }; export type { + ExtendedAPIGatewayProxyResult, + ExtendedAPIGatewayProxyResultBody, CompiledRoute, CorsOptions, DynamicRoute, @@ -174,6 +232,8 @@ export type { RequestContext, RestRouterOptions, RouteHandler, + ResolveStreamOptions, + ResponseStream, RestRouteOptions, RestRouteHandlerOptions, RouteRegistryOptions, diff --git a/packages/event-handler/tests/unit/rest/Router/decorators.test.ts b/packages/event-handler/tests/unit/rest/Router/decorators.test.ts index 98c0ab7c5b..c08914b55d 100644 --- a/packages/event-handler/tests/unit/rest/Router/decorators.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/decorators.test.ts @@ -7,9 +7,27 @@ import { MethodNotAllowedError, type NotFoundError, Router, + UnauthorizedError, } from '../../../../src/rest/index.js'; import type { RequestContext } from '../../../../src/types/rest.js'; -import { createTestEvent, createTrackingMiddleware } from '../helpers.js'; +import { + createTestEvent, + createTrackingMiddleware, + MockResponseStream, + parseStreamOutput, +} from '../helpers.js'; + +const createHandler = (app: Router) => (event: unknown, _context: Context) => + app.resolve(event, _context); + +const createHandlerWithScope = + (app: Router, scope: unknown) => (event: unknown, _context: Context) => + app.resolve(event, _context, { scope }); + +const createStreamHandler = + (app: Router, scope: unknown) => + (event: unknown, _context: Context, responseStream: MockResponseStream) => + app.resolveStream(event, _context, { scope, responseStream }); describe('Class: Router - Decorators', () => { describe('decorators', () => { @@ -51,9 +69,7 @@ describe('Class: Router - Decorators', () => { return { result: 'options-test' }; } - public handler(event: unknown, _context: Context) { - return app.resolve(event, _context); - } + public handler = createHandler(app); } it.each([ @@ -101,9 +117,7 @@ describe('Class: Router - Decorators', () => { return { result: `${this.scope}: decorator-with-middleware` }; } - public handler(event: unknown, _context: Context) { - return app.resolve(event, _context, { scope: this }); - } + public handler = createHandlerWithScope(app, this); } const lambda = new Lambda(); @@ -183,9 +197,7 @@ describe('Class: Router - Decorators', () => { return { result: 'options-decorator-middleware' }; } - public handler(event: unknown, _context: Context) { - return app.resolve(event, _context); - } + public handler = createHandler(app); } const lambda = new Lambda(); @@ -231,9 +243,7 @@ describe('Class: Router - Decorators', () => { throw new BadRequestError('test error'); } - public handler(event: unknown, _context: Context) { - return app.resolve(event, _context); - } + public handler = createHandler(app); } const lambda = new Lambda(); @@ -273,9 +283,7 @@ describe('Class: Router - Decorators', () => { }; } - public handler(event: unknown, _context: Context) { - return app.resolve(event, _context, { scope: this }); - } + public handler = createHandlerWithScope(app, this); } const lambda = new Lambda(); @@ -319,9 +327,7 @@ describe('Class: Router - Decorators', () => { throw new MethodNotAllowedError('POST not allowed'); } - public handler(event: unknown, _context: Context) { - return app.resolve(event, _context); - } + public handler = createHandler(app); } const lambda = new Lambda(); @@ -366,9 +372,7 @@ describe('Class: Router - Decorators', () => { throw new BadRequestError('test error'); } - public handler(event: unknown, _context: Context) { - return app.resolve(event, _context, { scope: this }); - } + public handler = createHandlerWithScope(app, this); } const lambda = new Lambda(); @@ -407,9 +411,7 @@ describe('Class: Router - Decorators', () => { }; } - public handler(event: unknown, _context: Context) { - return app.resolve(event, _context); - } + public handler = createHandler(app); } const lambda = new Lambda(); @@ -450,9 +452,7 @@ describe('Class: Router - Decorators', () => { throw new BadRequestError('test error'); } - public handler(event: unknown, _context: Context) { - return app.resolve(event, _context); - } + public handler = createHandler(app); } const lambda = new Lambda(); @@ -481,9 +481,7 @@ describe('Class: Router - Decorators', () => { }; } - public handler(event: unknown, _context: Context) { - return app.resolve(event, _context, { scope: this }); - } + public handler = createHandlerWithScope(app, this); } const lambda = new Lambda(); @@ -503,4 +501,79 @@ describe('Class: Router - Decorators', () => { }); }); }); + + describe('streaming with decorators', () => { + it('preserves scope when using resolveStream with decorators', async () => { + // Prepare + const app = new Router(); + + class Lambda { + public scope = 'streaming-scope'; + + @app.get('/test') + public getTest() { + return { + message: `${this.scope}: streaming success`, + }; + } + + public handler = createStreamHandler(app, this); + } + + const lambda = new Lambda(); + const responseStream = new MockResponseStream(); + const handler = lambda.handler.bind(lambda); + + // Act + await handler(createTestEvent('/test', 'GET'), context, responseStream); + + // Assess + const { prelude, body } = parseStreamOutput(responseStream.chunks); + expect(prelude.statusCode).toBe(200); + expect(JSON.parse(body)).toEqual({ + message: 'streaming-scope: streaming success', + }); + }); + + it('preserves scope when handler throws error in streaming', async () => { + // Prepare + const app = new Router(); + + class Lambda { + public scope = 'error-scope'; + + @app.errorHandler(UnauthorizedError) + public handleUnauthorized(error: UnauthorizedError) { + return { + statusCode: HttpStatusCodes.UNAUTHORIZED, + error: 'Unauthorized', + message: `${this.scope}: ${error.message}`, + }; + } + + @app.get('/test') + public getTest() { + throw new UnauthorizedError('UnauthorizedError!'); + } + + public handler = createStreamHandler(app, this); + } + + const lambda = new Lambda(); + const responseStream = new MockResponseStream(); + const handler = lambda.handler.bind(lambda); + + // Act + await handler(createTestEvent('/test', 'GET'), context, responseStream); + + // Assess + const { prelude, body } = parseStreamOutput(responseStream.chunks); + expect(prelude.statusCode).toBe(401); + expect(JSON.parse(body)).toEqual({ + statusCode: HttpStatusCodes.UNAUTHORIZED, + error: 'Unauthorized', + message: 'error-scope: UnauthorizedError!', + }); + }); + }); }); diff --git a/packages/event-handler/tests/unit/rest/Router/middleware.test.ts b/packages/event-handler/tests/unit/rest/Router/middleware.test.ts index 93b6abc230..bcdc41c16b 100644 --- a/packages/event-handler/tests/unit/rest/Router/middleware.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/middleware.test.ts @@ -1,3 +1,4 @@ +import { Readable } from 'node:stream'; import context from '@aws-lambda-powertools/testing-utils/context'; import type { Context } from 'aws-lambda'; import { describe, expect, it, vi } from 'vitest'; @@ -190,7 +191,8 @@ describe('Class: Router - Middleware', () => { await next(); }); - app.use(({ next }) => { + // biome-ignore lint/suspicious/useAwait: This specifically tests a missing await call in an async function + app.use(async ({ next }) => { next(); }); @@ -572,6 +574,60 @@ describe('Class: Router - Middleware', () => { isBase64Encoded: false, }); }); + + it('handles middleware returning ExtendedAPIGatewayProxyResult with node stream body', async () => { + // Prepare + const app = new Router(); + const testData = 'middleware stream data'; + + app.use(async () => ({ + statusCode: 200, + body: Readable.from(Buffer.from(testData)), + })); + + app.get('/test', () => ({ success: true })); + + // Act + const result = await app.resolve( + createTestEvent('/test', 'GET'), + context + ); + + // Assess + expect(result.statusCode).toBe(200); + expect(result.isBase64Encoded).toBe(true); + expect(result.body).toBe(Buffer.from(testData).toString('base64')); + }); + + it('handles middleware returning ExtendedAPIGatewayProxyResult with web stream body', async () => { + // Prepare + const app = new Router(); + const testData = 'middleware web stream data'; + const webStream = new ReadableStream({ + start(controller) { + controller.enqueue(new TextEncoder().encode(testData)); + controller.close(); + }, + }); + + app.use(async () => ({ + statusCode: 200, + body: webStream, + })); + + app.get('/test', () => ({ success: true })); + + // Act + const result = await app.resolve( + createTestEvent('/test', 'GET'), + context + ); + + // Assess + expect(result.statusCode).toBe(200); + expect(result.isBase64Encoded).toBe(true); + expect(result.body).toBe(Buffer.from(testData).toString('base64')); + }); }); describe('middleware - route specific', () => { diff --git a/packages/event-handler/tests/unit/rest/Router/streaming.test.ts b/packages/event-handler/tests/unit/rest/Router/streaming.test.ts new file mode 100644 index 0000000000..16a172b4df --- /dev/null +++ b/packages/event-handler/tests/unit/rest/Router/streaming.test.ts @@ -0,0 +1,309 @@ +import { Readable } from 'node:stream'; +import context from '@aws-lambda-powertools/testing-utils/context'; +import { describe, expect, it, vi } from 'vitest'; +import { UnauthorizedError } from '../../../../src/rest/errors.js'; +import { Router } from '../../../../src/rest/index.js'; +import { + createTestEvent, + MockResponseStream, + parseStreamOutput, +} from '../helpers.js'; + +describe('Class: Router - Streaming', () => { + it('streams a simple JSON response', async () => { + // Prepare + const app = new Router(); + app.get('/test', async () => ({ message: 'Hello, World!' })); + + // Create a mock ResponseStream + const responseStream = new MockResponseStream(); + + // Act + await app.resolveStream(createTestEvent('/test', 'GET'), context, { + responseStream, + }); + + // Assess + const { prelude, body } = parseStreamOutput(responseStream.chunks); + expect(prelude.statusCode).toBe(200); + expect(JSON.parse(body)).toEqual({ message: 'Hello, World!' }); + }); + + it('streams a Response object', async () => { + // Prepare + const app = new Router(); + app.get('/test', () => { + return new Response(JSON.stringify({ data: 'test' }), { + status: 201, + headers: { 'Content-Type': 'application/json' }, + }); + }); + + // Create a mock ResponseStream + const responseStream = new MockResponseStream(); + + // Act + await app.resolveStream(createTestEvent('/test', 'GET'), context, { + responseStream, + }); + + // Assess + const { prelude, body } = parseStreamOutput(responseStream.chunks); + expect(prelude.statusCode).toBe(201); + expect(JSON.parse(body)).toEqual({ data: 'test' }); + }); + + it('handles route not found', async () => { + // Prepare + const app = new Router(); + const responseStream = new MockResponseStream(); + + // Act + await app.resolveStream(createTestEvent('/nonexistent', 'GET'), context, { + responseStream, + }); + + // Assess + const { prelude, body } = parseStreamOutput(responseStream.chunks); + expect(prelude.statusCode).toBe(404); + const parsedBody = JSON.parse(body); + expect(parsedBody.statusCode).toBe(404); + }); + + it('works with middleware', async () => { + // Prepare + const app = new Router(); + + // Add middleware that modifies the response + app.use(async ({ reqCtx, next }) => { + await next(); + reqCtx.res.headers.set('X-Custom-Header', 'test-value'); + }); + + app.get('/test', () => ({ message: 'middleware test' })); + + const responseStream = new MockResponseStream(); + + // Act + await app.resolveStream(createTestEvent('/test', 'GET'), context, { + responseStream, + }); + + // Assess + const { prelude, body } = parseStreamOutput(responseStream.chunks); + expect(prelude.statusCode).toBe(200); + expect(prelude.headers['x-custom-header']).toBe('test-value'); + expect(JSON.parse(body)).toEqual({ message: 'middleware test' }); + }); + + it('handles thrown errors', async () => { + // Prepare + const app = new Router(); + app.get('/test', () => { + throw new UnauthorizedError('Access denied'); + }); + + const responseStream = new MockResponseStream(); + + // Act + await app.resolveStream(createTestEvent('/test', 'GET'), context, { + responseStream, + }); + + // Assess + const { prelude, body } = parseStreamOutput(responseStream.chunks); + expect(prelude.statusCode).toBe(401); + const parsedBody = JSON.parse(body); + expect(parsedBody.message).toBe('Access denied'); + }); + + it('works with error handlers', async () => { + // Prepare + const app = new Router(); + + app.errorHandler(UnauthorizedError, async (error) => ({ + statusCode: 401, + message: `Custom: ${error.message}`, + })); + + app.get('/test', () => { + throw new UnauthorizedError('handler error'); + }); + + const responseStream = new MockResponseStream(); + + // Act + await app.resolveStream(createTestEvent('/test', 'GET'), context, { + responseStream, + }); + + // Assess + const { prelude, body } = parseStreamOutput(responseStream.chunks); + expect(prelude.statusCode).toBe(401); + expect(JSON.parse(body)).toEqual({ + statusCode: 401, + message: 'Custom: handler error', + }); + }); + + it.each([ + [ + 'string body', + () => ({ statusCode: 200, body: '{"message":"string body"}' }), + ], + [ + 'node stream body', + () => ({ + statusCode: 200, + body: Readable.from(Buffer.from('{"message":"node stream body"}')), + }), + ], + [ + 'web stream body', + () => ({ + statusCode: 200, + body: new ReadableStream({ + start(controller) { + controller.enqueue( + new TextEncoder().encode('{"message":"web stream body"}') + ); + controller.close(); + }, + }), + }), + ], + ])('handles ExtendedAPIGatewayProxyResult with %s', async (_, handlerFn) => { + // Prepare + const app = new Router(); + app.get('/test', handlerFn); + const responseStream = new MockResponseStream(); + + // Act + await app.resolveStream(createTestEvent('/test', 'GET'), context, { + responseStream, + }); + + // Assess + const { prelude, body } = parseStreamOutput(responseStream.chunks); + expect(prelude.statusCode).toBe(200); + expect(JSON.parse(body).message).toMatch(/body$/); + }); + + it('handles Response with no body', async () => { + // Prepare + const app = new Router(); + app.get('/test', () => new Response(null, { status: 204 })); + const responseStream = new MockResponseStream(); + + // Act + await app.resolveStream(createTestEvent('/test', 'GET'), context, { + responseStream, + }); + + // Assess + const { prelude, body } = parseStreamOutput(responseStream.chunks); + expect(prelude.statusCode).toBe(204); + expect(body).toBe(''); + }); + + it('handles Response with undefined body', async () => { + // Prepare + const app = new Router(); + app.get('/test', () => new Response(undefined, { status: 200 })); + const responseStream = new MockResponseStream(); + + // Act + await app.resolveStream(createTestEvent('/test', 'GET'), context, { + responseStream, + }); + + // Assess + const { prelude, body } = parseStreamOutput(responseStream.chunks); + expect(prelude.statusCode).toBe(200); + expect(body).toBe(''); + }); + + it('handles pipeline errors during streaming', async () => { + // Prepare + const app = new Router(); + const errorStream = new ReadableStream({ + start(controller) { + controller.error(new Error('Stream error')); + }, + }); + + app.get('/test', () => new Response(errorStream, { status: 200 })); + const responseStream = new MockResponseStream(); + + // Act & Assess + await expect( + app.resolveStream(createTestEvent('/test', 'GET'), context, { + responseStream, + }) + ).rejects.toThrow('Stream error'); + }); + + it('extracts route parameters correctly', async () => { + // Prepare + const app = new Router(); + let capturedParams: Record = {}; + + app.get('/users/:userId/posts/:postId', ({ params }) => { + capturedParams = params; + return { userId: params.userId, postId: params.postId }; + }); + + const responseStream = new MockResponseStream(); + + // Act + await app.resolveStream( + createTestEvent('/users/123/posts/456', 'GET'), + context, + { responseStream } + ); + + // Assess + const { prelude, body } = parseStreamOutput(responseStream.chunks); + expect(prelude.statusCode).toBe(200); + expect(capturedParams).toEqual({ userId: '123', postId: '456' }); + expect(JSON.parse(body)).toEqual({ userId: '123', postId: '456' }); + }); + + it('uses default error handler for unregistered errors', async () => { + // Prepare + vi.stubEnv('POWERTOOLS_DEV', 'true'); + const app = new Router(); + app.get('/test', () => { + throw new Error('Unhandled error'); + }); + + const responseStream = new MockResponseStream(); + + // Act + await app.resolveStream(createTestEvent('/test', 'GET'), context, { + responseStream, + }); + + // Assess + const { prelude, body } = parseStreamOutput(responseStream.chunks); + expect(prelude.statusCode).toBe(500); + const parsedBody = JSON.parse(body); + expect(parsedBody.statusCode).toBe(500); + expect(parsedBody.error).toBe('Internal Server Error'); + expect(parsedBody.message).toBe('Unhandled error'); + expect(parsedBody.stack).toBeDefined(); + expect(parsedBody.details).toEqual({ errorName: 'Error' }); + }); + + it('throws InternalServerError for invalid events', async () => { + // Prepare + const app = new Router(); + const invalidEvent = { invalid: 'event' }; + const responseStream = new MockResponseStream(); + + // Act & Assess + await expect( + app.resolveStream(invalidEvent, context, { responseStream }) + ).rejects.toThrow(); + }); +}); diff --git a/packages/event-handler/tests/unit/rest/converters.test.ts b/packages/event-handler/tests/unit/rest/converters.test.ts index e6f5a9a893..41be5e7d69 100644 --- a/packages/event-handler/tests/unit/rest/converters.test.ts +++ b/packages/event-handler/tests/unit/rest/converters.test.ts @@ -1,4 +1,6 @@ +import { Readable } from 'node:stream'; import { describe, expect, it } from 'vitest'; +import { bodyToNodeStream } from '../../../src/rest/converters.js'; import { handlerResultToProxyResult, handlerResultToWebResponse, @@ -458,7 +460,7 @@ describe('Converters', () => { }); describe('handlerResultToProxyResult', () => { - it('returns APIGatewayProxyResult as-is', async () => { + it('returns ExtendedAPIGatewayProxyResult with string body as-is', async () => { // Prepare const proxyResult = { statusCode: 200, @@ -471,7 +473,88 @@ describe('Converters', () => { const result = await handlerResultToProxyResult(proxyResult); // Assess - expect(result).toBe(proxyResult); + expect(result).toEqual({ + statusCode: 200, + body: 'test', + headers: { 'content-type': 'text/plain' }, + isBase64Encoded: false, + }); + }); + + it('converts ExtendedAPIGatewayProxyResult with Node.js Buffer stream body to base64', async () => { + // Prepare + const stream = Readable.from([ + Buffer.from('Hello'), + Buffer.from(' '), + Buffer.from('World'), + ]); + const proxyResult = { + statusCode: 200, + body: stream, + headers: { 'content-type': 'application/octet-stream' }, + isBase64Encoded: false, + }; + + // Act + const result = await handlerResultToProxyResult(proxyResult); + + // Assess + expect(result.statusCode).toBe(200); + expect(result.isBase64Encoded).toBe(true); + expect(result.body).toBe(Buffer.from('Hello World').toString('base64')); + expect(result.headers).toEqual({ + 'content-type': 'application/octet-stream', + }); + }); + + it('converts ExtendedAPIGatewayProxyResult with Node.js string stream body to base64', async () => { + // Prepare + const stream = Readable.from(['Hello', ' ', 'World']); + const proxyResult = { + statusCode: 200, + body: stream, + headers: { 'content-type': 'application/octet-stream' }, + isBase64Encoded: false, + }; + + // Act + const result = await handlerResultToProxyResult(proxyResult); + + // Assess + expect(result.statusCode).toBe(200); + expect(result.isBase64Encoded).toBe(true); + expect(result.body).toBe(Buffer.from('Hello World').toString('base64')); + expect(result.headers).toEqual({ + 'content-type': 'application/octet-stream', + }); + }); + + it('converts ExtendedAPIGatewayProxyResult with web stream body to base64', async () => { + // Prepare + const webStream = new ReadableStream({ + start(controller) { + controller.enqueue(new TextEncoder().encode('Hello')); + controller.enqueue(new TextEncoder().encode(' World')); + controller.close(); + }, + }); + const proxyResult = { + statusCode: 200, + body: webStream, + headers: { 'content-type': 'application/octet-stream' }, + isBase64Encoded: false, + }; + + // Act + const result = await handlerResultToProxyResult(proxyResult); + + // Assess + expect(result.statusCode).toBe(200); + expect(result.isBase64Encoded).toBe(true); + expect(result.body).toBe(Buffer.from('Hello World').toString('base64')); + expect(result.headers).toEqual({ + 'content-type': 'application/octet-stream', + }); }); it('converts Response object', async () => { @@ -642,4 +725,50 @@ describe('Converters', () => { expect(result.text()).resolves.toBe('Hello'); }); }); + + describe('bodyToNodeStream', () => { + it('returns Node.js Readable stream as-is', () => { + // Prepare + const nodeStream = Readable.from(['Hello World']); + + // Act + const result = bodyToNodeStream(nodeStream); + + // Assess + expect(result).toBe(nodeStream); + }); + + it('converts Web ReadableStream to Node.js Readable stream', () => { + // Prepare + const webStream = new ReadableStream({ + start(controller) { + controller.enqueue(new TextEncoder().encode('Hello World')); + controller.close(); + }, + }); + + // Act + const result = bodyToNodeStream(webStream); + + // Assess + expect(result).toBeInstanceOf(Readable); + }); + + it('converts string body to Node.js Readable stream', async () => { + // Prepare + const stringBody = 'Hello World'; + + // Act + const stream = bodyToNodeStream(stringBody); + + // Assess + expect(stream).toBeInstanceOf(Readable); + const chunks: Buffer[] = []; + for await (const chunk of stream) { + chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)); + } + const result = Buffer.concat(chunks).toString(); + expect(result).toBe('Hello World'); + }); + }); }); diff --git a/packages/event-handler/tests/unit/rest/helpers.ts b/packages/event-handler/tests/unit/rest/helpers.ts index aeb4e51c2d..1a6163e763 100644 --- a/packages/event-handler/tests/unit/rest/helpers.ts +++ b/packages/event-handler/tests/unit/rest/helpers.ts @@ -1,4 +1,5 @@ import type { APIGatewayProxyEvent } from 'aws-lambda'; +import { HttpResponseStream } from '../../../src/rest/utils.js'; import type { HandlerResponse, Middleware } from '../../../src/types/rest.js'; export const createTestEvent = ( @@ -53,7 +54,7 @@ export const createReturningMiddleware = ( ): Middleware => { return () => { executionOrder.push(name); - return response; + return Promise.resolve(response); }; }; @@ -63,6 +64,7 @@ export const createNoNextMiddleware = ( ): Middleware => { return () => { executionOrder.push(name); + return Promise.resolve(); // Intentionally doesn't call next() }; }; @@ -88,3 +90,42 @@ export const createHeaderCheckMiddleware = (headers: { await next(); }; }; + +// Mock ResponseStream that extends the actual ResponseStream class +export class MockResponseStream extends HttpResponseStream { + public chunks: Buffer[] = []; + public _onBeforeFirstWrite?: ( + write: (data: Uint8Array | string) => void + ) => void; + #firstWrite = true; + + _write(chunk: Buffer, _encoding: string, callback: () => void): void { + if (this.#firstWrite && this._onBeforeFirstWrite) { + this._onBeforeFirstWrite((data: Uint8Array | string) => { + this.chunks.push(Buffer.from(data)); + }); + this.#firstWrite = false; + } + this.chunks.push(chunk); + callback(); + } +} + +// Helper to parse streaming response format +export function parseStreamOutput(chunks: Buffer[]) { + const output = Buffer.concat(chunks); + const nullBytes = Buffer.from([0, 0, 0, 0, 0, 0, 0, 0]); + const separatorIndex = output.indexOf(nullBytes); + + if (separatorIndex === -1) { + return { prelude: null, body: output.toString() }; + } + + const preludeBuffer = output.subarray(0, separatorIndex); + const bodyBuffer = output.subarray(separatorIndex + 8); + + return { + prelude: JSON.parse(preludeBuffer.toString()), + body: bodyBuffer.toString(), + }; +} diff --git a/packages/event-handler/tests/unit/rest/utils.test.ts b/packages/event-handler/tests/unit/rest/utils.test.ts index 927fae01eb..478b7225bb 100644 --- a/packages/event-handler/tests/unit/rest/utils.test.ts +++ b/packages/event-handler/tests/unit/rest/utils.test.ts @@ -3,11 +3,11 @@ import type { APIGatewayProxyResult, Context, } from 'aws-lambda'; -import { describe, expect, it } from 'vitest'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { composeMiddleware, isAPIGatewayProxyEvent, - isAPIGatewayProxyResult, + isExtendedAPIGatewayProxyResult, } from '../../../src/rest/index.js'; import { compilePath, @@ -21,6 +21,9 @@ import type { } from '../../../src/types/rest.js'; describe('Path Utilities', () => { + beforeEach(() => { + vi.unstubAllGlobals(); + }); describe('validatePathPattern', () => { it.each([ { path: '/users/:id', expected: true, issues: [] }, @@ -390,7 +393,7 @@ describe('Path Utilities', () => { body: 'Hello World', }; - expect(isAPIGatewayProxyResult(validResult)).toBe(true); + expect(isExtendedAPIGatewayProxyResult(validResult)).toBe(true); }); it('should return true for valid result with all optional fields', () => { @@ -402,7 +405,7 @@ describe('Path Utilities', () => { isBase64Encoded: false, }; - expect(isAPIGatewayProxyResult(validResult)).toBe(true); + expect(isExtendedAPIGatewayProxyResult(validResult)).toBe(true); }); it.each([ @@ -412,7 +415,7 @@ describe('Path Utilities', () => { { case: 'number', result: 123 }, { case: 'array', result: [] }, ])('should return false for $case', ({ result }) => { - expect(isAPIGatewayProxyResult(result)).toBe(false); + expect(isExtendedAPIGatewayProxyResult(result)).toBe(false); }); it.each([ @@ -432,7 +435,7 @@ describe('Path Utilities', () => { }; const invalidResult = { ...baseResult, [field]: value }; - expect(isAPIGatewayProxyResult(invalidResult)).toBe(false); + expect(isExtendedAPIGatewayProxyResult(invalidResult)).toBe(false); } ); @@ -442,7 +445,7 @@ describe('Path Utilities', () => { // missing body }; - expect(isAPIGatewayProxyResult(incompleteResult)).toBe(false); + expect(isExtendedAPIGatewayProxyResult(incompleteResult)).toBe(false); }); }); @@ -475,6 +478,7 @@ describe('Path Utilities', () => { reqCtx: mockOptions, next: () => { executionOrder.push('handler'); + return Promise.resolve(); }, }); @@ -493,7 +497,7 @@ describe('Path Utilities', () => { await next(); }, () => { - return { shortCircuit: true }; + return Promise.resolve({ shortCircuit: true }); }, ]; @@ -501,7 +505,7 @@ describe('Path Utilities', () => { const result = await composed({ reqCtx: mockOptions, next: () => { - return { handler: true }; + return Promise.resolve({ handler: true }); }, }); @@ -519,7 +523,7 @@ describe('Path Utilities', () => { const result = await composed({ reqCtx: mockOptions, next: () => { - return { handler: true }; + return Promise.resolve({ handler: true }); }, }); @@ -546,7 +550,7 @@ describe('Path Utilities', () => { const result = await composed({ reqCtx: mockOptions, next: () => { - return { handler: true }; + return Promise.resolve({ handler: true }); }, }); @@ -564,7 +568,7 @@ describe('Path Utilities', () => { const result = await composed({ reqCtx: mockOptions, next: () => { - return undefined; + return Promise.resolve(undefined); }, }); @@ -585,4 +589,21 @@ describe('Path Utilities', () => { expect(resolvedPath).toBe(expected); }); }); + + describe('HttpResponseStream', () => { + it('uses globalThis.awslambda.HttpResponseStream when available', async () => { + // Prepare + const mockHttpResponseStream = { from: vi.fn() }; + vi.stubGlobal('awslambda', { + HttpResponseStream: mockHttpResponseStream, + }); + + // Clear module cache and dynamically import + vi.resetModules(); + const { HttpResponseStream } = await import('../../../src/rest/utils.js'); + + // Assert + expect(HttpResponseStream).toBe(mockHttpResponseStream); + }); + }); }); From 62c67ca9b33beb9ac92b4deea31f5602baf94914 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:07:42 +0200 Subject: [PATCH 200/255] chore(deps): bump ossf/scorecard-action from 2.4.2 to 2.4.3 (#4597) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi --- .github/workflows/ossf_scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ossf_scorecard.yml b/.github/workflows/ossf_scorecard.yml index 2ce47b2d77..13de519d6e 100644 --- a/.github/workflows/ossf_scorecard.yml +++ b/.github/workflows/ossf_scorecard.yml @@ -27,7 +27,7 @@ jobs: persist-credentials: false - name: "Run analysis" - uses: ossf/scorecard-action@05b42c624433fc40578a4040d5cf5e36ddca8cde # v2.4.2 + uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3 with: results_file: results.sarif results_format: sarif From fd2d0820f34863f3705f93192a8008e49eba8cf0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:23:49 +0200 Subject: [PATCH 201/255] chore(deps-dev): bump @biomejs/biome from 2.2.4 to 2.2.5 (#4604) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi --- package-lock.json | 72 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/package-lock.json b/package-lock.json index e2c21cb6b5..a1b24649a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,7 @@ "packages/kafka" ], "devDependencies": { - "@biomejs/biome": "^2.2.4", + "@biomejs/biome": "^2.2.5", "@types/aws-lambda": "^8.10.152", "@types/node": "^24.6.0", "@vitest/coverage-v8": "^3.2.4", @@ -2939,9 +2939,9 @@ } }, "node_modules/@biomejs/biome": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.4.tgz", - "integrity": "sha512-TBHU5bUy/Ok6m8c0y3pZiuO/BZoY/OcGxoLlrfQof5s8ISVwbVBdFINPQZyFfKwil8XibYWb7JMwnT8wT4WVPg==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.5.tgz", + "integrity": "sha512-zcIi+163Rc3HtyHbEO7CjeHq8DjQRs40HsGbW6vx2WI0tg8mYQOPouhvHSyEnCBAorfYNnKdR64/IxO7xQ5faw==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -2955,20 +2955,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.2.4", - "@biomejs/cli-darwin-x64": "2.2.4", - "@biomejs/cli-linux-arm64": "2.2.4", - "@biomejs/cli-linux-arm64-musl": "2.2.4", - "@biomejs/cli-linux-x64": "2.2.4", - "@biomejs/cli-linux-x64-musl": "2.2.4", - "@biomejs/cli-win32-arm64": "2.2.4", - "@biomejs/cli-win32-x64": "2.2.4" + "@biomejs/cli-darwin-arm64": "2.2.5", + "@biomejs/cli-darwin-x64": "2.2.5", + "@biomejs/cli-linux-arm64": "2.2.5", + "@biomejs/cli-linux-arm64-musl": "2.2.5", + "@biomejs/cli-linux-x64": "2.2.5", + "@biomejs/cli-linux-x64-musl": "2.2.5", + "@biomejs/cli-win32-arm64": "2.2.5", + "@biomejs/cli-win32-x64": "2.2.5" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.4.tgz", - "integrity": "sha512-RJe2uiyaloN4hne4d2+qVj3d3gFJFbmrr5PYtkkjei1O9c+BjGXgpUPVbi8Pl8syumhzJjFsSIYkcLt2VlVLMA==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.5.tgz", + "integrity": "sha512-MYT+nZ38wEIWVcL5xLyOhYQQ7nlWD0b/4mgATW2c8dvq7R4OQjt/XGXFkXrmtWmQofaIM14L7V8qIz/M+bx5QQ==", "cpu": [ "arm64" ], @@ -2983,9 +2983,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.4.tgz", - "integrity": "sha512-cFsdB4ePanVWfTnPVaUX+yr8qV8ifxjBKMkZwN7gKb20qXPxd/PmwqUH8mY5wnM9+U0QwM76CxFyBRJhC9tQwg==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.5.tgz", + "integrity": "sha512-FLIEl73fv0R7dI10EnEiZLw+IMz3mWLnF95ASDI0kbx6DDLJjWxE5JxxBfmG+udz1hIDd3fr5wsuP7nwuTRdAg==", "cpu": [ "x64" ], @@ -3000,9 +3000,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.4.tgz", - "integrity": "sha512-M/Iz48p4NAzMXOuH+tsn5BvG/Jb07KOMTdSVwJpicmhN309BeEyRyQX+n1XDF0JVSlu28+hiTQ2L4rZPvu7nMw==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.5.tgz", + "integrity": "sha512-5DjiiDfHqGgR2MS9D+AZ8kOfrzTGqLKywn8hoXpXXlJXIECGQ32t+gt/uiS2XyGBM2XQhR6ztUvbjZWeccFMoQ==", "cpu": [ "arm64" ], @@ -3017,9 +3017,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.4.tgz", - "integrity": "sha512-7TNPkMQEWfjvJDaZRSkDCPT/2r5ESFPKx+TEev+I2BXDGIjfCZk2+b88FOhnJNHtksbOZv8ZWnxrA5gyTYhSsQ==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.5.tgz", + "integrity": "sha512-5Ov2wgAFwqDvQiESnu7b9ufD1faRa+40uwrohgBopeY84El2TnBDoMNXx6iuQdreoFGjwW8vH6k68G21EpNERw==", "cpu": [ "arm64" ], @@ -3034,9 +3034,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.4.tgz", - "integrity": "sha512-orr3nnf2Dpb2ssl6aihQtvcKtLySLta4E2UcXdp7+RTa7mfJjBgIsbS0B9GC8gVu0hjOu021aU8b3/I1tn+pVQ==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.5.tgz", + "integrity": "sha512-fq9meKm1AEXeAWan3uCg6XSP5ObA6F/Ovm89TwaMiy1DNIwdgxPkNwxlXJX8iM6oRbFysYeGnT0OG8diCWb9ew==", "cpu": [ "x64" ], @@ -3051,9 +3051,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.4.tgz", - "integrity": "sha512-m41nFDS0ksXK2gwXL6W6yZTYPMH0LughqbsxInSKetoH6morVj43szqKx79Iudkp8WRT5SxSh7qVb8KCUiewGg==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.5.tgz", + "integrity": "sha512-AVqLCDb/6K7aPNIcxHaTQj01sl1m989CJIQFQEaiQkGr2EQwyOpaATJ473h+nXDUuAcREhccfRpe/tu+0wu0eQ==", "cpu": [ "x64" ], @@ -3068,9 +3068,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.4.tgz", - "integrity": "sha512-NXnfTeKHDFUWfxAefa57DiGmu9VyKi0cDqFpdI+1hJWQjGJhJutHPX0b5m+eXvTKOaf+brU+P0JrQAZMb5yYaQ==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.5.tgz", + "integrity": "sha512-xaOIad4wBambwJa6mdp1FigYSIF9i7PCqRbvBqtIi9y29QtPVQ13sDGtUnsRoe6SjL10auMzQ6YAe+B3RpZXVg==", "cpu": [ "arm64" ], @@ -3085,9 +3085,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.4.tgz", - "integrity": "sha512-3Y4V4zVRarVh/B/eSHczR4LYoSVyv3Dfuvm3cWs5w/HScccS0+Wt/lHOcDTRYeHjQmMYVC3rIRWqyN2EI52+zg==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.5.tgz", + "integrity": "sha512-F/jhuXCssPFAuciMhHKk00xnCAxJRS/pUzVfXYmOMUp//XW7mO6QeCjsjvnm8L4AO/dG2VOB0O+fJPiJ2uXtIw==", "cpu": [ "x64" ], diff --git a/package.json b/package.json index 1c4988d7e5..2f7bea0ee6 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript#readme", "devDependencies": { - "@biomejs/biome": "^2.2.4", + "@biomejs/biome": "^2.2.5", "@types/aws-lambda": "^8.10.152", "@types/node": "^24.6.0", "@vitest/coverage-v8": "^3.2.4", From c96c95a0d24cb7bf1f227fe5c732bb3297051f20 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 23:08:58 +0100 Subject: [PATCH 202/255] chore(deps-dev): bump @redis/client from 5.8.2 to 5.8.3 (#4603) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/snippets/package.json | 2 +- package-lock.json | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/snippets/package.json b/examples/snippets/package.json index 4d781c60c7..5d99a62502 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -40,7 +40,7 @@ "@aws-sdk/client-ssm": "^3.896.0", "@aws-sdk/util-dynamodb": "^3.896.0", "@middy/core": "^4.7.0", - "@redis/client": "^5.8.2", + "@redis/client": "^5.8.3", "@valkey/valkey-glide": "^2.1.0", "aws-sdk": "^2.1692.0", "aws-sdk-client-mock": "^4.1.0", diff --git a/package-lock.json b/package-lock.json index a1b24649a1..37938b0e5b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -101,7 +101,7 @@ "@aws-sdk/client-ssm": "^3.896.0", "@aws-sdk/util-dynamodb": "^3.896.0", "@middy/core": "^4.7.0", - "@redis/client": "^5.8.2", + "@redis/client": "^5.8.3", "@valkey/valkey-glide": "^2.1.0", "aws-sdk": "^2.1692.0", "aws-sdk-client-mock": "^4.1.0", @@ -3848,9 +3848,9 @@ "license": "BSD-3-Clause" }, "node_modules/@redis/client": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.8.2.tgz", - "integrity": "sha512-WtMScno3+eBpTac1Uav2zugXEoXqaU23YznwvFgkPwBQVwEHTDgOG7uEAObtZ/Nyn8SmAMbqkEubJaMOvnqdsQ==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.8.3.tgz", + "integrity": "sha512-MZVUE+l7LmMIYlIjubPosruJ9ltSLGFmJqsXApTqPLyHLjsJUSAbAJb/A3N34fEqean4ddiDkdWzNu4ZKPvRUg==", "devOptional": true, "license": "MIT", "dependencies": { From dfd0d4e99440a003a07c318341a2589417ec1b74 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 23:11:37 +0100 Subject: [PATCH 203/255] chore(deps): bump @types/node from 24.6.0 to 24.6.1 (#4601) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi Co-authored-by: Stefano Vozza --- examples/app/package.json | 4 ++-- package-lock.json | 12 ++++++------ package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 57101d38c2..e7fabfce0e 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -30,7 +30,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.152", - "@types/node": "24.6.0", + "@types/node": "24.6.1", "aws-cdk-lib": "^2.216.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -49,7 +49,7 @@ "@aws-sdk/lib-dynamodb": "^3.896.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", - "@types/node": "24.6.0", + "@types/node": "24.6.1", "aws-cdk": "^2.1029.2", "constructs": "^10.4.2", "esbuild": "^0.25.10", diff --git a/package-lock.json b/package-lock.json index 37938b0e5b..354ba61dc9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.5", "@types/aws-lambda": "^8.10.152", - "@types/node": "^24.6.0", + "@types/node": "^24.6.1", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.2.3", @@ -60,7 +60,7 @@ "@aws-sdk/lib-dynamodb": "^3.896.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.152", - "@types/node": "24.6.0", + "@types/node": "24.6.1", "aws-cdk": "^2.1029.2", "constructs": "^10.4.2", "esbuild": "^0.25.10", @@ -68,7 +68,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.152", - "@types/node": "24.6.0", + "@types/node": "24.6.1", "aws-cdk-lib": "^2.216.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -5096,9 +5096,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.6.0.tgz", - "integrity": "sha512-F1CBxgqwOMc4GKJ7eY22hWhBVQuMYTtqI8L0FcszYcpYX0fzfDGpez22Xau8Mgm7O9fI+zA/TYIdq3tGWfweBA==", + "version": "24.6.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.6.1.tgz", + "integrity": "sha512-ljvjjs3DNXummeIaooB4cLBKg2U6SPI6Hjra/9rRIy7CpM0HpLtG9HptkMKAb4HYWy5S7HUvJEuWgr/y0U8SHw==", "license": "MIT", "dependencies": { "undici-types": "~7.13.0" diff --git a/package.json b/package.json index 2f7bea0ee6..406aa53334 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.5", "@types/aws-lambda": "^8.10.152", - "@types/node": "^24.6.0", + "@types/node": "^24.6.1", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.2.3", From 2f3d327f65ce8187ecbb6ad9ebab8b944fb82263 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 23:14:19 +0100 Subject: [PATCH 204/255] chore(deps): bump mkdocs-material from 9.6.20 to 9.6.21 in /docs (#4596) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- docs/requirements.in | 2 +- docs/requirements.txt | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/docs/requirements.in b/docs/requirements.in index 2ac3e7ab0a..c6bc268df8 100644 --- a/docs/requirements.in +++ b/docs/requirements.in @@ -1,5 +1,5 @@ mike==1.1.2 -mkdocs-material==9.6.20 +mkdocs-material==9.6.21 mkdocs-git-revision-date-plugin==0.3.2 mkdocs-exclude==1.0.2 mkdocs-typedoc==1.0.4 diff --git a/docs/requirements.txt b/docs/requirements.txt index 3198d019a1..ee767033e9 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -121,9 +121,7 @@ charset-normalizer==3.3.2 \ click==8.1.7 \ --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de - # via - # mkdocs - # mkdocs-material + # via mkdocs colorama==0.4.6 \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 @@ -278,9 +276,9 @@ mkdocs-llmstxt==0.3.2 \ --hash=sha256:dd63acb8257fca3244058fd820acd4700c1626dbe48ad3a1a2cc9c599f8e4b7f \ --hash=sha256:fb363205d6f1452411dc5069f62012cb6b29e1788f6db9cc17793bdca7eabea8 # via -r requirements.in -mkdocs-material==9.6.20 \ - --hash=sha256:b8d8c8b0444c7c06dd984b55ba456ce731f0035c5a1533cc86793618eb1e6c82 \ - --hash=sha256:e1f84d21ec5fb730673c4259b2e0d39f8d32a3fef613e3a8e7094b012d43e790 +mkdocs-material==9.6.21 \ + --hash=sha256:aa6a5ab6fb4f6d381588ac51da8782a4d3757cb3d1b174f81a2ec126e1f22c92 \ + --hash=sha256:b01aa6d2731322438056f360f0e623d3faae981f8f2d8c68b1b973f4f2657870 # via -r requirements.in mkdocs-material-extensions==1.3.1 \ --hash=sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443 \ From 7ba37944edfe4c9672b0707d970ca194c8268703 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 23:18:40 +0100 Subject: [PATCH 205/255] chore(deps): bump @types/aws-lambda from 8.10.152 to 8.10.153 (#4600) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- examples/app/package.json | 4 ++-- package-lock.json | 12 ++++++------ package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index e7fabfce0e..2060053c81 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -29,7 +29,7 @@ "#errors": "./functions/commons/errors.js" }, "devDependencies": { - "@types/aws-lambda": "^8.10.152", + "@types/aws-lambda": "^8.10.153", "@types/node": "24.6.1", "aws-cdk-lib": "^2.216.0", "constructs": "^10.4.2", @@ -48,7 +48,7 @@ "@aws-sdk/client-ssm": "^3.896.0", "@aws-sdk/lib-dynamodb": "^3.896.0", "@middy/core": "^4.7.0", - "@types/aws-lambda": "^8.10.152", + "@types/aws-lambda": "^8.10.153", "@types/node": "24.6.1", "aws-cdk": "^2.1029.2", "constructs": "^10.4.2", diff --git a/package-lock.json b/package-lock.json index 354ba61dc9..65a76d0fe4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ ], "devDependencies": { "@biomejs/biome": "^2.2.5", - "@types/aws-lambda": "^8.10.152", + "@types/aws-lambda": "^8.10.153", "@types/node": "^24.6.1", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", @@ -59,7 +59,7 @@ "@aws-sdk/client-ssm": "^3.896.0", "@aws-sdk/lib-dynamodb": "^3.896.0", "@middy/core": "^4.7.0", - "@types/aws-lambda": "^8.10.152", + "@types/aws-lambda": "^8.10.153", "@types/node": "24.6.1", "aws-cdk": "^2.1029.2", "constructs": "^10.4.2", @@ -67,7 +67,7 @@ "typescript": "^5.9.2" }, "devDependencies": { - "@types/aws-lambda": "^8.10.152", + "@types/aws-lambda": "^8.10.153", "@types/node": "24.6.1", "aws-cdk-lib": "^2.216.0", "constructs": "^10.4.2", @@ -5008,9 +5008,9 @@ "license": "MIT" }, "node_modules/@types/aws-lambda": { - "version": "8.10.152", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.152.tgz", - "integrity": "sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw==", + "version": "8.10.153", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.153.tgz", + "integrity": "sha512-j5zuETAQtPKuU8ZeqtcLdqLxQeNffX1Dd1Sr3tP56rYZD21Ph49iIqWbiHHqwLXugsMPSsgX/bAZI29Patlbbw==", "dev": true, "license": "MIT" }, diff --git a/package.json b/package.json index 406aa53334..5cacbc1e4e 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript#readme", "devDependencies": { "@biomejs/biome": "^2.2.5", - "@types/aws-lambda": "^8.10.152", + "@types/aws-lambda": "^8.10.153", "@types/node": "^24.6.1", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", From a15fead9365498367cef5007fc395ed9943796a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 23:23:27 +0100 Subject: [PATCH 206/255] chore(deps): bump squidfunk/mkdocs-material from `86d21da` to `00f9276` in /docs (#4598) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- docs/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Dockerfile b/docs/Dockerfile index b3df3d8763..3583231260 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -1,5 +1,5 @@ # version 9.5.35 -FROM squidfunk/mkdocs-material@sha256:86d21da4f45f16e30774bf911e5b4795da13ce0cd197dbf8d3d059f256b2cc37 +FROM squidfunk/mkdocs-material@sha256:00f9276315990b82f5af8c47bb2b71e2c69aef9f02a08f8dffd2515f42310753 # Install Node.js RUN apk add --no-cache nodejs=22.13.1-r0 npm From 0a16ab22e75137f91185eb274f7ec7bf938a59c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 23:34:33 +0100 Subject: [PATCH 207/255] chore(deps): bump typescript from 5.9.2 to 5.9.3 in the typescript group across 1 directory (#4599) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- examples/app/package.json | 4 ++-- package-lock.json | 12 ++++++------ package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 2060053c81..4f898a7094 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -35,7 +35,7 @@ "constructs": "^10.4.2", "source-map-support": "^0.5.21", "tsx": "^4.20.6", - "typescript": "^5.9.2", + "typescript": "^5.9.3", "vitest": "^3.0.5" }, "dependencies": { @@ -53,6 +53,6 @@ "aws-cdk": "^2.1029.2", "constructs": "^10.4.2", "esbuild": "^0.25.10", - "typescript": "^5.9.2" + "typescript": "^5.9.3" } } diff --git a/package-lock.json b/package-lock.json index 65a76d0fe4..18b0ad437b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "middy6": "npm:@middy/core@^6.0.0", "typedoc": "^0.28.13", "typedoc-plugin-missing-exports": "^4.1.0", - "typescript": "^5.9.2", + "typescript": "^5.9.3", "vitest": "^3.0.9" }, "engines": { @@ -64,7 +64,7 @@ "aws-cdk": "^2.1029.2", "constructs": "^10.4.2", "esbuild": "^0.25.10", - "typescript": "^5.9.2" + "typescript": "^5.9.3" }, "devDependencies": { "@types/aws-lambda": "^8.10.153", @@ -73,7 +73,7 @@ "constructs": "^10.4.2", "source-map-support": "^0.5.21", "tsx": "^4.20.6", - "typescript": "^5.9.2", + "typescript": "^5.9.3", "vitest": "^3.0.5" } }, @@ -10067,9 +10067,9 @@ } }, "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index 5cacbc1e4e..5379f5586a 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "middy6": "npm:@middy/core@^6.0.0", "typedoc": "^0.28.13", "typedoc-plugin-missing-exports": "^4.1.0", - "typescript": "^5.9.2", + "typescript": "^5.9.3", "vitest": "^3.0.9" }, "lint-staged": { From ef826b2d62efcdd4cb0a88007e578dce22619ec4 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Fri, 3 Oct 2025 01:36:30 +0200 Subject: [PATCH 208/255] test: update domain in e2e tests (#4606) --- .../tests/e2e/decorator.test.functionCode.ts | 4 +-- packages/tracer/tests/e2e/decorator.test.ts | 8 +++--- .../tests/e2e/manual.test.functionCode.ts | 2 +- .../tests/e2e/middy.test.functionCode.ts | 2 +- packages/tracer/tests/e2e/middy.test.ts | 8 +++--- packages/tracer/tests/helpers/httpRequest.ts | 27 +++++++++++++++++++ 6 files changed, 39 insertions(+), 12 deletions(-) diff --git a/packages/tracer/tests/e2e/decorator.test.functionCode.ts b/packages/tracer/tests/e2e/decorator.test.functionCode.ts index 678d256058..780b58d1e4 100644 --- a/packages/tracer/tests/e2e/decorator.test.functionCode.ts +++ b/packages/tracer/tests/e2e/decorator.test.functionCode.ts @@ -44,8 +44,8 @@ export class LambdaFunction { await this.methodNoResponse(event.invocation); await httpRequest({ - hostname: 'docs.powertools.aws.dev', - path: '/lambda/typescript/latest/', + hostname: 'docs.aws.amazon.com', + path: '/powertools/typescript/latest/', }); const res = this.myMethod(); diff --git a/packages/tracer/tests/e2e/decorator.test.ts b/packages/tracer/tests/e2e/decorator.test.ts index 64ee1cbf5c..70425b88d8 100644 --- a/packages/tracer/tests/e2e/decorator.test.ts +++ b/packages/tracer/tests/e2e/decorator.test.ts @@ -76,7 +76,7 @@ describe('Tracer E2E tests, decorator instrumentation', () => { * 1. Lambda Context (AWS::Lambda) * 2. Lambda Function (AWS::Lambda::Function) * 4. DynamoDB (AWS::DynamoDB) - * 4. Remote call (docs.powertools.aws.dev) + * 4. Remote call (docs.aws.amazon.com) */ expectedSegmentsCount: 4, }); @@ -100,11 +100,11 @@ describe('Tracer E2E tests, decorator instrumentation', () => { expect(subsegments.size).toBe(3); // Check remote call subsegment - expect(subsegments.has('docs.powertools.aws.dev')).toBe(true); - const httpSubsegment = subsegments.get('docs.powertools.aws.dev'); + expect(subsegments.has('docs.aws.amazon.com')).toBe(true); + const httpSubsegment = subsegments.get('docs.aws.amazon.com'); expect(httpSubsegment?.namespace).toBe('remote'); expect(httpSubsegment?.http?.request?.url).toEqual( - 'https://docs.powertools.aws.dev/lambda/typescript/latest/' + 'https://docs.aws.amazon.com/powertools/typescript/latest/' ); expect(httpSubsegment?.http?.request?.method).toBe('GET'); expect(httpSubsegment?.http?.response?.status).toEqual(expect.any(Number)); diff --git a/packages/tracer/tests/e2e/manual.test.functionCode.ts b/packages/tracer/tests/e2e/manual.test.functionCode.ts index 5ec65c6946..9c13aece91 100644 --- a/packages/tracer/tests/e2e/manual.test.functionCode.ts +++ b/packages/tracer/tests/e2e/manual.test.functionCode.ts @@ -33,7 +33,7 @@ export const handler = async ( tracer.putMetadata(customMetadataKey, customMetadataValue); try { - await fetch('https://docs.powertools.aws.dev/lambda/typescript/latest/'); + await fetch('https://docs.aws.amazon.com/powertools/typescript/latest/'); const res = customResponseValue; if (event.throw) { diff --git a/packages/tracer/tests/e2e/middy.test.functionCode.ts b/packages/tracer/tests/e2e/middy.test.functionCode.ts index cff6e205f4..e78dd75f7f 100644 --- a/packages/tracer/tests/e2e/middy.test.functionCode.ts +++ b/packages/tracer/tests/e2e/middy.test.functionCode.ts @@ -34,7 +34,7 @@ export const handler = middy( }, }) ); - await fetch('https://docs.powertools.aws.dev/lambda/typescript/latest/'); + await fetch('https://docs.aws.amazon.com/powertools/typescript/latest/'); if (event.throw) { throw new Error(customErrorMessage); diff --git a/packages/tracer/tests/e2e/middy.test.ts b/packages/tracer/tests/e2e/middy.test.ts index 49f152d1eb..26cc09f4fa 100644 --- a/packages/tracer/tests/e2e/middy.test.ts +++ b/packages/tracer/tests/e2e/middy.test.ts @@ -75,7 +75,7 @@ describe('Tracer E2E tests, middy instrumentation', () => { * 1. Lambda Context (AWS::Lambda) * 2. Lambda Function (AWS::Lambda::Function) * 4. DynamoDB (AWS::DynamoDB) - * 4. Remote call (docs.powertools.aws.dev) + * 4. Remote call (docs.aws.amazon.com) */ expectedSegmentsCount: 4, }); @@ -100,11 +100,11 @@ describe('Tracer E2E tests, middy instrumentation', () => { expect(subsegments.has('DynamoDB')).toBe(true); // Check remote call subsegment - expect(subsegments.has('docs.powertools.aws.dev')).toBe(true); - const httpSubsegment = subsegments.get('docs.powertools.aws.dev'); + expect(subsegments.has('docs.aws.amazon.com')).toBe(true); + const httpSubsegment = subsegments.get('docs.aws.amazon.com'); expect(httpSubsegment?.namespace).toBe('remote'); expect(httpSubsegment?.http?.request?.url).toEqual( - 'https://docs.powertools.aws.dev/lambda/typescript/latest/' + 'https://docs.aws.amazon.com/powertools/typescript/latest/' ); expect(httpSubsegment?.http?.request?.method).toBe('GET'); expect(httpSubsegment?.http?.response?.status).toEqual(expect.any(Number)); diff --git a/packages/tracer/tests/helpers/httpRequest.ts b/packages/tracer/tests/helpers/httpRequest.ts index 579f56ac3f..7918a38fd2 100644 --- a/packages/tracer/tests/helpers/httpRequest.ts +++ b/packages/tracer/tests/helpers/httpRequest.ts @@ -1,3 +1,4 @@ +import type { OutgoingHttpHeaders } from 'node:http'; import https, { type RequestOptions } from 'node:https'; /** @@ -20,6 +21,32 @@ const httpRequest = (params: RequestOptions): Promise => params.timeout = 5000; } + // Ensure some common headers are present. Many sites (including AWS docs) + // block requests that don't include a User-Agent or typical Accept header, + // which is why the `fetch` call (which sets defaults) succeeds while a + // bare https.request may receive a 403. + const originalHeaders = (params.headers ?? {}) as OutgoingHttpHeaders; + // Create a quick lowercase map of header names to detect presence case-insensitively + const lowerMap = Object.keys(originalHeaders).reduce< + Record + >((acc, k) => { + acc[k.toLowerCase()] = k; + return acc; + }, {}); + + // Only add defaults when not present (case-insensitive) + if (!lowerMap['user-agent']) { + // prefer a Node/undici-like UA to match what fetch/undici would send + (originalHeaders as Record)['User-Agent'] = + 'node-fetch/1.0 (+https://github.com/node-fetch/node-fetch)'; + } + if (!lowerMap.accept) { + (originalHeaders as Record).Accept = + 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'; + } + + params.headers = originalHeaders; + const req = https.request(params, (res) => { if ( res.statusCode == null || From 54d9be4886095ae5aa4e08abdd1016776ae89eb4 Mon Sep 17 00:00:00 2001 From: Thiago Meireles Date: Fri, 3 Oct 2025 06:03:33 -0300 Subject: [PATCH 209/255] docs(parser): correct typos in example code for middleware (#4607) --- packages/parser/src/middleware/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/parser/src/middleware/index.ts b/packages/parser/src/middleware/index.ts index c57cdf34cd..064e47c855 100644 --- a/packages/parser/src/middleware/index.ts +++ b/packages/parser/src/middleware/index.ts @@ -12,18 +12,18 @@ import type { ParserOptions, ParserOutput } from '../types/parser.js'; * ```typescript * import { parser } from '@aws-lambda-powertools/parser/middleware'; * import middy from '@middy/core'; - * import { sqsEnvelope } from '@aws-lambda-powertools/parser/envelopes/sqs;' + * import { SqsEnvelope } from '@aws-lambda-powertools/parser/envelopes/sqs'; * - * const oderSchema = z.object({ + * const orderSchema = z.object({ * id: z.number(), * description: z.string(), * quantity: z.number(), * }); * - * type Order = z.infer; + * type Order = z.infer; * * export const handler = middy() - * .use(parser({ schema: oderSchema, envelope: sqsEnvelope })) + * .use(parser({ schema: orderSchema, envelope: SqsEnvelope })) * .handler(async (event) => { * // ^ event is inferred as Order[] * }) From eedaf70556712eb758a4b255a8fafb8dbb8a9951 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 10:19:42 +0100 Subject: [PATCH 210/255] chore(deps): bump the aws-cdk group across 1 directory with 3 updates (#4589) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- examples/app/package.json | 4 +-- layers/package.json | 4 +-- package-lock.json | 46 +++++++++++++++++------------------ packages/testing/package.json | 4 +-- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 4f898a7094..3132265d7e 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -31,7 +31,7 @@ "devDependencies": { "@types/aws-lambda": "^8.10.153", "@types/node": "24.6.1", - "aws-cdk-lib": "^2.216.0", + "aws-cdk-lib": "^2.219.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", "tsx": "^4.20.6", @@ -50,7 +50,7 @@ "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.153", "@types/node": "24.6.1", - "aws-cdk": "^2.1029.2", + "aws-cdk": "^2.1029.4", "constructs": "^10.4.2", "esbuild": "^0.25.10", "typescript": "^5.9.3" diff --git a/layers/package.json b/layers/package.json index 330a86c90f..601c5407d8 100644 --- a/layers/package.json +++ b/layers/package.json @@ -41,8 +41,8 @@ "source-map-support": "^0.5.21" }, "dependencies": { - "aws-cdk": "^2.1029.2", - "aws-cdk-lib": "^2.216.0", + "aws-cdk": "^2.1029.4", + "aws-cdk-lib": "^2.219.0", "esbuild": "^0.25.10", "tsx": "^4.20.6" } diff --git a/package-lock.json b/package-lock.json index 18b0ad437b..886c2a6eea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,7 +61,7 @@ "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.153", "@types/node": "24.6.1", - "aws-cdk": "^2.1029.2", + "aws-cdk": "^2.1029.4", "constructs": "^10.4.2", "esbuild": "^0.25.10", "typescript": "^5.9.3" @@ -69,7 +69,7 @@ "devDependencies": { "@types/aws-lambda": "^8.10.153", "@types/node": "24.6.1", - "aws-cdk-lib": "^2.216.0", + "aws-cdk-lib": "^2.219.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", "tsx": "^4.20.6", @@ -134,8 +134,8 @@ "version": "2.27.0", "license": "MIT-0", "dependencies": { - "aws-cdk": "^2.1029.2", - "aws-cdk-lib": "^2.216.0", + "aws-cdk": "^2.1029.4", + "aws-cdk-lib": "^2.219.0", "esbuild": "^0.25.10", "tsx": "^4.20.6" }, @@ -317,9 +317,9 @@ } }, "node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "48.10.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-48.10.0.tgz", - "integrity": "sha512-Y9wkKUiH9ey8jTmSgbYD3ZbEzmog9dXCb6V6KwfAwqfn3yiFq0l0BoQKIkhcuLQnrB8cYGM3MdmzdViwTL1F9g==", + "version": "48.12.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-48.12.0.tgz", + "integrity": "sha512-/GNDW8+O5FZldDXVtNJSMnd6+hG8DmwLt02cqlYHqWjpqTap7XzFFv3pqGTl/lL7s97jlbgj/568pLjpUWh2Dw==", "bundleDependencies": [ "jsonschema", "semver" @@ -420,13 +420,13 @@ } }, "node_modules/@aws-cdk/toolkit-lib": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@aws-cdk/toolkit-lib/-/toolkit-lib-1.8.2.tgz", - "integrity": "sha512-O9Bjwm0QUs5LtseykAGDYg2GdWdf7DLzrf4dXok/9PR4r6HpTN3SfsEnW5hKV+b98GjNWJcMN1nFBVZP70NXSg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/toolkit-lib/-/toolkit-lib-1.9.0.tgz", + "integrity": "sha512-21NxaOmZeRHnYSS0HludVQer7HWDFl7ohoyDJIO5m0Nwa2vfIeRQdCVj+ueqHFoDCil3iSoeLrTGuV/YtAdhEQ==", "license": "Apache-2.0", "dependencies": { "@aws-cdk/cdk-assets-lib": "^1", - "@aws-cdk/cloud-assembly-schema": ">=48.10.0", + "@aws-cdk/cloud-assembly-schema": ">=48.12.0", "@aws-cdk/cloudformation-diff": "^2", "@aws-cdk/cx-api": "^2", "@aws-sdk/client-appsync": "^3", @@ -456,7 +456,7 @@ "@smithy/util-retry": "^4", "@smithy/util-waiter": "^4", "archiver": "^7.0.1", - "cdk-from-cfn": "^0.245.0", + "cdk-from-cfn": "^0.248.0", "chalk": "^4", "chokidar": "^3", "fast-deep-equal": "^3.1.3", @@ -5985,9 +5985,9 @@ } }, "node_modules/aws-cdk": { - "version": "2.1029.2", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.1029.2.tgz", - "integrity": "sha512-VkgxcbDLygHtnIuZHDYosQSlYwqmnYogzgB4zq+n6prHUP3Q9R8b/eOeo5bG+5OhE+r6+ZXrrVSmfISyaxA0og==", + "version": "2.1029.4", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.1029.4.tgz", + "integrity": "sha512-rJa8QLd8WHaoTEjPLqVwmNpDMmyJycVaxdr/Evr/1MDLq+WCovP46IqPaXfH0q/jY0gCsga9or907tEayK5xcg==", "license": "Apache-2.0", "bin": { "cdk": "bin/cdk" @@ -6000,9 +6000,9 @@ } }, "node_modules/aws-cdk-lib": { - "version": "2.216.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.216.0.tgz", - "integrity": "sha512-Y8u5HiMVeJp3HLJy8Ok3tr+Fgk0oUbhQfbSAyEBVZts7T9olEkQPfmBf1TiybcQmt/C/pjk3qQFHsGL+fgxtvw==", + "version": "2.219.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.219.0.tgz", + "integrity": "sha512-Rq1/f3exfFEWee1znNq8yvR1TuRQ4xQZz3JNkliBW9dFwyrDe7l/dmlAf6DVvB3nuiZAaUS+vh4ua1LZ7Ec8kg==", "bundleDependencies": [ "@balena/dockerignore", "case", @@ -6587,9 +6587,9 @@ } }, "node_modules/cdk-from-cfn": { - "version": "0.245.0", - "resolved": "https://registry.npmjs.org/cdk-from-cfn/-/cdk-from-cfn-0.245.0.tgz", - "integrity": "sha512-bRybOGt+4jwSQlsuJxb8g6qM4sdjFfW7NIEwSceAJL4inRh4pPhAbsZjmlTyBRPwQ3YUDGYI/VhKrkyMvXnxBw==", + "version": "0.248.0", + "resolved": "https://registry.npmjs.org/cdk-from-cfn/-/cdk-from-cfn-0.248.0.tgz", + "integrity": "sha512-aBJfd7EqwSLdW0MzxNsrVntrdDf28TSfX5elLjF4KvkOM66f+9NbGQpmmdXE2VztxP7p9JS8BE54UujRo4PmrQ==", "license": "MIT OR Apache-2.0" }, "node_modules/chai": { @@ -10888,10 +10888,10 @@ "version": "2.27.0", "license": "MIT-0", "dependencies": { - "@aws-cdk/toolkit-lib": "^1.8.2", + "@aws-cdk/toolkit-lib": "^1.9.0", "@aws-sdk/client-lambda": "^3.896.0", "@smithy/util-utf8": "^4.0.0", - "aws-cdk-lib": "^2.216.0", + "aws-cdk-lib": "^2.219.0", "esbuild": "^0.25.10", "promise-retry": "^2.0.1" }, diff --git a/packages/testing/package.json b/packages/testing/package.json index ce1e8267c1..9295e71565 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -98,10 +98,10 @@ }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/testing#readme", "dependencies": { - "@aws-cdk/toolkit-lib": "^1.8.2", + "@aws-cdk/toolkit-lib": "^1.9.0", "@aws-sdk/client-lambda": "^3.896.0", "@smithy/util-utf8": "^4.0.0", - "aws-cdk-lib": "^2.216.0", + "aws-cdk-lib": "^2.219.0", "esbuild": "^0.25.10", "promise-retry": "^2.0.1" }, From 33f733471a54d528514e7bebcd863edc4e3781a9 Mon Sep 17 00:00:00 2001 From: Stefano Vozza Date: Fri, 3 Oct 2025 12:15:16 +0100 Subject: [PATCH 211/255] improv(event-handler): rename ServiceError class to HttpError (#4610) --- packages/event-handler/src/rest/Router.ts | 6 ++--- packages/event-handler/src/rest/errors.ts | 24 +++++++++---------- packages/event-handler/src/rest/index.ts | 2 +- .../unit/rest/Router/error-handling.test.ts | 2 +- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/event-handler/src/rest/Router.ts b/packages/event-handler/src/rest/Router.ts index 6c975d4f33..a79ab8decc 100644 --- a/packages/event-handler/src/rest/Router.ts +++ b/packages/event-handler/src/rest/Router.ts @@ -31,10 +31,10 @@ import { } from './converters.js'; import { ErrorHandlerRegistry } from './ErrorHandlerRegistry.js'; import { + HttpError, InternalServerError, MethodNotAllowedError, NotFoundError, - ServiceError, } from './errors.js'; import { Route } from './Route.js'; import { RouteHandlerRegistry } from './RouteHandlerRegistry.js'; @@ -399,14 +399,14 @@ class Router { headers: { 'Content-Type': 'application/json' }, }); } catch (handlerError) { - if (handlerError instanceof ServiceError) { + if (handlerError instanceof HttpError) { return await this.handleError(handlerError, options); } return this.#defaultErrorHandler(handlerError as Error); } } - if (error instanceof ServiceError) { + if (error instanceof HttpError) { return new Response(JSON.stringify(error.toJSON()), { status: error.statusCode, headers: { 'Content-Type': 'application/json' }, diff --git a/packages/event-handler/src/rest/errors.ts b/packages/event-handler/src/rest/errors.ts index ceef79a7e9..a190843e8a 100644 --- a/packages/event-handler/src/rest/errors.ts +++ b/packages/event-handler/src/rest/errors.ts @@ -20,7 +20,7 @@ class ParameterValidationError extends RouteMatchingError { } } -abstract class ServiceError extends Error { +abstract class HttpError extends Error { abstract readonly statusCode: HttpStatusCode; abstract readonly errorType: string; public readonly details?: Record; @@ -31,7 +31,7 @@ abstract class ServiceError extends Error { details?: Record ) { super(message, options); - this.name = 'ServiceError'; + this.name = 'HttpError'; this.details = details; } @@ -47,7 +47,7 @@ abstract class ServiceError extends Error { } } -class BadRequestError extends ServiceError { +class BadRequestError extends HttpError { readonly statusCode = HttpStatusCodes.BAD_REQUEST; readonly errorType = 'BadRequestError'; @@ -61,7 +61,7 @@ class BadRequestError extends ServiceError { } } -class UnauthorizedError extends ServiceError { +class UnauthorizedError extends HttpError { readonly statusCode = HttpStatusCodes.UNAUTHORIZED; readonly errorType = 'UnauthorizedError'; @@ -75,7 +75,7 @@ class UnauthorizedError extends ServiceError { } } -class ForbiddenError extends ServiceError { +class ForbiddenError extends HttpError { readonly statusCode = HttpStatusCodes.FORBIDDEN; readonly errorType = 'ForbiddenError'; @@ -89,7 +89,7 @@ class ForbiddenError extends ServiceError { } } -class NotFoundError extends ServiceError { +class NotFoundError extends HttpError { readonly statusCode = HttpStatusCodes.NOT_FOUND; readonly errorType = 'NotFoundError'; @@ -103,7 +103,7 @@ class NotFoundError extends ServiceError { } } -class MethodNotAllowedError extends ServiceError { +class MethodNotAllowedError extends HttpError { readonly statusCode = HttpStatusCodes.METHOD_NOT_ALLOWED; readonly errorType = 'MethodNotAllowedError'; @@ -117,7 +117,7 @@ class MethodNotAllowedError extends ServiceError { } } -class RequestTimeoutError extends ServiceError { +class RequestTimeoutError extends HttpError { readonly statusCode = HttpStatusCodes.REQUEST_TIMEOUT; readonly errorType = 'RequestTimeoutError'; @@ -131,7 +131,7 @@ class RequestTimeoutError extends ServiceError { } } -class RequestEntityTooLargeError extends ServiceError { +class RequestEntityTooLargeError extends HttpError { readonly statusCode = HttpStatusCodes.REQUEST_ENTITY_TOO_LARGE; readonly errorType = 'RequestEntityTooLargeError'; @@ -145,7 +145,7 @@ class RequestEntityTooLargeError extends ServiceError { } } -class InternalServerError extends ServiceError { +class InternalServerError extends HttpError { readonly statusCode = HttpStatusCodes.INTERNAL_SERVER_ERROR; readonly errorType = 'InternalServerError'; @@ -159,7 +159,7 @@ class InternalServerError extends ServiceError { } } -class ServiceUnavailableError extends ServiceError { +class ServiceUnavailableError extends HttpError { readonly statusCode = HttpStatusCodes.SERVICE_UNAVAILABLE; readonly errorType = 'ServiceUnavailableError'; @@ -183,7 +183,7 @@ export { RequestEntityTooLargeError, RequestTimeoutError, RouteMatchingError, - ServiceError, + HttpError, ServiceUnavailableError, UnauthorizedError, }; diff --git a/packages/event-handler/src/rest/index.ts b/packages/event-handler/src/rest/index.ts index 95df1e226e..c6d0000093 100644 --- a/packages/event-handler/src/rest/index.ts +++ b/packages/event-handler/src/rest/index.ts @@ -8,6 +8,7 @@ export { export { BadRequestError, ForbiddenError, + HttpError, InternalServerError, MethodNotAllowedError, NotFoundError, @@ -15,7 +16,6 @@ export { RequestEntityTooLargeError, RequestTimeoutError, RouteMatchingError, - ServiceError, ServiceUnavailableError, UnauthorizedError, } from './errors.js'; diff --git a/packages/event-handler/tests/unit/rest/Router/error-handling.test.ts b/packages/event-handler/tests/unit/rest/Router/error-handling.test.ts index 87bc657628..3c7aaea176 100644 --- a/packages/event-handler/tests/unit/rest/Router/error-handling.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/error-handling.test.ts @@ -182,7 +182,7 @@ describe('Class: Router - Error Handling', () => { }); }); - it('uses ServiceError toJSON method when no custom handler is registered', async () => { + it('uses HttpError toJSON method when no custom handler is registered', async () => { // Prepare const app = new Router(); From 19786bf82019eaf29f35830c029f60f8c5e9573d Mon Sep 17 00:00:00 2001 From: Swopnil Dangol Date: Fri, 3 Oct 2025 13:45:12 +0100 Subject: [PATCH 212/255] feat(event-handler): added support for catch all route (#4582) Co-authored-by: Stefano Vozza Co-authored-by: Andrea Amorosi --- packages/commons/src/index.ts | 1 + packages/commons/src/typeUtils.ts | 20 ++++++ packages/commons/tests/unit/typeUtils.test.ts | 25 +++++++ .../src/rest/RouteHandlerRegistry.ts | 68 ++++++++++++------- packages/event-handler/src/rest/utils.ts | 45 +++++++++--- packages/event-handler/src/types/rest.ts | 2 +- .../unit/rest/Router/basic-routing.test.ts | 28 ++++++++ .../tests/unit/rest/utils.test.ts | 5 +- 8 files changed, 157 insertions(+), 37 deletions(-) diff --git a/packages/commons/src/index.ts b/packages/commons/src/index.ts index aed1788618..17906e6e26 100644 --- a/packages/commons/src/index.ts +++ b/packages/commons/src/index.ts @@ -22,6 +22,7 @@ export { isNullOrUndefined, isNumber, isRecord, + isRegExp, isStrictEqual, isString, isStringUndefinedNullEmpty, diff --git a/packages/commons/src/typeUtils.ts b/packages/commons/src/typeUtils.ts index 2dca860b84..10cc93214f 100644 --- a/packages/commons/src/typeUtils.ts +++ b/packages/commons/src/typeUtils.ts @@ -176,6 +176,25 @@ const isStringUndefinedNullEmpty = (value: unknown) => { return false; }; +/** + * Check if a Regular Expression + * + * @example + * ```typescript + * import { isRegExp } from '@aws-lambda-powertools/commons/typeUtils'; + * + * const value = /^foo.+$/; + * if (isRegExp(value)) { + * // value is a Regular Expression + * } + * ``` + * + * @param value - The value to check + */ +const isRegExp = (value: unknown): value is RegExp => { + return value instanceof RegExp; +}; + /** * Get the type of a value as a string. * @@ -337,6 +356,7 @@ export { isNull, isNullOrUndefined, isStringUndefinedNullEmpty, + isRegExp, getType, isStrictEqual, }; diff --git a/packages/commons/tests/unit/typeUtils.test.ts b/packages/commons/tests/unit/typeUtils.test.ts index 99b281be87..72a719adf6 100644 --- a/packages/commons/tests/unit/typeUtils.test.ts +++ b/packages/commons/tests/unit/typeUtils.test.ts @@ -6,6 +6,7 @@ import { isNullOrUndefined, isNumber, isRecord, + isRegExp, isStrictEqual, isString, isStringUndefinedNullEmpty, @@ -224,6 +225,30 @@ describe('Functions: typeUtils', () => { }); }); + describe('Function: isRegExp', () => { + it('returns true when the passed value is a Regular Expression', () => { + // Prepare + const value = /^hello.+$/; + + // Act + const result = isRegExp(value); + + // Assess + expect(result).toBe(true); + }); + + it('returns false when the passed value is not a Regular Expression', () => { + // Prepare + const value = 123; + + // Act + const result = isRegExp(value); + + // Assess + expect(result).toBe(false); + }); + }); + describe('Function: getType', () => { it.each([ { diff --git a/packages/event-handler/src/rest/RouteHandlerRegistry.ts b/packages/event-handler/src/rest/RouteHandlerRegistry.ts index 116b95b91e..c191d08398 100644 --- a/packages/event-handler/src/rest/RouteHandlerRegistry.ts +++ b/packages/event-handler/src/rest/RouteHandlerRegistry.ts @@ -1,4 +1,5 @@ import type { GenericLogger } from '@aws-lambda-powertools/commons/types'; +import { isRegExp } from '@aws-lambda-powertools/commons/typeutils'; import type { DynamicRoute, HttpMethod, @@ -11,11 +12,13 @@ import { ParameterValidationError } from './errors.js'; import { Route } from './Route.js'; import { compilePath, + getPathString, resolvePrefixedPath, validatePathPattern, } from './utils.js'; class RouteHandlerRegistry { + readonly #regexRoutes: Map = new Map(); readonly #staticRoutes: Map = new Map(); readonly #dynamicRoutesSet: Set = new Set(); readonly #dynamicRoutes: DynamicRoute[] = []; @@ -44,8 +47,8 @@ class RouteHandlerRegistry { } // Routes with more path segments are more specific - const aSegments = a.path.split('/').length; - const bSegments = b.path.split('/').length; + const aSegments = getPathString(a.path).split('/').length; + const bSegments = getPathString(b.path).split('/').length; return bSegments - aSegments; } @@ -103,6 +106,18 @@ class RouteHandlerRegistry { const compiled = compilePath(route.path); + if (isRegExp(route.path)) { + if (this.#regexRoutes.has(route.id)) { + this.#logger.warn( + `Handler for method: ${route.method} and path: ${route.path} already exists. The previous handler will be replaced.` + ); + } + this.#regexRoutes.set(route.id, { + ...route, + ...compiled, + }); + return; + } if (compiled.isDynamic) { const dynamicRoute = { ...route, @@ -171,28 +186,10 @@ class RouteHandlerRegistry { }; } - for (const route of this.#dynamicRoutes) { - if (route.method !== method) continue; - - const match = route.regex.exec(path); - if (match?.groups) { - const params = match.groups; - - const processedParams = this.#processParams(params); - - const validation = this.#validateParams(processedParams); - - if (!validation.isValid) { - throw new ParameterValidationError(validation.issues); - } - - return { - handler: route.handler, - params: processedParams, - rawParams: params, - middleware: route.middleware, - }; - } + const routes = [...this.#dynamicRoutes, ...this.#regexRoutes.values()]; + for (const route of routes) { + const result = this.#processRoute(route, method, path); + if (result) return result; } return null; @@ -215,6 +212,7 @@ class RouteHandlerRegistry { const routes = [ ...routeHandlerRegistry.#staticRoutes.values(), ...routeHandlerRegistry.#dynamicRoutes, + ...routeHandlerRegistry.#regexRoutes.values(), ]; for (const route of routes) { this.register( @@ -227,6 +225,28 @@ class RouteHandlerRegistry { ); } } + + #processRoute(route: DynamicRoute, method: HttpMethod, path: Path) { + if (route.method !== method) return; + + const match = route.regex.exec(getPathString(path)); + if (!match) return; + + const params = match.groups || {}; + const processedParams = this.#processParams(params); + const validation = this.#validateParams(processedParams); + + if (!validation.isValid) { + throw new ParameterValidationError(validation.issues); + } + + return { + handler: route.handler, + params: processedParams, + rawParams: params, + middleware: route.middleware, + }; + } } export { RouteHandlerRegistry }; diff --git a/packages/event-handler/src/rest/utils.ts b/packages/event-handler/src/rest/utils.ts index b0943d3e4f..caf4ad82f8 100644 --- a/packages/event-handler/src/rest/utils.ts +++ b/packages/event-handler/src/rest/utils.ts @@ -1,5 +1,9 @@ import { Readable, Writable } from 'node:stream'; -import { isRecord, isString } from '@aws-lambda-powertools/commons/typeutils'; +import { + isRecord, + isRegExp, + isString, +} from '@aws-lambda-powertools/commons/typeutils'; import type { APIGatewayProxyEvent } from 'aws-lambda'; import type { CompiledRoute, @@ -18,13 +22,21 @@ import { UNSAFE_CHARS, } from './constants.js'; +export function getPathString(path: Path): string { + return isString(path) ? path : path.source.replaceAll(/\\\//g, '/'); +} + export function compilePath(path: Path): CompiledRoute { const paramNames: string[] = []; - const regexPattern = path.replace(PARAM_PATTERN, (_match, paramName) => { - paramNames.push(paramName); - return `(?<${paramName}>[${SAFE_CHARS}${UNSAFE_CHARS}\\w]+)`; - }); + const pathString = getPathString(path); + const regexPattern = pathString.replace( + PARAM_PATTERN, + (_match, paramName) => { + paramNames.push(paramName); + return `(?<${paramName}>[${SAFE_CHARS}${UNSAFE_CHARS}\\w]+)`; + } + ); const finalPattern = `^${regexPattern}$`; @@ -39,9 +51,10 @@ export function compilePath(path: Path): CompiledRoute { export function validatePathPattern(path: Path): ValidationResult { const issues: string[] = []; - const matches = [...path.matchAll(PARAM_PATTERN)]; - if (path.includes(':')) { - const expectedParams = path.split(':').length; + const pathString = getPathString(path); + const matches = [...pathString.matchAll(PARAM_PATTERN)]; + if (pathString.includes(':')) { + const expectedParams = pathString.split(':').length; if (matches.length !== expectedParams - 1) { issues.push('Malformed parameter syntax. Use :paramName format.'); } @@ -227,14 +240,24 @@ export const composeMiddleware = (middleware: Middleware[]): Middleware => { /** * Resolves a prefixed path by combining the provided path and prefix. * + * The function returns a RegExp if any of the path or prefix is a RegExp. + * Otherwise, it returns a `/${string}` type value. + * * @param path - The path to resolve * @param prefix - The prefix to prepend to the path */ export const resolvePrefixedPath = (path: Path, prefix?: Path): Path => { - if (prefix) { - return path === '/' ? prefix : `${prefix}${path}`; + if (!prefix) return path; + if (isRegExp(prefix)) { + if (isRegExp(path)) { + return new RegExp(`${getPathString(prefix)}/${getPathString(path)}`); + } + return new RegExp(`${getPathString(prefix)}${path}`); + } + if (isRegExp(path)) { + return new RegExp(`${prefix}/${getPathString(path)}`); } - return path; + return `${prefix}${path}`.replace(/\/$/, '') as Path; }; export const HttpResponseStream = diff --git a/packages/event-handler/src/types/rest.ts b/packages/event-handler/src/types/rest.ts index ae7f9f8d5f..4fa17c36a2 100644 --- a/packages/event-handler/src/types/rest.ts +++ b/packages/event-handler/src/types/rest.ts @@ -75,7 +75,7 @@ type HttpMethod = keyof typeof HttpVerbs; type HttpStatusCode = (typeof HttpStatusCodes)[keyof typeof HttpStatusCodes]; -type Path = `/${string}`; +type Path = `/${string}` | RegExp; type RestRouteHandlerOptions = { handler: RouteHandler; diff --git a/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts b/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts index a2de67e709..3fdd5b0954 100644 --- a/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts @@ -190,4 +190,32 @@ describe('Class: Router - Basic Routing', () => { 'Handler for method: GET and path: /todos already exists. The previous handler will be replaced.' ); }); + + it.each([ + ['/files/test', 'GET', 'serveFileOverride'], + ['/api/v1/test', 'GET', 'apiVersioning'], + ['/users/1/files/test', 'GET', 'dynamicRegex1'], + ['/any-route', 'GET', 'getAnyRoute'], + ['/no-matches', 'POST', 'catchAllUnmatched'], + ])('routes %s %s to %s handler', async (path, method, expectedApi) => { + // Prepare + const app = new Router(); + app.get(/\/files\/.+/, async () => ({ api: 'serveFile' })); + app.get(/\/files\/.+/, async () => ({ api: 'serveFileOverride' })); + app.get(/\/api\/v\d+\/.*/, async () => ({ api: 'apiVersioning' })); + app.get(/\/users\/:userId\/files\/.+/, async (reqCtx) => ({ + api: `dynamicRegex${reqCtx.params.userId}`, + })); + app.get(/.+/, async () => ({ api: 'getAnyRoute' })); + app.route(async () => ({ api: 'catchAllUnmatched' }), { + path: /.*/, + method: [HttpVerbs.GET, HttpVerbs.POST], + }); + + // Act + const result = await app.resolve(createTestEvent(path, method), context); + + // Assess + expect(JSON.parse(result.body).api).toEqual(expectedApi); + }); }); diff --git a/packages/event-handler/tests/unit/rest/utils.test.ts b/packages/event-handler/tests/unit/rest/utils.test.ts index 478b7225bb..8b0fbeadad 100644 --- a/packages/event-handler/tests/unit/rest/utils.test.ts +++ b/packages/event-handler/tests/unit/rest/utils.test.ts @@ -581,12 +581,15 @@ describe('Path Utilities', () => { { path: '/test', prefix: '/prefix', expected: '/prefix/test' }, { path: '/', prefix: '/prefix', expected: '/prefix' }, { path: '/test', expected: '/test' }, + { path: /.+/, prefix: '/prefix', expected: /\/prefix\/.+/ }, + { path: '/test', prefix: /\/prefix/, expected: /\/prefix\/test/ }, + { path: /.+/, prefix: /\/prefix/, expected: /\/prefix\/.+/ }, ])('resolves prefixed path', ({ path, prefix, expected }) => { // Prepare & Act const resolvedPath = resolvePrefixedPath(path as Path, prefix as Path); // Assert - expect(resolvedPath).toBe(expected); + expect(resolvedPath).toEqual(expected); }); }); From 1e98953bc8f3142aa98ebe8e838f1fda58f9916c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 18:50:04 +0100 Subject: [PATCH 213/255] chore(deps): bump @types/node from 24.6.1 to 24.6.2 (#4613) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/app/package.json | 4 ++-- package-lock.json | 12 ++++++------ package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 3132265d7e..5ff8b5c7d9 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -30,7 +30,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.153", - "@types/node": "24.6.1", + "@types/node": "24.6.2", "aws-cdk-lib": "^2.219.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -49,7 +49,7 @@ "@aws-sdk/lib-dynamodb": "^3.896.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.153", - "@types/node": "24.6.1", + "@types/node": "24.6.2", "aws-cdk": "^2.1029.4", "constructs": "^10.4.2", "esbuild": "^0.25.10", diff --git a/package-lock.json b/package-lock.json index 886c2a6eea..6e792f61c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.5", "@types/aws-lambda": "^8.10.153", - "@types/node": "^24.6.1", + "@types/node": "^24.6.2", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.2.3", @@ -60,7 +60,7 @@ "@aws-sdk/lib-dynamodb": "^3.896.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.153", - "@types/node": "24.6.1", + "@types/node": "24.6.2", "aws-cdk": "^2.1029.4", "constructs": "^10.4.2", "esbuild": "^0.25.10", @@ -68,7 +68,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.153", - "@types/node": "24.6.1", + "@types/node": "24.6.2", "aws-cdk-lib": "^2.219.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -5096,9 +5096,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.6.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.6.1.tgz", - "integrity": "sha512-ljvjjs3DNXummeIaooB4cLBKg2U6SPI6Hjra/9rRIy7CpM0HpLtG9HptkMKAb4HYWy5S7HUvJEuWgr/y0U8SHw==", + "version": "24.6.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.6.2.tgz", + "integrity": "sha512-d2L25Y4j+W3ZlNAeMKcy7yDsK425ibcAOO2t7aPTz6gNMH0z2GThtwENCDc0d/Pw9wgyRqE5Px1wkV7naz8ang==", "license": "MIT", "dependencies": { "undici-types": "~7.13.0" diff --git a/package.json b/package.json index 5379f5586a..0227d4cd9f 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.5", "@types/aws-lambda": "^8.10.153", - "@types/node": "^24.6.1", + "@types/node": "^24.6.2", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.2.3", From 0453ecd92840ed0b154bc08b91765303ecf80ec3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 18:52:13 +0100 Subject: [PATCH 214/255] chore(deps): bump github/codeql-action from 3.30.5 to 3.30.6 (#4612) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- .github/workflows/ossf_scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ossf_scorecard.yml b/.github/workflows/ossf_scorecard.yml index 13de519d6e..48807df55f 100644 --- a/.github/workflows/ossf_scorecard.yml +++ b/.github/workflows/ossf_scorecard.yml @@ -43,6 +43,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@3599b3baa15b485a2e49ef411a7a4bb2452e7f93 # v3.29.5 + uses: github/codeql-action/upload-sarif@64d10c13136e1c5bce3e5fbde8d4906eeaafc885 # v3.29.5 with: sarif_file: results.sarif From 3cbf68d736118f843a44e030a94c8a00a4d9442b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 4 Oct 2025 17:01:58 +0200 Subject: [PATCH 215/255] chore(deps): bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.25 to 4.0.0 (#4587) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/secure-workflows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/secure-workflows.yml b/.github/workflows/secure-workflows.yml index fb138a563b..ec6d2ee910 100644 --- a/.github/workflows/secure-workflows.yml +++ b/.github/workflows/secure-workflows.yml @@ -32,6 +32,6 @@ jobs: - name: Checkout code uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Ensure 3rd party workflows have SHA pinned - uses: zgosalvez/github-actions-ensure-sha-pinned-actions@fc87bb5b5a97953d987372e74478de634726b3e5 # v3.0.25 + uses: zgosalvez/github-actions-ensure-sha-pinned-actions@9e9574ef04ea69da568d6249bd69539ccc704e74 # v4.0.0 with: allowlist: slsa-framework/slsa-github-generator \ No newline at end of file From d4a04bbb9681a83a248d2ef58ffc61241a3a696f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 10:48:26 +0100 Subject: [PATCH 216/255] chore(deps): bump @types/node from 24.6.2 to 24.7.0 (#4618) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/app/package.json | 4 ++-- package-lock.json | 20 ++++++++++---------- package.json | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 5ff8b5c7d9..b32ce6148b 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -30,7 +30,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.153", - "@types/node": "24.6.2", + "@types/node": "24.7.0", "aws-cdk-lib": "^2.219.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -49,7 +49,7 @@ "@aws-sdk/lib-dynamodb": "^3.896.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.153", - "@types/node": "24.6.2", + "@types/node": "24.7.0", "aws-cdk": "^2.1029.4", "constructs": "^10.4.2", "esbuild": "^0.25.10", diff --git a/package-lock.json b/package-lock.json index 6e792f61c3..4f145bb004 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.5", "@types/aws-lambda": "^8.10.153", - "@types/node": "^24.6.2", + "@types/node": "^24.7.0", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.2.3", @@ -60,7 +60,7 @@ "@aws-sdk/lib-dynamodb": "^3.896.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.153", - "@types/node": "24.6.2", + "@types/node": "24.7.0", "aws-cdk": "^2.1029.4", "constructs": "^10.4.2", "esbuild": "^0.25.10", @@ -68,7 +68,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.153", - "@types/node": "24.6.2", + "@types/node": "24.7.0", "aws-cdk-lib": "^2.219.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -5096,12 +5096,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.6.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.6.2.tgz", - "integrity": "sha512-d2L25Y4j+W3ZlNAeMKcy7yDsK425ibcAOO2t7aPTz6gNMH0z2GThtwENCDc0d/Pw9wgyRqE5Px1wkV7naz8ang==", + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.0.tgz", + "integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==", "license": "MIT", "dependencies": { - "undici-types": "~7.13.0" + "undici-types": "~7.14.0" } }, "node_modules/@types/promise-retry": { @@ -10094,9 +10094,9 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.13.0.tgz", - "integrity": "sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", + "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", "license": "MIT" }, "node_modules/unicorn-magic": { diff --git a/package.json b/package.json index 0227d4cd9f..5122836f24 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.5", "@types/aws-lambda": "^8.10.153", - "@types/node": "^24.6.2", + "@types/node": "^24.7.0", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.2.3", From a6a22020d8583286e8dd85d466aa67329a8965bc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 10:54:19 +0100 Subject: [PATCH 217/255] chore(deps): bump actions/stale from 10.0.0 to 10.1.0 (#4616) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- .github/workflows/stale-issues.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale-issues.yml b/.github/workflows/stale-issues.yml index 38ad8b2f6b..82a3aefd16 100644 --- a/.github/workflows/stale-issues.yml +++ b/.github/workflows/stale-issues.yml @@ -13,7 +13,7 @@ jobs: permissions: issues: write steps: - - uses: actions/stale@3a9db7e6a41a89f618792c92c0e97cc736e1b13f # v10.0.0 + - uses: actions/stale@5f858e3efba33a5ca4407a664cc011ad407f2008 # v10.1.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-issue-message: "This issue has not received a response in 2 weeks. If you still think there is a problem, please leave a comment to avoid the issue from automatically closing." From 52d6e0cf7cb4c6ef4b16cfb1cb7d4e6eab032c10 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 10:58:10 +0100 Subject: [PATCH 218/255] chore(deps): bump mkdocs-llmstxt from 0.3.2 to 0.4.0 in /docs (#4615) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- docs/requirements.in | 2 +- docs/requirements.txt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/requirements.in b/docs/requirements.in index c6bc268df8..ab56b6a8c3 100644 --- a/docs/requirements.in +++ b/docs/requirements.in @@ -3,4 +3,4 @@ mkdocs-material==9.6.21 mkdocs-git-revision-date-plugin==0.3.2 mkdocs-exclude==1.0.2 mkdocs-typedoc==1.0.4 -mkdocs-llmstxt==0.3.2 +mkdocs-llmstxt==0.4.0 diff --git a/docs/requirements.txt b/docs/requirements.txt index ee767033e9..a001ebc3da 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -272,9 +272,9 @@ mkdocs-get-deps==0.2.0 \ mkdocs-git-revision-date-plugin==0.3.2 \ --hash=sha256:2e67956cb01823dd2418e2833f3623dee8604cdf223bddd005fe36226a56f6ef # via -r requirements.in -mkdocs-llmstxt==0.3.2 \ - --hash=sha256:dd63acb8257fca3244058fd820acd4700c1626dbe48ad3a1a2cc9c599f8e4b7f \ - --hash=sha256:fb363205d6f1452411dc5069f62012cb6b29e1788f6db9cc17793bdca7eabea8 +mkdocs-llmstxt==0.4.0 \ + --hash=sha256:7244bf0ac917c9964030c93e9c3e26c02d2d14a0f66fc113416007125b6da0fc \ + --hash=sha256:a7e4d20496bc8c55b6773b55c8d69cf552448a9ad38915b6e8c657ae3a46c8b8 # via -r requirements.in mkdocs-material==9.6.21 \ --hash=sha256:aa6a5ab6fb4f6d381588ac51da8782a4d3757cb3d1b174f81a2ec126e1f22c92 \ From c8177df94815242da4dffabf3593880f9b20172b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 11:05:18 +0100 Subject: [PATCH 219/255] chore(deps): bump the aws-sdk-v3 group across 1 directory with 99 updates (#4619) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- examples/app/package.json | 4 +- examples/snippets/package.json | 10 +- package-lock.json | 3272 ++++++++++++++--------------- packages/idempotency/package.json | 4 +- packages/metrics/package.json | 2 +- packages/parameters/package.json | 10 +- packages/testing/package.json | 4 +- packages/tracer/package.json | 4 +- 8 files changed, 1655 insertions(+), 1655 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index b32ce6148b..35ea342418 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -45,8 +45,8 @@ "@aws-lambda-powertools/metrics": "^2.27.0", "@aws-lambda-powertools/parameters": "^2.27.0", "@aws-lambda-powertools/tracer": "^2.27.0", - "@aws-sdk/client-ssm": "^3.896.0", - "@aws-sdk/lib-dynamodb": "^3.896.0", + "@aws-sdk/client-ssm": "^3.901.0", + "@aws-sdk/lib-dynamodb": "^3.902.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.153", "@types/node": "24.7.0", diff --git a/examples/snippets/package.json b/examples/snippets/package.json index 5d99a62502..d4c0389940 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -34,11 +34,11 @@ "@aws-lambda-powertools/parameters": "^2.27.0", "@aws-lambda-powertools/parser": "^2.27.0", "@aws-lambda-powertools/tracer": "^2.27.0", - "@aws-sdk/client-appconfigdata": "^3.896.0", - "@aws-sdk/client-dynamodb": "^3.896.0", - "@aws-sdk/client-secrets-manager": "^3.896.0", - "@aws-sdk/client-ssm": "^3.896.0", - "@aws-sdk/util-dynamodb": "^3.896.0", + "@aws-sdk/client-appconfigdata": "^3.901.0", + "@aws-sdk/client-dynamodb": "^3.902.0", + "@aws-sdk/client-secrets-manager": "^3.901.0", + "@aws-sdk/client-ssm": "^3.901.0", + "@aws-sdk/util-dynamodb": "^3.902.0", "@middy/core": "^4.7.0", "@redis/client": "^5.8.3", "@valkey/valkey-glide": "^2.1.0", diff --git a/package-lock.json b/package-lock.json index 4f145bb004..8f09ca2f63 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,8 +56,8 @@ "@aws-lambda-powertools/metrics": "^2.27.0", "@aws-lambda-powertools/parameters": "^2.27.0", "@aws-lambda-powertools/tracer": "^2.27.0", - "@aws-sdk/client-ssm": "^3.896.0", - "@aws-sdk/lib-dynamodb": "^3.896.0", + "@aws-sdk/client-ssm": "^3.901.0", + "@aws-sdk/lib-dynamodb": "^3.902.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.153", "@types/node": "24.7.0", @@ -95,11 +95,11 @@ "@aws-lambda-powertools/parameters": "^2.27.0", "@aws-lambda-powertools/parser": "^2.27.0", "@aws-lambda-powertools/tracer": "^2.27.0", - "@aws-sdk/client-appconfigdata": "^3.896.0", - "@aws-sdk/client-dynamodb": "^3.896.0", - "@aws-sdk/client-secrets-manager": "^3.896.0", - "@aws-sdk/client-ssm": "^3.896.0", - "@aws-sdk/util-dynamodb": "^3.896.0", + "@aws-sdk/client-appconfigdata": "^3.901.0", + "@aws-sdk/client-dynamodb": "^3.902.0", + "@aws-sdk/client-secrets-manager": "^3.901.0", + "@aws-sdk/client-ssm": "^3.901.0", + "@aws-sdk/util-dynamodb": "^3.902.0", "@middy/core": "^4.7.0", "@redis/client": "^5.8.3", "@valkey/valkey-glide": "^2.1.0", @@ -874,51 +874,51 @@ "link": true }, "node_modules/@aws-sdk/client-appconfigdata": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.896.0.tgz", - "integrity": "sha512-C0ns/l6STvDei0Y8CTLwSbz0QmtSZxJJyHGCNE4vDXc57eTGjDy/y8YOCpDCknqzfTTYdAfm6TllOsXj1uaJ9Q==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.901.0.tgz", + "integrity": "sha512-OnYxUW20qJRWcL1PScPtny1y30hN1wNRYqaAjnkFfT+GFMoBCNwGXNIYJnZ8L9i1Hd+459K7hOJLbnm6oUYa7g==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@smithy/util-endpoints": "^3.1.2", - "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.2", - "@smithy/util-stream": "^4.3.2", - "@smithy/util-utf8": "^4.1.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-node": "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-stream": "^4.4.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -926,50 +926,50 @@ } }, "node_modules/@aws-sdk/client-appsync": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-appsync/-/client-appsync-3.896.0.tgz", - "integrity": "sha512-QT4PcrOZu00HshRAlkQSc7nHiQ6X8a52AFdYx6bk3/vI4dUgpuSawqeKgitx5axPmMQGudsGgF7mAKME9xBz0Q==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appsync/-/client-appsync-3.901.0.tgz", + "integrity": "sha512-f5f14lmX7YrJ8htuEA8KAGmRuPHOyJ6/PaQpuPsquW19PWlq5weDDAZA9DD9SsBQDBM3DVQ+KRUf0t95bRweAA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@smithy/util-endpoints": "^3.1.2", - "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.2", - "@smithy/util-stream": "^4.3.2", - "@smithy/util-utf8": "^4.1.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-node": "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-stream": "^4.4.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -977,51 +977,51 @@ } }, "node_modules/@aws-sdk/client-cloudcontrol": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudcontrol/-/client-cloudcontrol-3.896.0.tgz", - "integrity": "sha512-CctiVyI8hwLHcPFnH8WQ13CSZfJQchaqniPcNKwmKV7JPtImeL5DtYeLobqOCNfcFnlddAvMqAx2Ak2OjVVrhw==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudcontrol/-/client-cloudcontrol-3.901.0.tgz", + "integrity": "sha512-V2aR2ZGwbWbAloCzs23Yl4VaE4cuvcobh0pqKj9qYS5c+mnjj537gkl0ZcTet1ohkGVODPb7cQ1VJkOecs8Lfw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@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", - "@smithy/uuid": "^1.0.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-node": "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", "tslib": "^2.6.2" }, "engines": { @@ -1029,51 +1029,51 @@ } }, "node_modules/@aws-sdk/client-cloudformation": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.896.0.tgz", - "integrity": "sha512-jNt7SabJK94Y2HmUNrEK38OV67DGcU1Yx8suz5W/qmzU4760fPGlsizmZ9dWa3JDa3FpJS5fl6uo4sm1QUYlNA==", + "version": "3.902.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.902.0.tgz", + "integrity": "sha512-YqhLj8DQmvt66YJngoT5ZAEOEuQXJdtAxQXzbdJo3eaKqnwvER2v0WLDalxXZ/7tXj7lKsNPEf3K0ov/BOpRUA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@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", - "@smithy/uuid": "^1.0.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-node": "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", "tslib": "^2.6.2" }, "engines": { @@ -1081,52 +1081,52 @@ } }, "node_modules/@aws-sdk/client-cloudwatch": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.896.0.tgz", - "integrity": "sha512-DZ5C1WXjQcDhiPHxEHeZHMSsc6DChNGdWM4tu/HX0dkX15hTc1g925Y7fpYJa4XXPrU77ivYkZgbITz5PLp+8A==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.901.0.tgz", + "integrity": "sha512-zWZEgOb3V8cMsYfrzExScBNg60+knIQt84ysX2zouzVWdd93q6UlR1fzqSonflEpojibrwJRgL5dOG9wkdze1g==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.0", - "@smithy/fetch-http-handler": "^5.2.1", - "@smithy/hash-node": "^4.1.1", - "@smithy/invalid-dependency": "^4.1.1", - "@smithy/middleware-compression": "^4.2.4", - "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@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.901.0", + "@aws-sdk/credential-provider-node": "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-compression": "^4.3.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", "tslib": "^2.6.2" }, "engines": { @@ -1134,53 +1134,53 @@ } }, "node_modules/@aws-sdk/client-cloudwatch-logs": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.896.0.tgz", - "integrity": "sha512-5vo3e9XsRftCut0FLASE1OsW7EWFk/pDQIbWOKx65f+kg8uXaNGOa61WuRU4JhdDdulM86JkLtMlsoUkVtxb4Q==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.901.0.tgz", + "integrity": "sha512-36T3Vev/StVPPkZG8zhs+Pzch4T1LtwGZgPluF5nyaRO+s/1KbzwUEaKV/6Ts3DvdA6bq8aNBQ0psss6+r0LDw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.0", - "@smithy/eventstream-serde-browser": "^4.1.1", - "@smithy/eventstream-serde-config-resolver": "^4.2.1", - "@smithy/eventstream-serde-node": "^4.1.1", - "@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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@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/uuid": "^1.0.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-node": "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/eventstream-serde-browser": "^4.2.0", + "@smithy/eventstream-serde-config-resolver": "^4.3.0", + "@smithy/eventstream-serde-node": "^4.2.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/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { @@ -1188,49 +1188,49 @@ } }, "node_modules/@aws-sdk/client-codebuild": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-codebuild/-/client-codebuild-3.896.0.tgz", - "integrity": "sha512-HtwoDIelFV2fzuAPvROsF67Uj8dPJqEfCDfrWdTKfo4QlW0auoWHVtGdp6cTvd6AcU0aSgB6L5TjJ/jk26enoQ==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-codebuild/-/client-codebuild-3.901.0.tgz", + "integrity": "sha512-UV4dn04Y7xIjXEGe+DigjKHPrgob2j6cLhBAD+gO+v1sUQOXDYHZS0EKQKY3rIWjs96+LabaoMxY1CQWwpliGg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@smithy/util-endpoints": "^3.1.2", - "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.2", - "@smithy/util-utf8": "^4.1.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-node": "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", "tslib": "^2.6.2" }, "engines": { @@ -1238,49 +1238,49 @@ } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.896.0.tgz", - "integrity": "sha512-W1q+Csw5WKeJIeWsE9U3FCBLfLEZQ5Wkrk+Owf/TVAk9tObW8KrTjMxrJOpB1kcLXIGs0xyL8x0u86pOHy2Ryw==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.901.0.tgz", + "integrity": "sha512-cDJ+npYeAiS9u/52RwR0AHgneEF+rnyxiYm4d/c4FTI6xTQId3hSD0zdK0EgZ1wfoMk0/+5Ft6mYk0V6JN+cbQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@smithy/util-endpoints": "^3.1.2", - "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.2", - "@smithy/util-utf8": "^4.1.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-node": "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", "tslib": "^2.6.2" }, "engines": { @@ -1288,52 +1288,52 @@ } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.896.0.tgz", - "integrity": "sha512-f52lWRtrcG7IMS3wAGOOkq5Ra4rhqu9VlAnMn8wwsvKz2WmCYDvxQTuTpaIXuvTeMGVVhBT4lUR1aRtzBHxSHw==", + "version": "3.902.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.902.0.tgz", + "integrity": "sha512-WoBzn00MEvnhKFkrFPpqDjHxaqOriwJ2N00/GsoppHiMMPqinN53wB/phur7BsvhQCZZMbnIWrslcZcQxOzFLg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-endpoint-discovery": "3.893.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@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", - "@smithy/uuid": "^1.0.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", "tslib": "^2.6.2" }, "engines": { @@ -1341,52 +1341,52 @@ } }, "node_modules/@aws-sdk/client-ec2": { - "version": "3.898.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ec2/-/client-ec2-3.898.0.tgz", - "integrity": "sha512-r2GnOh/h/rwDMSu82fDoXuOTUOAIl9hRwJp694rbgRz1fQ1kFGwiIwQJyq7WLx/m5fjYXu9Qt+MFKLcwr0h6BQ==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ec2/-/client-ec2-3.901.0.tgz", + "integrity": "sha512-0/bhQfS8ytQseA4jfY+dHS9mkl8q89KPeYeIRYjun+TxemQ6+Xgi3itY7ZKwN4cMTYX8ct6T0oOkRy0cVU7Z4Q==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-sdk-ec2": "3.896.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@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", - "@smithy/uuid": "^1.0.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-node": "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-sdk-ec2": "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", "tslib": "^2.6.2" }, "engines": { @@ -1394,50 +1394,50 @@ } }, "node_modules/@aws-sdk/client-ecr": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.896.0.tgz", - "integrity": "sha512-/pLuF5c6MoOWWXTu7juoxKWcdeNXbNbK+DQMk2sgVHrhH6RVpb5K9dyziiu32xtYvEFYfa3SULr447GLzFMNRw==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.901.0.tgz", + "integrity": "sha512-Rd+Ky6kBAbQwVUfd04ZigRsKf9Hc71U2fQHPWu+hkvOS7CypeS38u+HxeTJDn4T6E8ijKBo4UcoNROsgxil5sA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@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.901.0", + "@aws-sdk/credential-provider-node": "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", "tslib": "^2.6.2" }, "engines": { @@ -1445,51 +1445,51 @@ } }, "node_modules/@aws-sdk/client-ecs": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecs/-/client-ecs-3.896.0.tgz", - "integrity": "sha512-AhsYZZ84gl8q61NbXhgtqDvUTozAIsaJV+Yk0fxBbMnbeBC3GV4AtvalWYzeVyXN8vLML4q73iExwkr87/tG9Q==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecs/-/client-ecs-3.901.0.tgz", + "integrity": "sha512-D6Aa5XiIFye87bUxD0oGw/kfVS6Jz67fbqLiK8flFdEiNc1JBWkNy4rOhSVWOA79WbWmA9UV9yH9nQzs9o9GWQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@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", - "@smithy/uuid": "^1.0.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-node": "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", "tslib": "^2.6.2" }, "engines": { @@ -1497,50 +1497,50 @@ } }, "node_modules/@aws-sdk/client-elastic-load-balancing-v2": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-elastic-load-balancing-v2/-/client-elastic-load-balancing-v2-3.896.0.tgz", - "integrity": "sha512-3nBzKlXytcpqx8IegcVhYZMPyw9CqJ8BV/kXYK+aiAa6uPd86Ag6G4A/D+2DLZMXnRO7Jx3OBfHINXbb/cejvg==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-elastic-load-balancing-v2/-/client-elastic-load-balancing-v2-3.901.0.tgz", + "integrity": "sha512-kC6GNaBogiIS9HVsreIwc4MpKy/9Kuz2H3ytoSsYwSC7zswKxrtJcrqCBuprUR9rUETdz5EhCgIfI6IPdCIOKw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@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.901.0", + "@aws-sdk/credential-provider-node": "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", "tslib": "^2.6.2" }, "engines": { @@ -1548,50 +1548,50 @@ } }, "node_modules/@aws-sdk/client-iam": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-iam/-/client-iam-3.896.0.tgz", - "integrity": "sha512-WLZJtfc322wFEVKPIQQRifGrfwQ9YZIGRcAVRVn8a1FHmItZk/kKjjA/ZkWJ1YOLGp2QY0MuqrK65CUGSsvFfw==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-iam/-/client-iam-3.901.0.tgz", + "integrity": "sha512-rQAMK+hAyOUHW5ZOk94UyHCDndklSW1Aq2OIZa9l9icwdQpDPZQSAWb+ki+GVk9eII8Hpwq+BCc18Fki1lvtLw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@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.901.0", + "@aws-sdk/credential-provider-node": "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", "tslib": "^2.6.2" }, "engines": { @@ -1599,49 +1599,49 @@ } }, "node_modules/@aws-sdk/client-kms": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.896.0.tgz", - "integrity": "sha512-6kVxV+s8xEQFaEIRXacMgGxuRBqMVS0tR5ucjWa5bfjWbmlbzCDfddWUopMR3J3HvfuKvyAeap53FP9CDQ6Dyw==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.901.0.tgz", + "integrity": "sha512-QpQCzGL3++2nanUsh4mOoWFHN510OgYrB70t6xNcz6CWaFedYcsX0Zjq6UAulWoQ2UGnMZkvZ4MElG0AQBu92w==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@smithy/util-endpoints": "^3.1.2", - "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.2", - "@smithy/util-utf8": "^4.1.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-node": "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", "tslib": "^2.6.2" }, "engines": { @@ -1649,54 +1649,54 @@ } }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.896.0.tgz", - "integrity": "sha512-zZX06gmp1GHE+HF1xbNidDF5lzNcm+hkXepJtYkpLEdvJk7Zv8+p6hRZ3kPpmswHmGpb4en1hqSIGgUimQBCXw==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.901.0.tgz", + "integrity": "sha512-4h6dgXKMGuK/hplMpdKbxQDtjy2laVoOO7Mml4/DPO6TVu8TIP6JQXo3SLCE6BUkqchZdXVKGtD7YCWsEBilcw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.0", - "@smithy/eventstream-serde-browser": "^4.1.1", - "@smithy/eventstream-serde-config-resolver": "^4.2.1", - "@smithy/eventstream-serde-node": "^4.1.1", - "@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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@smithy/util-endpoints": "^3.1.2", - "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.2", - "@smithy/util-stream": "^4.3.2", - "@smithy/util-utf8": "^4.1.0", - "@smithy/util-waiter": "^4.1.1", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-node": "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/eventstream-serde-browser": "^4.2.0", + "@smithy/eventstream-serde-config-resolver": "^4.3.0", + "@smithy/eventstream-serde-node": "^4.2.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-stream": "^4.4.0", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -1704,52 +1704,52 @@ } }, "node_modules/@aws-sdk/client-route-53": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-route-53/-/client-route-53-3.896.0.tgz", - "integrity": "sha512-87KUzqSAQXPifJPgO5m2kTcbyeXL8djJ4Hvi95ok+kOm84k5mYoXhzVfjWlUL4nKs9WInBcQXYcX8YBxnDZEJg==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-route-53/-/client-route-53-3.901.0.tgz", + "integrity": "sha512-rxBB4nodmoq4H893PFQWuuqGP8786p/qWym88p+96ErN1nONyuZQZvF7VeLXg1HgfILLq5UAIcZBGXgdjg7OIA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-sdk-route53": "3.894.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@aws-sdk/xml-builder": "3.894.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@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.901.0", + "@aws-sdk/credential-provider-node": "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-sdk-route53": "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", + "@aws-sdk/xml-builder": "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", "tslib": "^2.6.2" }, "engines": { @@ -1757,67 +1757,67 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.896.0.tgz", - "integrity": "sha512-UETVuMLQRqgrWxTnavotY0TlB/jaR9sL3hkIFPx4KtjmigNBdwRaiVfOuTnIXKd+w9RPINYG//nnrK+5gIyZkA==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.901.0.tgz", + "integrity": "sha512-wyKhZ51ur1tFuguZ6PgrUsot9KopqD0Tmxw8O8P/N3suQDxFPr0Yo7Y77ezDRDZQ95Ml3C0jlvx79HCo8VxdWA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-bucket-endpoint": "3.893.0", - "@aws-sdk/middleware-expect-continue": "3.893.0", - "@aws-sdk/middleware-flexible-checksums": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-location-constraint": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-sdk-s3": "3.896.0", - "@aws-sdk/middleware-ssec": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/signature-v4-multi-region": "3.896.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@aws-sdk/xml-builder": "3.894.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.0", - "@smithy/eventstream-serde-browser": "^4.1.1", - "@smithy/eventstream-serde-config-resolver": "^4.2.1", - "@smithy/eventstream-serde-node": "^4.1.1", - "@smithy/fetch-http-handler": "^5.2.1", - "@smithy/hash-blob-browser": "^4.1.1", - "@smithy/hash-node": "^4.1.1", - "@smithy/hash-stream-node": "^4.1.1", - "@smithy/invalid-dependency": "^4.1.1", - "@smithy/md5-js": "^4.1.1", - "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@smithy/util-endpoints": "^3.1.2", - "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.2", - "@smithy/util-stream": "^4.3.2", - "@smithy/util-utf8": "^4.1.0", - "@smithy/util-waiter": "^4.1.1", - "@smithy/uuid": "^1.0.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-node": "3.901.0", + "@aws-sdk/middleware-bucket-endpoint": "3.901.0", + "@aws-sdk/middleware-expect-continue": "3.901.0", + "@aws-sdk/middleware-flexible-checksums": "3.901.0", + "@aws-sdk/middleware-host-header": "3.901.0", + "@aws-sdk/middleware-location-constraint": "3.901.0", + "@aws-sdk/middleware-logger": "3.901.0", + "@aws-sdk/middleware-recursion-detection": "3.901.0", + "@aws-sdk/middleware-sdk-s3": "3.901.0", + "@aws-sdk/middleware-ssec": "3.901.0", + "@aws-sdk/middleware-user-agent": "3.901.0", + "@aws-sdk/region-config-resolver": "3.901.0", + "@aws-sdk/signature-v4-multi-region": "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", + "@aws-sdk/xml-builder": "3.901.0", + "@smithy/config-resolver": "^4.3.0", + "@smithy/core": "^3.14.0", + "@smithy/eventstream-serde-browser": "^4.2.0", + "@smithy/eventstream-serde-config-resolver": "^4.3.0", + "@smithy/eventstream-serde-node": "^4.2.0", + "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/hash-blob-browser": "^4.2.0", + "@smithy/hash-node": "^4.2.0", + "@smithy/hash-stream-node": "^4.2.0", + "@smithy/invalid-dependency": "^4.2.0", + "@smithy/md5-js": "^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-stream": "^4.4.0", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.0", + "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { @@ -1825,50 +1825,50 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.896.0.tgz", - "integrity": "sha512-0e/9jcLDqAosEWNHPLj13KAhQn7oIqmVv78eR+DCxP4HOwL/1saQ/ZDRzqdwn9gUuq4Rjh1JZQdEFZyLWtVOYg==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.901.0.tgz", + "integrity": "sha512-k5HEJfPiwgGVAjDGRPbysD3K2W0iMKQUv3zKTqHLFxog6X7JBrKGNgQwwtdz3vE5z9SFjGov7cFS1T1QuLVKQg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@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/uuid": "^1.0.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-node": "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/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { @@ -1876,50 +1876,50 @@ } }, "node_modules/@aws-sdk/client-sfn": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sfn/-/client-sfn-3.896.0.tgz", - "integrity": "sha512-LtsY8e+JWP64ssyEHplo49nUfiNuvTmad/eEYD1+qIUwACOkRJYyMsrbKl4UM/XpJWOrqsl4TuBixPV8WUDxOw==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sfn/-/client-sfn-3.901.0.tgz", + "integrity": "sha512-B7j+vMTEYxTifn4uG3ZQVVOSpIHwLU/tfJ98h15eDt/D29To/OucmkGMqjdQ+a55c5PQ/lP3FdJxOR9ZbWMjGw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@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/uuid": "^1.0.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-node": "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/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { @@ -1927,51 +1927,51 @@ } }, "node_modules/@aws-sdk/client-ssm": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.896.0.tgz", - "integrity": "sha512-tMTwUZ5/DkWuP7/1U805gXIFRoKQnFvuT0v082VorPx9oqGo33D4jz7miDHFDNx+gy/w+wfiPENJd2n9aRY/CA==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.901.0.tgz", + "integrity": "sha512-u0GoXcrxHIBpITZIfw8AUabjQutCbRFAoHl+zT0qLylZ5dOOVydP2++CI+DK6Z7ZcOluJorQ+z/53IniZqkjZA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@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", - "@smithy/uuid": "^1.0.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-node": "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", "tslib": "^2.6.2" }, "engines": { @@ -1979,48 +1979,48 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.896.0.tgz", - "integrity": "sha512-mpE3mrNili1dcvEvxaYjyoib8HlRXkb2bY5a3WeK++KObFY+HUujKtgQmiNSRX5YwQszm//fTrmGMmv9zpMcKg==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.901.0.tgz", + "integrity": "sha512-sGyDjjkJ7ppaE+bAKL/Q5IvVCxtoyBIzN+7+hWTS/mUxWJ9EOq9238IqmVIIK6sYNIzEf9yhobfMARasPYVTNg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@smithy/util-endpoints": "^3.1.2", - "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.2", - "@smithy/util-utf8": "^4.1.0", + "@aws-sdk/core": "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", "tslib": "^2.6.2" }, "engines": { @@ -2028,49 +2028,49 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.896.0.tgz", - "integrity": "sha512-mEbbWGwGZbKCHgwAIm9aRCRcCnv6N9AZf3U0dMFwpYtVXVJvRWTK0OW2d49I2swaZ/GikMIccI3wxWT188OW8w==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.901.0.tgz", + "integrity": "sha512-3NQm7RShoX+cqhFcECMunNh5B2emGM5Yfi/HhMi4ZawjwTYh28pnFmc7d30zj7KG0PYQp9cUXUi5eKlCwIsx+g==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@smithy/util-endpoints": "^3.1.2", - "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.2", - "@smithy/util-utf8": "^4.1.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-node": "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", "tslib": "^2.6.2" }, "engines": { @@ -2078,50 +2078,50 @@ } }, "node_modules/@aws-sdk/client-xray": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.896.0.tgz", - "integrity": "sha512-Njatn0y3GKWlSAJtMKr7yEdaxr1EiSmkh4tiiOOxYXHZmUCAr/5yFvzYYKJl6/DqvBCDJ2o+nR/KEQ3XUT+K7g==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.901.0.tgz", + "integrity": "sha512-hcElujjrdIFmkI0MvuZntIwTE3bX7q15rvkGy7DcIYA+FXQbdnyxN1rRST+KIiCwM3BYV+IY6t3Qc++buW1M0Q==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@smithy/util-endpoints": "^3.1.2", - "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.2", - "@smithy/util-utf8": "^4.1.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-node": "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", "tslib": "^2.6.2" }, "engines": { @@ -2129,23 +2129,23 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.896.0.tgz", - "integrity": "sha512-uJaoyWKeGNyCyeI+cIJrD7LEB4iF/W8/x2ij7zg32OFpAAJx96N34/e+XSKp/xkJpO5FKiBOskKLnHeUsJsAPA==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.901.0.tgz", + "integrity": "sha512-brKAc3y64tdhyuEf+OPIUln86bRTqkLgb9xkd6kUdIeA5+qmp/N6amItQz+RN4k4O3kqkCPYnAd3LonTKluobw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.893.0", - "@aws-sdk/xml-builder": "3.894.0", - "@smithy/core": "^3.12.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.4", - "@smithy/types": "^4.5.0", - "@smithy/util-base64": "^4.1.0", - "@smithy/util-middleware": "^4.1.1", - "@smithy/util-utf8": "^4.1.0", + "@aws-sdk/types": "3.901.0", + "@aws-sdk/xml-builder": "3.901.0", + "@smithy/core": "^3.14.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/signature-v4": "^5.3.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", + "@smithy/util-base64": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -2153,15 +2153,15 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.896.0.tgz", - "integrity": "sha512-5Tucq01aiXl+z1u+PH8Weow84TvrvQpiCzQtu/3Or4W/IiEQ83gxgbuGEyD+aGhHlXEYwC2SuSszsT75zfH+5Q==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.901.0.tgz", + "integrity": "sha512-irVFwiiEC+JRFQTZwI7264LOGXRjqdp3AvmqiEmmZS0+sJsEaF65prCs+nzw6J1WqQ6IZKClKKQsH7x8FfOPrQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.896.0", - "@aws-sdk/types": "3.893.0", - "@smithy/property-provider": "^4.1.1", - "@smithy/types": "^4.5.0", + "@aws-sdk/client-cognito-identity": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2169,15 +2169,15 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.896.0.tgz", - "integrity": "sha512-Cnqhupdkp825ICySrz4QTI64Nq3AmUAscPW8dueanni0avYBDp7RBppX4H0+6icqN569B983XNfQ0YSImQhfhg==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.901.0.tgz", + "integrity": "sha512-5hAdVl3tBuARh3zX5MLJ1P/d+Kr5kXtDU3xm1pxUEF4xt2XkEEpwiX5fbkNkz2rbh3BCt2gOHsAbh6b3M7n+DA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.896.0", - "@aws-sdk/types": "3.893.0", - "@smithy/property-provider": "^4.1.1", - "@smithy/types": "^4.5.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2185,20 +2185,20 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.896.0.tgz", - "integrity": "sha512-CN0fTCKCUA1OTSx1c76o8XyJCy2WoI/av3J8r8mL6GmxTerhLRyzDy/MwxzPjTYPoL+GLEg6V4a9fRkWj1hBUA==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.901.0.tgz", + "integrity": "sha512-Ggr7+0M6QZEsrqRkK7iyJLf4LkIAacAxHz9c4dm9hnDdU7vqrlJm6g73IxMJXWN1bIV7IxfpzB11DsRrB/oNjQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.896.0", - "@aws-sdk/types": "3.893.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.4", - "@smithy/types": "^4.5.0", - "@smithy/util-stream": "^4.3.2", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/node-http-handler": "^4.3.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", + "@smithy/util-stream": "^4.4.0", "tslib": "^2.6.2" }, "engines": { @@ -2206,23 +2206,23 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.896.0.tgz", - "integrity": "sha512-+rbYG98czzwZLTYHJasK+VBjnIeXk73mRpZXHvaa4kDNxBezdN2YsoGNpLlPSxPdbpq18LY3LRtkdFTaT6DIQA==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.901.0.tgz", + "integrity": "sha512-zxadcDS0hNJgv8n4hFYJNOXyfjaNE1vvqIiF/JzZSQpSSYXzCd+WxXef5bQh+W3giDtRUmkvP5JLbamEFjZKyw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-env": "3.896.0", - "@aws-sdk/credential-provider-http": "3.896.0", - "@aws-sdk/credential-provider-process": "3.896.0", - "@aws-sdk/credential-provider-sso": "3.896.0", - "@aws-sdk/credential-provider-web-identity": "3.896.0", - "@aws-sdk/nested-clients": "3.896.0", - "@aws-sdk/types": "3.893.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", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-env": "3.901.0", + "@aws-sdk/credential-provider-http": "3.901.0", + "@aws-sdk/credential-provider-process": "3.901.0", + "@aws-sdk/credential-provider-sso": "3.901.0", + "@aws-sdk/credential-provider-web-identity": "3.901.0", + "@aws-sdk/nested-clients": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/credential-provider-imds": "^4.2.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2230,22 +2230,22 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.896.0.tgz", - "integrity": "sha512-J0Jm+56MNngk1PIyqoJFf5FC2fjA4CYXlqODqNRDtid7yk7HB9W3UTtvxofmii5KJOLcHGNPdGnHWKkUc+xYgw==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.901.0.tgz", + "integrity": "sha512-dPuFzMF7L1s/lQyT3wDxqLe82PyTH+5o1jdfseTEln64LJMl0ZMWaKX/C1UFNDxaTd35Cgt1bDbjjAWHMiKSFQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.896.0", - "@aws-sdk/credential-provider-http": "3.896.0", - "@aws-sdk/credential-provider-ini": "3.896.0", - "@aws-sdk/credential-provider-process": "3.896.0", - "@aws-sdk/credential-provider-sso": "3.896.0", - "@aws-sdk/credential-provider-web-identity": "3.896.0", - "@aws-sdk/types": "3.893.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", + "@aws-sdk/credential-provider-env": "3.901.0", + "@aws-sdk/credential-provider-http": "3.901.0", + "@aws-sdk/credential-provider-ini": "3.901.0", + "@aws-sdk/credential-provider-process": "3.901.0", + "@aws-sdk/credential-provider-sso": "3.901.0", + "@aws-sdk/credential-provider-web-identity": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/credential-provider-imds": "^4.2.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2253,16 +2253,16 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.896.0.tgz", - "integrity": "sha512-UfWVMQPZy7dus40c4LWxh5vQ+I51z0q4vf09Eqas5848e9DrGRG46GYIuc/gy+4CqEypjbg/XNMjnZfGLHxVnQ==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.901.0.tgz", + "integrity": "sha512-/IWgmgM3Cl1wTdJA5HqKMAojxLkYchh5kDuphApxKhupLu6Pu0JBOHU8A5GGeFvOycyaVwosod6zDduINZxe+A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.896.0", - "@aws-sdk/types": "3.893.0", - "@smithy/property-provider": "^4.1.1", - "@smithy/shared-ini-file-loader": "^4.2.0", - "@smithy/types": "^4.5.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2270,18 +2270,18 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.896.0.tgz", - "integrity": "sha512-77Te8WrVdLABKlv7QyetXP6aYEX1UORiahLA1PXQb/p66aFBw18Xc6JiN/6zJ4RqdyV1Xr9rwYBwGYua93ANIA==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.901.0.tgz", + "integrity": "sha512-SjmqZQHmqFSET7+6xcZgtH7yEyh5q53LN87GqwYlJZ6KJ5oNw11acUNEhUOL1xTSJEvaWqwTIkS2zqrzLcM9bw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.896.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/token-providers": "3.896.0", - "@aws-sdk/types": "3.893.0", - "@smithy/property-provider": "^4.1.1", - "@smithy/shared-ini-file-loader": "^4.2.0", - "@smithy/types": "^4.5.0", + "@aws-sdk/client-sso": "3.901.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/token-providers": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2289,17 +2289,17 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.896.0.tgz", - "integrity": "sha512-gwMwZWumo+V0xJplO8j2HIb1TfPsF9fbcRGXS0CanEvjg4fF2Xs1pOQl2oCw3biPZpxHB0plNZjqSF2eneGg9g==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.901.0.tgz", + "integrity": "sha512-NYjy/6NLxH9m01+pfpB4ql8QgAorJcu8tw69kzHwUd/ql6wUDTbC7HcXqtKlIwWjzjgj2BKL7j6SyFapgCuafA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.896.0", - "@aws-sdk/nested-clients": "3.896.0", - "@aws-sdk/types": "3.893.0", - "@smithy/property-provider": "^4.1.1", - "@smithy/shared-ini-file-loader": "^4.2.0", - "@smithy/types": "^4.5.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/nested-clients": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2307,29 +2307,29 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.896.0.tgz", - "integrity": "sha512-0hj809k7+BPq/tYF7cbTX43c7MTT1cksSwPvkRai4NZDLhsRRHMy/Op419CcdQB4d4QMl0z5+8PNzOOkh0XTCQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.896.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/credential-provider-cognito-identity": "3.896.0", - "@aws-sdk/credential-provider-env": "3.896.0", - "@aws-sdk/credential-provider-http": "3.896.0", - "@aws-sdk/credential-provider-ini": "3.896.0", - "@aws-sdk/credential-provider-node": "3.896.0", - "@aws-sdk/credential-provider-process": "3.896.0", - "@aws-sdk/credential-provider-sso": "3.896.0", - "@aws-sdk/credential-provider-web-identity": "3.896.0", - "@aws-sdk/nested-clients": "3.896.0", - "@aws-sdk/types": "3.893.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.0", - "@smithy/credential-provider-imds": "^4.1.2", - "@smithy/node-config-provider": "^4.2.2", - "@smithy/property-provider": "^4.1.1", - "@smithy/types": "^4.5.0", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.901.0.tgz", + "integrity": "sha512-jaJ+sVF9xuBwYiQznjrbDkw2W8/aQijGGdzroDL1mJfwyZA0hj3zfYUion+iWwjYhb0vS0bAyrIHtjtTfA2Qpw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.901.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-cognito-identity": "3.901.0", + "@aws-sdk/credential-provider-env": "3.901.0", + "@aws-sdk/credential-provider-http": "3.901.0", + "@aws-sdk/credential-provider-ini": "3.901.0", + "@aws-sdk/credential-provider-node": "3.901.0", + "@aws-sdk/credential-provider-process": "3.901.0", + "@aws-sdk/credential-provider-sso": "3.901.0", + "@aws-sdk/credential-provider-web-identity": "3.901.0", + "@aws-sdk/nested-clients": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/config-resolver": "^4.3.0", + "@smithy/core": "^3.14.0", + "@smithy/credential-provider-imds": "^4.2.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2337,17 +2337,17 @@ } }, "node_modules/@aws-sdk/ec2-metadata-service": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/ec2-metadata-service/-/ec2-metadata-service-3.896.0.tgz", - "integrity": "sha512-oIZ83NvhS0jkpYiD2fu5ZxwZWbtjqL7pniWFvAChiPYmQkdPzefWumcJvQLkQVB3XJEWKve9HUyPiwV8+vfgYQ==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/ec2-metadata-service/-/ec2-metadata-service-3.901.0.tgz", + "integrity": "sha512-wpPwGdUkIKr1BggcPMoWSL7HGgFU4tS2zAfffChY1G6HISzYrj5+jq3CUpZj3Q9MI4ANhFTW37/33+pGF4hzKg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.893.0", - "@smithy/node-config-provider": "^4.2.2", - "@smithy/node-http-handler": "^4.2.1", - "@smithy/protocol-http": "^5.2.1", - "@smithy/types": "^4.5.0", - "@smithy/util-stream": "^4.3.2", + "@aws-sdk/types": "3.901.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/node-http-handler": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-stream": "^4.4.0", "tslib": "^2.6.2" }, "engines": { @@ -2368,34 +2368,34 @@ } }, "node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.896.0.tgz", - "integrity": "sha512-PVYBwRo1iZnDIh19YSB8qRs3Rzk6/Wi7WM2m2EdWo/QySfBXIR2Bqieqz/PehjZf8PVSZtDOKOCYVv+Agvtj4w==", + "version": "3.902.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.902.0.tgz", + "integrity": "sha512-fe7DAz/57St3lrJoxayu55CJBj8JNhTh2keR+JNtA2lDdY7FZnRalUJse5Mts2gqG5+3zUdPDfMcevu7vhXIzw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.896.0", - "@aws-sdk/util-dynamodb": "3.896.0", - "@smithy/core": "^3.12.0", - "@smithy/smithy-client": "^4.6.4", - "@smithy/types": "^4.5.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/util-dynamodb": "3.902.0", + "@smithy/core": "^3.14.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.896.0" + "@aws-sdk/client-dynamodb": "^3.902.0" } }, "node_modules/@aws-sdk/lib-storage": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.896.0.tgz", - "integrity": "sha512-EJWXL/5LxBJFujsOud3+EfRbIwy/SZiWy5ld70RdoqLS/RsfZh9+mZMJGvd3hewy7xHgDYVbxZfDh14bsvfYIQ==", + "version": "3.903.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.903.0.tgz", + "integrity": "sha512-/CFhz/QtPSI9CVAdlW6JrfMyPjnE38a8pzTi8CMCWXu51c1NqzcGXo80LZUwzWkcWk5ZqPWRYzrw43TQ8ia78w==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.4", - "@smithy/smithy-client": "^4.6.4", + "@smithy/abort-controller": "^4.2.0", + "@smithy/middleware-endpoint": "^4.3.0", + "@smithy/smithy-client": "^4.7.0", "buffer": "5.6.0", "events": "3.3.0", "stream-browserify": "3.0.0", @@ -2405,7 +2405,7 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-s3": "^3.896.0" + "@aws-sdk/client-s3": "^3.901.0" } }, "node_modules/@aws-sdk/lib-storage/node_modules/events": { @@ -2417,17 +2417,17 @@ } }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.893.0.tgz", - "integrity": "sha512-H+wMAoFC73T7M54OFIezdHXR9/lH8TZ3Cx1C3MEBb2ctlzQrVCd8LX8zmOtcGYC8plrRwV+8rNPe0FMqecLRew==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.901.0.tgz", + "integrity": "sha512-mPF3N6eZlVs9G8aBSzvtoxR1RZqMo1aIwR+X8BAZSkhfj55fVF2no4IfPXfdFO3I66N+zEQ8nKoB0uTATWrogQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.893.0", + "@aws-sdk/types": "3.901.0", "@aws-sdk/util-arn-parser": "3.893.0", - "@smithy/node-config-provider": "^4.2.2", - "@smithy/protocol-http": "^5.2.1", - "@smithy/types": "^4.5.0", - "@smithy/util-config-provider": "^4.1.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-config-provider": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -2435,16 +2435,16 @@ } }, "node_modules/@aws-sdk/middleware-endpoint-discovery": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.893.0.tgz", - "integrity": "sha512-WnKSbB397NuMm14/ydw+GbY5+KlnoHf033zIo92n/6AkNoSD1crPRG361ttDoWmk111dfBr/ki5yRfgjujtk9w==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.901.0.tgz", + "integrity": "sha512-nbqELNamIhsWcDmqa3rB5unNuOEGiNh2pEz663ZEzsa9DTasKvBHqdhVQo6DuWDvnkhAjOMrkM2sB4P45uy1Qw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/endpoint-cache": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@smithy/node-config-provider": "^4.2.2", - "@smithy/protocol-http": "^5.2.1", - "@smithy/types": "^4.5.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", "tslib": "^2.6.2" }, "engines": { @@ -2452,14 +2452,14 @@ } }, "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.893.0.tgz", - "integrity": "sha512-PEZkvD6k0X9sacHkvkVF4t2QyQEAzd35OJ2bIrjWCfc862TwukMMJ1KErRmQ1WqKXHKF4L0ed5vtWaO/8jVLNA==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.901.0.tgz", + "integrity": "sha512-bwq9nj6MH38hlJwOY9QXIDwa6lI48UsaZpaXbdD71BljEIRlxDzfB4JaYb+ZNNK7RIAdzsP/K05mJty6KJAQHw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.893.0", - "@smithy/protocol-http": "^5.2.1", - "@smithy/types": "^4.5.0", + "@aws-sdk/types": "3.901.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2467,23 +2467,23 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.896.0.tgz", - "integrity": "sha512-bB3W/IFG7HNNziACOp1aZVGGnrIahXc0PxZoU055JirEGQtDFIU1ZD7S9zLKmy9FFUvQsAeRL9nDFHbx8cwx/w==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.901.0.tgz", + "integrity": "sha512-63lcKfggVUFyXhE4SsFXShCTCyh7ZHEqXLyYEL4DwX+VWtxutf9t9m3fF0TNUYDE8eEGWiRXhegj8l4FjuW+wA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/types": "3.893.0", - "@smithy/is-array-buffer": "^4.1.0", - "@smithy/node-config-provider": "^4.2.2", - "@smithy/protocol-http": "^5.2.1", - "@smithy/types": "^4.5.0", - "@smithy/util-middleware": "^4.1.1", - "@smithy/util-stream": "^4.3.2", - "@smithy/util-utf8": "^4.1.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-stream": "^4.4.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -2491,14 +2491,14 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.893.0.tgz", - "integrity": "sha512-qL5xYRt80ahDfj9nDYLhpCNkDinEXvjLe/Qen/Y/u12+djrR2MB4DRa6mzBCkLkdXDtf0WAoW2EZsNCfGrmOEQ==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.901.0.tgz", + "integrity": "sha512-yWX7GvRmqBtbNnUW7qbre3GvZmyYwU0WHefpZzDTYDoNgatuYq6LgUIQ+z5C04/kCRoFkAFrHag8a3BXqFzq5A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.893.0", - "@smithy/protocol-http": "^5.2.1", - "@smithy/types": "^4.5.0", + "@aws-sdk/types": "3.901.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2506,13 +2506,13 @@ } }, "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.893.0.tgz", - "integrity": "sha512-MlbBc7Ttb1ekbeeeFBU4DeEZOLb5s0Vl4IokvO17g6yJdLk4dnvZro9zdXl3e7NXK+kFxHRBFZe55p/42mVgDA==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.901.0.tgz", + "integrity": "sha512-MuCS5R2ngNoYifkVt05CTULvYVWX0dvRT0/Md4jE3a0u0yMygYy31C1zorwfE/SUgAQXyLmUx8ATmPp9PppImQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.893.0", - "@smithy/types": "^4.5.0", + "@aws-sdk/types": "3.901.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2520,13 +2520,13 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.893.0.tgz", - "integrity": "sha512-ZqzMecjju5zkBquSIfVfCORI/3Mge21nUY4nWaGQy+NUXehqCGG4W7AiVpiHGOcY2cGJa7xeEkYcr2E2U9U0AA==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.901.0.tgz", + "integrity": "sha512-UoHebjE7el/tfRo8/CQTj91oNUm+5Heus5/a4ECdmWaSCHCS/hXTsU3PTTHAY67oAQR8wBLFPfp3mMvXjB+L2A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.893.0", - "@smithy/types": "^4.5.0", + "@aws-sdk/types": "3.901.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2534,15 +2534,15 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.893.0.tgz", - "integrity": "sha512-H7Zotd9zUHQAr/wr3bcWHULYhEeoQrF54artgsoUGIf/9emv6LzY89QUccKIxYd6oHKNTrTyXm9F0ZZrzXNxlg==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.901.0.tgz", + "integrity": "sha512-Wd2t8qa/4OL0v/oDpCHHYkgsXJr8/ttCxrvCKAt0H1zZe2LlRhY9gpDVKqdertfHrHDj786fOvEQA28G1L75Dg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.893.0", + "@aws-sdk/types": "3.901.0", "@aws/lambda-invoke-store": "^0.0.1", - "@smithy/protocol-http": "^5.2.1", - "@smithy/types": "^4.5.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2550,18 +2550,18 @@ } }, "node_modules/@aws-sdk/middleware-sdk-ec2": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-ec2/-/middleware-sdk-ec2-3.896.0.tgz", - "integrity": "sha512-xs9jPXprV+a1PpMJ+K+qhoi5E6keAkOEwUEPTmqYW26/89NfJEZE7Qv4Y3UnVA9xGySJIqM7M65F2D5TAvf+/Q==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-ec2/-/middleware-sdk-ec2-3.901.0.tgz", + "integrity": "sha512-gzmXVG0Jh0ofNfG8E4eq/iI4Nd4Le4rNMJPmEqE/wNdvmLvPdhXGIpNn1g7RdIkzjFyFZXO41bYL+iXV2egF2A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-format-url": "3.893.0", - "@smithy/middleware-endpoint": "^4.2.4", - "@smithy/protocol-http": "^5.2.1", - "@smithy/signature-v4": "^5.2.1", - "@smithy/smithy-client": "^4.6.4", - "@smithy/types": "^4.5.0", + "@aws-sdk/types": "3.901.0", + "@aws-sdk/util-format-url": "3.901.0", + "@smithy/middleware-endpoint": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/signature-v4": "^5.3.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2569,13 +2569,13 @@ } }, "node_modules/@aws-sdk/middleware-sdk-route53": { - "version": "3.894.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-route53/-/middleware-sdk-route53-3.894.0.tgz", - "integrity": "sha512-R2qw6EfDcAYmFij5Qwm3+21S7C6NdY9hQlTZzQL84Om+QPp3hceU09cPGM5vR5w0vSBs1mmd00jUbYRohrqjRg==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-route53/-/middleware-sdk-route53-3.901.0.tgz", + "integrity": "sha512-Y6lEtL7RpRPF7I4gdIyrAFPZOANGZqgGanmjC7bRHIX672mQZai4wWqIY7dDx9l7GFAMi/72h9U/m35VfiW+lQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.893.0", - "@smithy/types": "^4.5.0", + "@aws-sdk/types": "3.901.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2583,24 +2583,24 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.896.0.tgz", - "integrity": "sha512-hlPu/AZ5Afa4ZafP+aXIjRtKm7BX57lurA+TJ+7nXm1Az8Du3Sg2tZXP2/GfqTztLIFQYj/Jy5smkJ0+1HNAPQ==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.901.0.tgz", + "integrity": "sha512-prgjVC3fDT2VIlmQPiw/cLee8r4frTam9GILRUVQyDdNtshNwV3MiaSCLzzQJjKJlLgnBLNUHJCSmvUVtg+3iA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.896.0", - "@aws-sdk/types": "3.893.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/types": "3.901.0", "@aws-sdk/util-arn-parser": "3.893.0", - "@smithy/core": "^3.12.0", - "@smithy/node-config-provider": "^4.2.2", - "@smithy/protocol-http": "^5.2.1", - "@smithy/signature-v4": "^5.2.1", - "@smithy/smithy-client": "^4.6.4", - "@smithy/types": "^4.5.0", - "@smithy/util-config-provider": "^4.1.0", - "@smithy/util-middleware": "^4.1.1", - "@smithy/util-stream": "^4.3.2", - "@smithy/util-utf8": "^4.1.0", + "@smithy/core": "^3.14.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/signature-v4": "^5.3.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-stream": "^4.4.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -2608,13 +2608,13 @@ } }, "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.893.0.tgz", - "integrity": "sha512-e4ccCiAnczv9mMPheKjgKxZQN473mcup+3DPLVNnIw5GRbQoDqPSB70nUzfORKZvM7ar7xLMPxNR8qQgo1C8Rg==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.901.0.tgz", + "integrity": "sha512-YiLLJmA3RvjL38mFLuu8fhTTGWtp2qT24VqpucgfoyziYcTgIQkJJmKi90Xp6R6/3VcArqilyRgM1+x8i/em+Q==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.893.0", - "@smithy/types": "^4.5.0", + "@aws-sdk/types": "3.901.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2622,17 +2622,17 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.896.0.tgz", - "integrity": "sha512-so/3tZH34YIeqG/QJgn5ZinnmHRdXV1ehsj4wVUrezL/dVW86jfwIkQIwpw8roOC657UoUf91c9FDhCxs3J5aQ==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.901.0.tgz", + "integrity": "sha512-Zby4F03fvD9xAgXGPywyk4bC1jCbnyubMEYChLYohD+x20ULQCf+AimF/Btn7YL+hBpzh1+RmqmvZcx+RgwgNQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.896.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@smithy/core": "^3.12.0", - "@smithy/protocol-http": "^5.2.1", - "@smithy/types": "^4.5.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@aws-sdk/util-endpoints": "3.901.0", + "@smithy/core": "^3.14.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2640,48 +2640,48 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.896.0.tgz", - "integrity": "sha512-KaHALB6DIXScJL/ExmonADr3jtTV6dpOHoEeTRSskJ/aW+rhZo7kH8SLmrwOT/qX8d5tza17YyR/oRkIKY6Eaw==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.901.0.tgz", + "integrity": "sha512-feAAAMsVwctk2Tms40ONybvpfJPLCmSdI+G+OTrNpizkGLNl6ik2Ng2RzxY6UqOfN8abqKP/DOUj1qYDRDG8ag==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.896.0", - "@aws-sdk/middleware-host-header": "3.893.0", - "@aws-sdk/middleware-logger": "3.893.0", - "@aws-sdk/middleware-recursion-detection": "3.893.0", - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/region-config-resolver": "3.893.0", - "@aws-sdk/types": "3.893.0", - "@aws-sdk/util-endpoints": "3.895.0", - "@aws-sdk/util-user-agent-browser": "3.893.0", - "@aws-sdk/util-user-agent-node": "3.896.0", - "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.12.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.4", - "@smithy/middleware-retry": "^4.3.0", - "@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.4", - "@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.4", - "@smithy/util-defaults-mode-node": "^4.1.4", - "@smithy/util-endpoints": "^3.1.2", - "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.2", - "@smithy/util-utf8": "^4.1.0", + "@aws-sdk/core": "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", "tslib": "^2.6.2" }, "engines": { @@ -2689,16 +2689,16 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.893.0.tgz", - "integrity": "sha512-/cJvh3Zsa+Of0Zbg7vl9wp/kZtdb40yk/2+XcroAMVPO9hPvmS9r/UOm6tO7FeX4TtkRFwWaQJiTZTgSdsPY+Q==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.901.0.tgz", + "integrity": "sha512-7F0N888qVLHo4CSQOsnkZ4QAp8uHLKJ4v3u09Ly5k4AEStrSlFpckTPyUx6elwGL+fxGjNE2aakK8vEgzzCV0A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.893.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", + "@aws-sdk/types": "3.901.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -2706,16 +2706,16 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.896.0.tgz", - "integrity": "sha512-txiQDEZXL9tlNP8mbnNaDtuHBYc/FCqaZ8Y76qnfM3o6CTIn0t0tTAlnx1CyFe4EaikVBgQuZvj5KfNA8PmlzA==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.901.0.tgz", + "integrity": "sha512-2IWxbll/pRucp1WQkHi2W5E2SVPGBvk4Is923H7gpNksbVFws18ItjMM8ZpGm44cJEoy1zR5gjhLFklatpuoOw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.896.0", - "@aws-sdk/types": "3.893.0", - "@smithy/protocol-http": "^5.2.1", - "@smithy/signature-v4": "^5.2.1", - "@smithy/types": "^4.5.0", + "@aws-sdk/middleware-sdk-s3": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/signature-v4": "^5.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2723,17 +2723,17 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.896.0.tgz", - "integrity": "sha512-WBoD+RY7tUfW9M+wGrZ2vdveR+ziZOjGHWFY3lcGnDvI8KE+fcSccEOTxgJBNBS5Z8B+WHKU2sZjb+Z7QqGwjw==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.901.0.tgz", + "integrity": "sha512-pJEr1Ggbc/uVTDqp9IbNu9hdr0eQf3yZix3s4Nnyvmg4xmJSGAlbPC9LrNr5u3CDZoc8Z9CuLrvbP4MwYquNpQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.896.0", - "@aws-sdk/nested-clients": "3.896.0", - "@aws-sdk/types": "3.893.0", - "@smithy/property-provider": "^4.1.1", - "@smithy/shared-ini-file-loader": "^4.2.0", - "@smithy/types": "^4.5.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/nested-clients": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2741,12 +2741,12 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.893.0.tgz", - "integrity": "sha512-Aht1nn5SnA0N+Tjv0dzhAY7CQbxVtmq1bBR6xI0MhG7p2XYVh1wXuKTzrldEvQWwA3odOYunAfT9aBiKZx9qIg==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.901.0.tgz", + "integrity": "sha512-FfEM25hLEs4LoXsLXQ/q6X6L4JmKkKkbVFpKD4mwfVHtRVQG6QxJiCPcrkcPISquiy6esbwK2eh64TWbiD60cg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.5.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2766,9 +2766,9 @@ } }, "node_modules/@aws-sdk/util-dynamodb": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.896.0.tgz", - "integrity": "sha512-1vOPb4LnDDMnrZFif9uZYxydoyr1bijkovh1c+u2TxDd9cZDh+X/eyuRSuIvsPeueOwXWTdcKsojRZkn3w1mnA==", + "version": "3.902.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.902.0.tgz", + "integrity": "sha512-elZ9e671bda7Z1NzNSHiYKktnoXx4z2FJCJf1hpHrA/rMqVmnErNl/QzHZqF+0jH/0UoK7g4LCjJRO5A+reBoQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2777,19 +2777,19 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.896.0" + "@aws-sdk/client-dynamodb": "^3.902.0" } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.895.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.895.0.tgz", - "integrity": "sha512-MhxBvWbwxmKknuggO2NeMwOVkHOYL98pZ+1ZRI5YwckoCL3AvISMnPJgfN60ww6AIXHGpkp+HhpFdKOe8RHSEg==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.901.0.tgz", + "integrity": "sha512-5nZP3hGA8FHEtKvEQf4Aww5QZOkjLW1Z+NixSd+0XKfHvA39Ah5sZboScjLx0C9kti/K3OGW1RCx5K9Zc3bZqg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.893.0", - "@smithy/types": "^4.5.0", - "@smithy/url-parser": "^4.1.1", - "@smithy/util-endpoints": "^3.1.2", + "@aws-sdk/types": "3.901.0", + "@smithy/types": "^4.6.0", + "@smithy/url-parser": "^4.2.0", + "@smithy/util-endpoints": "^3.2.0", "tslib": "^2.6.2" }, "engines": { @@ -2797,14 +2797,14 @@ } }, "node_modules/@aws-sdk/util-format-url": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.893.0.tgz", - "integrity": "sha512-VmAvcedZfQlekiSFJ9y/+YjuCFT3b/vXImbkqjYoD4gbsDjmKm5lxo/w1p9ch0s602obRPLMkh9H20YgXnmwEA==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.901.0.tgz", + "integrity": "sha512-GGUnJKrh3OF1F3YRSWtwPLbN904Fcfxf03gujyq1rcrDRPEkzoZB+2BzNkB27SsU6lAlwNq+4aRlZRVUloPiag==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.893.0", - "@smithy/querystring-builder": "^4.1.1", - "@smithy/types": "^4.5.0", + "@aws-sdk/types": "3.901.0", + "@smithy/querystring-builder": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2824,27 +2824,27 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.893.0.tgz", - "integrity": "sha512-PE9NtbDBW6Kgl1bG6A5fF3EPo168tnkj8TgMcT0sg4xYBWsBpq0bpJZRh+Jm5Bkwiw9IgTCLjEU7mR6xWaMB9w==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.901.0.tgz", + "integrity": "sha512-Ntb6V/WFI21Ed4PDgL/8NSfoZQQf9xzrwNgiwvnxgAl/KvAvRBgQtqj5gHsDX8Nj2YmJuVoHfH9BGjL9VQ4WNg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.893.0", - "@smithy/types": "^4.5.0", + "@aws-sdk/types": "3.901.0", + "@smithy/types": "^4.6.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.896.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.896.0.tgz", - "integrity": "sha512-jegizucAwoxyBddKl0kRGNEgRHcfGuMeyhP1Nf+wIUmHz/9CxobIajqcVk/KRNLdZY5mSn7YG2VtP3z0BcBb0w==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.901.0.tgz", + "integrity": "sha512-l59KQP5TY7vPVUfEURc7P5BJKuNg1RSsAKBQW7LHLECXjLqDUbo2SMLrexLBEoArSt6E8QOrIN0C8z/0Xk0jYw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.896.0", - "@aws-sdk/types": "3.893.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" }, "engines": { @@ -2860,12 +2860,12 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.894.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.894.0.tgz", - "integrity": "sha512-E6EAMc9dT1a2DOdo4zyOf3fp5+NJ2wI+mcm7RaW1baFIWDwcb99PpvWoV7YEiK7oaBDshuOEGWKUSYXdW+JYgA==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.901.0.tgz", + "integrity": "sha512-pxFCkuAP7Q94wMTNPAwi6hEtNrp/BdFf+HOrIEeFQsk4EoOmpKY3I6S+u6A9Wg295J80Kh74LqDWM22ux3z6Aw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.5.0", + "@smithy/types": "^4.6.0", "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, @@ -4248,12 +4248,12 @@ "dev": true }, "node_modules/@smithy/abort-controller": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.1.1.tgz", - "integrity": "sha512-vkzula+IwRvPR6oKQhMYioM3A/oX/lFCZiwuxkQbRhqJS2S4YRY2k7k/SyR2jMf3607HLtbEwlRxi0ndXHMjRg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.0.tgz", + "integrity": "sha512-PLUYa+SUKOEZtXFURBu/CNxlsxfaFGxSBPcStL13KpVeVWIfdezWyDqkz7iDLmwnxojXD0s5KzuB5HGHvt4Aeg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.5.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4261,9 +4261,9 @@ } }, "node_modules/@smithy/chunked-blob-reader": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.1.0.tgz", - "integrity": "sha512-a36AtR7Q7XOhRPt6F/7HENmTWcB8kN7mDJcOFM/+FuKO6x88w8MQJfYCufMWh4fGyVkPjUh3Rrz/dnqFQdo6OQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.0.tgz", + "integrity": "sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -4273,12 +4273,12 @@ } }, "node_modules/@smithy/chunked-blob-reader-native": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.1.0.tgz", - "integrity": "sha512-Bnv0B3nSlfB2mPO0WgM49I/prl7+kamF042rrf3ezJ3Z4C7csPYvyYgZfXTGXwXfj1mAwDWjE/ybIf49PzFzvA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.0.tgz", + "integrity": "sha512-HNbGWdyTfSM1nfrZKQjYTvD8k086+M8s1EYkBUdGC++lhxegUp2HgNf5RIt6oOGVvsC26hBCW/11tv8KbwLn/Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-base64": "^4.1.0", + "@smithy/util-base64": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -4286,15 +4286,15 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.2.2.tgz", - "integrity": "sha512-IT6MatgBWagLybZl1xQcURXRICvqz1z3APSCAI9IqdvfCkrA7RaQIEfgC6G/KvfxnDfQUDqFV+ZlixcuFznGBQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.3.0.tgz", + "integrity": "sha512-9oH+n8AVNiLPK/iK/agOsoWfrKZ3FGP3502tkksd6SRsKMYiu7AFX0YXo6YBADdsAj7C+G/aLKdsafIJHxuCkQ==", "license": "Apache-2.0", "dependencies": { - "@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", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -4302,20 +4302,20 @@ } }, "node_modules/@smithy/core": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.13.0.tgz", - "integrity": "sha512-BI6ALLPOKnPOU1Cjkc+1TPhOlP3JXSR/UH14JmnaLq41t3ma+IjuXrKfhycVjr5IQ0XxRh2NnQo3olp+eCVrGg==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.14.0.tgz", + "integrity": "sha512-XJ4z5FxvY/t0Dibms/+gLJrI5niRoY0BCmE02fwmPcRYFPI4KI876xaE79YGWIKnEslMbuQPsIEsoU/DXa0DoA==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.1.1", - "@smithy/protocol-http": "^5.2.1", - "@smithy/types": "^4.5.0", - "@smithy/util-base64": "^4.1.0", - "@smithy/util-body-length-browser": "^4.1.0", - "@smithy/util-middleware": "^4.1.1", - "@smithy/util-stream": "^4.3.2", - "@smithy/util-utf8": "^4.1.0", - "@smithy/uuid": "^1.0.0", + "@smithy/middleware-serde": "^4.2.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-base64": "^4.2.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-stream": "^4.4.0", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { @@ -4323,15 +4323,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.1.2.tgz", - "integrity": "sha512-JlYNq8TShnqCLg0h+afqe2wLAwZpuoSgOyzhYvTgbiKBWRov+uUve+vrZEQO6lkdLOWPh7gK5dtb9dS+KGendg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.0.tgz", + "integrity": "sha512-SOhFVvFH4D5HJZytb0bLKxCrSnwcqPiNlrw+S4ZXjMnsC+o9JcUQzbZOEQcA8yv9wJFNhfsUiIUKiEnYL68Big==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.2.2", - "@smithy/property-provider": "^4.1.1", - "@smithy/types": "^4.5.0", - "@smithy/url-parser": "^4.1.1", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/types": "^4.6.0", + "@smithy/url-parser": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -4339,14 +4339,14 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.1.1.tgz", - "integrity": "sha512-PwkQw1hZwHTQB6X5hSUWz2OSeuj5Z6enWuAqke7DgWoP3t6vg3ktPpqPz3Erkn6w+tmsl8Oss6nrgyezoea2Iw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.0.tgz", + "integrity": "sha512-XE7CtKfyxYiNZ5vz7OvyTf1osrdbJfmUy+rbh+NLQmZumMGvY0mT0Cq1qKSfhrvLtRYzMsOBuRpi10dyI0EBPg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.5.0", - "@smithy/util-hex-encoding": "^4.1.0", + "@smithy/types": "^4.6.0", + "@smithy/util-hex-encoding": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -4354,13 +4354,13 @@ } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.1.1.tgz", - "integrity": "sha512-Q9QWdAzRaIuVkefupRPRFAasaG/droBqn1feiMnmLa+LLEUG45pqX1+FurHFmlqiCfobB3nUlgoJfeXZsr7MPA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.0.tgz", + "integrity": "sha512-U53p7fcrk27k8irLhOwUu+UYnBqsXNLKl1XevOpsxK3y1Lndk8R7CSiZV6FN3fYFuTPuJy5pP6qa/bjDzEkRvA==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.1.1", - "@smithy/types": "^4.5.0", + "@smithy/eventstream-serde-universal": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4368,12 +4368,12 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.2.1.tgz", - "integrity": "sha512-oSUkF9zDN9zcOUBMtxp8RewJlh71E9NoHWU8jE3hU9JMYCsmW4assVTpgic/iS3/dM317j6hO5x18cc3XrfvEw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.0.tgz", + "integrity": "sha512-uwx54t8W2Yo9Jr3nVF5cNnkAAnMCJ8Wrm+wDlQY6rY/IrEgZS3OqagtCu/9ceIcZFQ1zVW/zbN9dxb5esuojfA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.5.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4381,13 +4381,13 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.1.1.tgz", - "integrity": "sha512-tn6vulwf/ScY0vjhzptSJuDJJqlhNtUjkxJ4wiv9E3SPoEqTEKbaq6bfqRO7nvhTG29ALICRcvfFheOUPl8KNA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.0.tgz", + "integrity": "sha512-yjM2L6QGmWgJjVu/IgYd6hMzwm/tf4VFX0lm8/SvGbGBwc+aFl3hOzvO/e9IJ2XI+22Tx1Zg3vRpFRs04SWFcg==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.1.1", - "@smithy/types": "^4.5.0", + "@smithy/eventstream-serde-universal": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4395,13 +4395,13 @@ } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.1.1.tgz", - "integrity": "sha512-uLOAiM/Dmgh2CbEXQx+6/ssK7fbzFhd+LjdyFxXid5ZBCbLHTFHLdD/QbXw5aEDsLxQhgzDxLLsZhsftAYwHJA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.0.tgz", + "integrity": "sha512-C3jxz6GeRzNyGKhU7oV656ZbuHY93mrfkT12rmjDdZch142ykjn8do+VOkeRNjSGKw01p4g+hdalPYPhmMwk1g==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^4.1.1", - "@smithy/types": "^4.5.0", + "@smithy/eventstream-codec": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4409,15 +4409,15 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.2.1.tgz", - "integrity": "sha512-5/3wxKNtV3wO/hk1is+CZUhL8a1yy/U+9u9LKQ9kZTkMsHaQjJhc3stFfiujtMnkITjzWfndGA2f7g9Uh9vKng==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.0.tgz", + "integrity": "sha512-BG3KSmsx9A//KyIfw+sqNmWFr1YBUr+TwpxFT7yPqAk0yyDh7oSNgzfNH7pS6OC099EGx2ltOULvumCFe8bcgw==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.2.1", - "@smithy/querystring-builder": "^4.1.1", - "@smithy/types": "^4.5.0", - "@smithy/util-base64": "^4.1.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/querystring-builder": "^4.2.0", + "@smithy/types": "^4.6.0", + "@smithy/util-base64": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -4425,14 +4425,14 @@ } }, "node_modules/@smithy/hash-blob-browser": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.1.1.tgz", - "integrity": "sha512-avAtk++s1e/1VODf+rg7c9R2pB5G9y8yaJaGY4lPZI2+UIqVyuSDMikWjeWfBVmFZ3O7NpDxBbUCyGhThVUKWQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.0.tgz", + "integrity": "sha512-MWmrRTPqVKpN8NmxmJPTeQuhewTt8Chf+waB38LXHZoA02+BeWYVQ9ViAwHjug8m7lQb1UWuGqp3JoGDOWvvuA==", "license": "Apache-2.0", "dependencies": { - "@smithy/chunked-blob-reader": "^5.1.0", - "@smithy/chunked-blob-reader-native": "^4.1.0", - "@smithy/types": "^4.5.0", + "@smithy/chunked-blob-reader": "^5.2.0", + "@smithy/chunked-blob-reader-native": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4440,14 +4440,14 @@ } }, "node_modules/@smithy/hash-node": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.1.1.tgz", - "integrity": "sha512-H9DIU9WBLhYrvPs9v4sYvnZ1PiAI0oc8CgNQUJ1rpN3pP7QADbTOUjchI2FB764Ub0DstH5xbTqcMJu1pnVqxA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.0.tgz", + "integrity": "sha512-ugv93gOhZGysTctZh9qdgng8B+xO0cj+zN0qAZ+Sgh7qTQGPOJbMdIuyP89KNfUyfAqFSNh5tMvC+h2uCpmTtA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.5.0", - "@smithy/util-buffer-from": "^4.1.0", - "@smithy/util-utf8": "^4.1.0", + "@smithy/types": "^4.6.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -4455,13 +4455,13 @@ } }, "node_modules/@smithy/hash-stream-node": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.1.1.tgz", - "integrity": "sha512-3ztT4pV0Moazs3JAYFdfKk11kYFDo4b/3R3+xVjIm6wY9YpJf+xfz+ocEnNKcWAdcmSMqi168i2EMaKmJHbJMA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.0.tgz", + "integrity": "sha512-8dELAuGv+UEjtzrpMeNBZc1sJhO8GxFVV/Yh21wE35oX4lOE697+lsMHBoUIFAUuYkTMIeu0EuJSEsH7/8Y+UQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.5.0", - "@smithy/util-utf8": "^4.1.0", + "@smithy/types": "^4.6.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -4469,12 +4469,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.1.1.tgz", - "integrity": "sha512-1AqLyFlfrrDkyES8uhINRlJXmHA2FkG+3DY8X+rmLSqmFwk3DJnvhyGzyByPyewh2jbmV+TYQBEfngQax8IFGg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.0.tgz", + "integrity": "sha512-ZmK5X5fUPAbtvRcUPtk28aqIClVhbfcmfoS4M7UQBTnDdrNxhsrxYVv0ZEl5NaPSyExsPWqL4GsPlRvtlwg+2A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.5.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4482,9 +4482,9 @@ } }, "node_modules/@smithy/is-array-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.1.0.tgz", - "integrity": "sha512-ePTYUOV54wMogio+he4pBybe8fwg4sDvEVDBU8ZlHOZXbXK3/C0XfJgUCu6qAZcawv05ZhZzODGUerFBPsPUDQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -4494,13 +4494,13 @@ } }, "node_modules/@smithy/md5-js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.1.1.tgz", - "integrity": "sha512-MvWXKK743BuHjr/hnWuT6uStdKEaoqxHAQUvbKJPPZM5ZojTNFI5D+47BoQfBE5RgGlRRty05EbWA+NXDv+hIA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.0.tgz", + "integrity": "sha512-LFEPniXGKRQArFmDQ3MgArXlClFJMsXDteuQQY8WG1/zzv6gVSo96+qpkuu1oJp4MZsKrwchY0cuAoPKzEbaNA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.5.0", - "@smithy/util-utf8": "^4.1.0", + "@smithy/types": "^4.6.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -4508,20 +4508,20 @@ } }, "node_modules/@smithy/middleware-compression": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-4.2.5.tgz", - "integrity": "sha512-QUtV6J8u1N7WDHgtjNOig+ht7AANfMIu+ZopZtJoUG9qVuy1nIh9wYq47Gr1lnTLzD/NvCpzpBOs+lN0cvNHgA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-4.3.0.tgz", + "integrity": "sha512-I1owX2Jje2CubUKGcVGCKLs6D7iAQRe48YDz9XgYj63828sKTHnFylkiWmmD2R2N6fCRYnsopq/OEGG4R+vASw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.13.0", - "@smithy/is-array-buffer": "^4.1.0", - "@smithy/node-config-provider": "^4.2.2", - "@smithy/protocol-http": "^5.2.1", - "@smithy/types": "^4.5.0", - "@smithy/util-config-provider": "^4.1.0", - "@smithy/util-middleware": "^4.1.1", - "@smithy/util-utf8": "^4.1.0", + "@smithy/core": "^3.14.0", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "fflate": "0.8.1", "tslib": "^2.6.2" }, @@ -4530,13 +4530,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.1.1.tgz", - "integrity": "sha512-9wlfBBgTsRvC2JxLJxv4xDGNBrZuio3AgSl0lSFX7fneW2cGskXTYpFxCdRYD2+5yzmsiTuaAJD1Wp7gWt9y9w==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.0.tgz", + "integrity": "sha512-6ZAnwrXFecrA4kIDOcz6aLBhU5ih2is2NdcZtobBDSdSHtE9a+MThB5uqyK4XXesdOCvOcbCm2IGB95birTSOQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.2.1", - "@smithy/types": "^4.5.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4544,18 +4544,18 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.2.5.tgz", - "integrity": "sha512-DdOIpssQ5LFev7hV6GX9TMBW5ChTsQBxqgNW1ZGtJNSAi5ksd5klwPwwMY0ejejfEzwXXGqxgVO3cpaod4veiA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.0.tgz", + "integrity": "sha512-jFVjuQeV8TkxaRlcCNg0GFVgg98tscsmIrIwRFeC74TIUyLE3jmY9xgc1WXrPQYRjQNK3aRoaIk6fhFRGOIoGw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.13.0", - "@smithy/middleware-serde": "^4.1.1", - "@smithy/node-config-provider": "^4.2.2", - "@smithy/shared-ini-file-loader": "^4.2.0", - "@smithy/types": "^4.5.0", - "@smithy/url-parser": "^4.1.1", - "@smithy/util-middleware": "^4.1.1", + "@smithy/core": "^3.14.0", + "@smithy/middleware-serde": "^4.2.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", + "@smithy/url-parser": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -4563,19 +4563,19 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.3.1.tgz", - "integrity": "sha512-aH2bD1bzb6FB04XBhXA5mgedEZPKx3tD/qBuYCAKt5iieWvWO1Y2j++J9uLqOndXb9Pf/83Xka/YjSnMbcPchA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.0.tgz", + "integrity": "sha512-yaVBR0vQnOnzex45zZ8ZrPzUnX73eUC8kVFaAAbn04+6V7lPtxn56vZEBBAhgS/eqD6Zm86o6sJs6FuQVoX5qg==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.2.2", - "@smithy/protocol-http": "^5.2.1", - "@smithy/service-error-classification": "^4.1.2", - "@smithy/smithy-client": "^4.6.5", - "@smithy/types": "^4.5.0", - "@smithy/util-middleware": "^4.1.1", - "@smithy/util-retry": "^4.1.2", - "@smithy/uuid": "^1.0.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/service-error-classification": "^4.2.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-retry": "^4.2.0", + "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { @@ -4583,13 +4583,13 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.1.1.tgz", - "integrity": "sha512-lh48uQdbCoj619kRouev5XbWhCwRKLmphAif16c4J6JgJ4uXjub1PI6RL38d3BLliUvSso6klyB/LTNpWSNIyg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.0.tgz", + "integrity": "sha512-rpTQ7D65/EAbC6VydXlxjvbifTf4IH+sADKg6JmAvhkflJO2NvDeyU9qsWUNBelJiQFcXKejUHWRSdmpJmEmiw==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.2.1", - "@smithy/types": "^4.5.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4597,12 +4597,12 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.1.1.tgz", - "integrity": "sha512-ygRnniqNcDhHzs6QAPIdia26M7e7z9gpkIMUe/pK0RsrQ7i5MblwxY8078/QCnGq6AmlUUWgljK2HlelsKIb/A==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.0.tgz", + "integrity": "sha512-G5CJ//eqRd9OARrQu9MK1H8fNm2sMtqFh6j8/rPozhEL+Dokpvi1Og+aCixTuwDAGZUkJPk6hJT5jchbk/WCyg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.5.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4610,14 +4610,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.2.2.tgz", - "integrity": "sha512-SYGTKyPvyCfEzIN5rD8q/bYaOPZprYUPD2f5g9M7OjaYupWOoQFYJ5ho+0wvxIRf471i2SR4GoiZ2r94Jq9h6A==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.0.tgz", + "integrity": "sha512-5QgHNuWdT9j9GwMPPJCKxy2KDxZ3E5l4M3/5TatSZrqYVoEiqQrDfAq8I6KWZw7RZOHtVtCzEPdYz7rHZixwcA==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.1.1", - "@smithy/shared-ini-file-loader": "^4.2.0", - "@smithy/types": "^4.5.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4625,15 +4625,15 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.2.1.tgz", - "integrity": "sha512-REyybygHlxo3TJICPF89N2pMQSf+p+tBJqpVe1+77Cfi9HBPReNjTgtZ1Vg73exq24vkqJskKDpfF74reXjxfw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.3.0.tgz", + "integrity": "sha512-RHZ/uWCmSNZ8cneoWEVsVwMZBKy/8123hEpm57vgGXA3Irf/Ja4v9TVshHK2ML5/IqzAZn0WhINHOP9xl+Qy6Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.1.1", - "@smithy/protocol-http": "^5.2.1", - "@smithy/querystring-builder": "^4.1.1", - "@smithy/types": "^4.5.0", + "@smithy/abort-controller": "^4.2.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/querystring-builder": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4641,12 +4641,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.1.1.tgz", - "integrity": "sha512-gm3ZS7DHxUbzC2wr8MUCsAabyiXY0gaj3ROWnhSx/9sPMc6eYLMM4rX81w1zsMaObj2Lq3PZtNCC1J6lpEY7zg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.0.tgz", + "integrity": "sha512-rV6wFre0BU6n/tx2Ztn5LdvEdNZ2FasQbPQmDOPfV9QQyDmsCkOAB0osQjotRCQg+nSKFmINhyda0D3AnjSBJw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.5.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4654,12 +4654,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.2.1.tgz", - "integrity": "sha512-T8SlkLYCwfT/6m33SIU/JOVGNwoelkrvGjFKDSDtVvAXj/9gOT78JVJEas5a+ETjOu4SVvpCstKgd0PxSu/aHw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.0.tgz", + "integrity": "sha512-6POSYlmDnsLKb7r1D3SVm7RaYW6H1vcNcTWGWrF7s9+2noNYvUsm7E4tz5ZQ9HXPmKn6Hb67pBDRIjrT4w/d7Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.5.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4667,13 +4667,13 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.1.1.tgz", - "integrity": "sha512-J9b55bfimP4z/Jg1gNo+AT84hr90p716/nvxDkPGCD4W70MPms0h8KF50RDRgBGZeL83/u59DWNqJv6tEP/DHA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.0.tgz", + "integrity": "sha512-Q4oFD0ZmI8yJkiPPeGUITZj++4HHYCW3pYBYfIobUCkYpI6mbkzmG1MAQQ3lJYYWj3iNqfzOenUZu+jqdPQ16A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.5.0", - "@smithy/util-uri-escape": "^4.1.0", + "@smithy/types": "^4.6.0", + "@smithy/util-uri-escape": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -4681,12 +4681,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.1.1.tgz", - "integrity": "sha512-63TEp92YFz0oQ7Pj9IuI3IgnprP92LrZtRAkE3c6wLWJxfy/yOPRt39IOKerVr0JS770olzl0kGafXlAXZ1vng==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.0.tgz", + "integrity": "sha512-BjATSNNyvVbQxOOlKse0b0pSezTWGMvA87SvoFoFlkRsKXVsN3bEtjCxvsNXJXfnAzlWFPaT9DmhWy1vn0sNEA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.5.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4694,24 +4694,24 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.1.2.tgz", - "integrity": "sha512-Kqd8wyfmBWHZNppZSMfrQFpc3M9Y/kjyN8n8P4DqJJtuwgK1H914R471HTw7+RL+T7+kI1f1gOnL7Vb5z9+NgQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.0.tgz", + "integrity": "sha512-Ylv1ttUeKatpR0wEOMnHf1hXMktPUMObDClSWl2TpCVT4DwtJhCeighLzSLbgH3jr5pBNM0LDXT5yYxUvZ9WpA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.5.0" + "@smithy/types": "^4.6.0" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.2.0.tgz", - "integrity": "sha512-OQTfmIEp2LLuWdxa8nEEPhZmiOREO6bcB6pjs0AySf4yiZhl6kMOfqmcwcY8BaBPX+0Tb+tG7/Ia/6mwpoZ7Pw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.3.0.tgz", + "integrity": "sha512-VCUPPtNs+rKWlqqntX0CbVvWyjhmX30JCtzO+s5dlzzxrvSfRh5SY0yxnkirvc1c80vdKQttahL71a9EsdolSQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.5.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4719,18 +4719,18 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.2.1.tgz", - "integrity": "sha512-M9rZhWQLjlQVCCR37cSjHfhriGRN+FQ8UfgrYNufv66TJgk+acaggShl3KS5U/ssxivvZLlnj7QH2CUOKlxPyA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.0.tgz", + "integrity": "sha512-MKNyhXEs99xAZaFhm88h+3/V+tCRDQ+PrDzRqL0xdDpq4gjxcMmf5rBA3YXgqZqMZ/XwemZEurCBQMfxZOWq/g==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.1.0", - "@smithy/protocol-http": "^5.2.1", - "@smithy/types": "^4.5.0", - "@smithy/util-hex-encoding": "^4.1.0", - "@smithy/util-middleware": "^4.1.1", - "@smithy/util-uri-escape": "^4.1.0", - "@smithy/util-utf8": "^4.1.0", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -4738,17 +4738,17 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.6.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.6.5.tgz", - "integrity": "sha512-6J2hhuWu7EjnvLBIGltPCqzNswL1cW/AkaZx6i56qLsQ0ix17IAhmDD9aMmL+6CN9nCJODOXpBTCQS6iKAA7/g==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.7.0.tgz", + "integrity": "sha512-3BDx/aCCPf+kkinYf5QQhdQ9UAGihgOVqI3QO5xQfSaIWvUE4KYLtiGRWsNe1SR7ijXC0QEPqofVp5Sb0zC8xQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.13.0", - "@smithy/middleware-endpoint": "^4.2.5", - "@smithy/middleware-stack": "^4.1.1", - "@smithy/protocol-http": "^5.2.1", - "@smithy/types": "^4.5.0", - "@smithy/util-stream": "^4.3.2", + "@smithy/core": "^3.14.0", + "@smithy/middleware-endpoint": "^4.3.0", + "@smithy/middleware-stack": "^4.2.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-stream": "^4.4.0", "tslib": "^2.6.2" }, "engines": { @@ -4756,9 +4756,9 @@ } }, "node_modules/@smithy/types": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.5.0.tgz", - "integrity": "sha512-RkUpIOsVlAwUIZXO1dsz8Zm+N72LClFfsNqf173catVlvRZiwPy0x2u0JLEA4byreOPKDZPGjmPDylMoP8ZJRg==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.6.0.tgz", + "integrity": "sha512-4lI9C8NzRPOv66FaY1LL1O/0v0aLVrq/mXP/keUa9mJOApEeae43LsLd2kZRUJw91gxOQfLIrV3OvqPgWz1YsA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -4768,13 +4768,13 @@ } }, "node_modules/@smithy/url-parser": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.1.1.tgz", - "integrity": "sha512-bx32FUpkhcaKlEoOMbScvc93isaSiRM75pQ5IgIBaMkT7qMlIibpPRONyx/0CvrXHzJLpOn/u6YiDX2hcvs7Dg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.0.tgz", + "integrity": "sha512-AlBmD6Idav2ugmoAL6UtR6ItS7jU5h5RNqLMZC7QrLCoITA9NzIN3nx9GWi8g4z1pfWh2r9r96SX/jHiNwPJ9A==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.1.1", - "@smithy/types": "^4.5.0", + "@smithy/querystring-parser": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4782,13 +4782,13 @@ } }, "node_modules/@smithy/util-base64": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.1.0.tgz", - "integrity": "sha512-RUGd4wNb8GeW7xk+AY5ghGnIwM96V0l2uzvs/uVHf+tIuVX2WSvynk5CxNoBCsM2rQRSZElAo9rt3G5mJ/gktQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.2.0.tgz", + "integrity": "sha512-+erInz8WDv5KPe7xCsJCp+1WCjSbah9gWcmUXc9NqmhyPx59tf7jqFz+za1tRG1Y5KM1Cy1rWCcGypylFp4mvA==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.1.0", - "@smithy/util-utf8": "^4.1.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -4796,9 +4796,9 @@ } }, "node_modules/@smithy/util-body-length-browser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.1.0.tgz", - "integrity": "sha512-V2E2Iez+bo6bUMOTENPr6eEmepdY8Hbs+Uc1vkDKgKNA/brTJqOW/ai3JO1BGj9GbCeLqw90pbbH7HFQyFotGQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -4808,9 +4808,9 @@ } }, "node_modules/@smithy/util-body-length-node": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.1.0.tgz", - "integrity": "sha512-BOI5dYjheZdgR9XiEM3HJcEMCXSoqbzu7CzIgYrx0UtmvtC3tC2iDGpJLsSRFffUpy8ymsg2ARMP5fR8mtuUQQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.0.tgz", + "integrity": "sha512-U8q1WsSZFjXijlD7a4wsDQOvOwV+72iHSfq1q7VD+V75xP/pdtm0WIGuaFJ3gcADDOKj2MIBn4+zisi140HEnQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -4820,12 +4820,12 @@ } }, "node_modules/@smithy/util-buffer-from": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.1.0.tgz", - "integrity": "sha512-N6yXcjfe/E+xKEccWEKzK6M+crMrlwaCepKja0pNnlSkm6SjAeLKKA++er5Ba0I17gvKfN/ThV+ZOx/CntKTVw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.1.0", + "@smithy/is-array-buffer": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -4833,9 +4833,9 @@ } }, "node_modules/@smithy/util-config-provider": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.1.0.tgz", - "integrity": "sha512-swXz2vMjrP1ZusZWVTB/ai5gK+J8U0BWvP10v9fpcFvg+Xi/87LHvHfst2IgCs1i0v4qFZfGwCmeD/KNCdJZbQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -4845,14 +4845,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.1.5.tgz", - "integrity": "sha512-FGBhlmFZVSRto816l6IwrmDcQ9pUYX6ikdR1mmAhdtSS1m77FgADukbQg7F7gurXfAvloxE/pgsrb7SGja6FQA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.2.0.tgz", + "integrity": "sha512-qzHp7ZDk1Ba4LDwQVCNp90xPGqSu7kmL7y5toBpccuhi3AH7dcVBIT/pUxYcInK4jOy6FikrcTGq5wxcka8UaQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.1.1", - "@smithy/smithy-client": "^4.6.5", - "@smithy/types": "^4.5.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", "bowser": "^2.11.0", "tslib": "^2.6.2" }, @@ -4861,17 +4861,17 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.1.5.tgz", - "integrity": "sha512-Gwj8KLgJ/+MHYjVubJF0EELEh9/Ir7z7DFqyYlwgmp4J37KE+5vz6b3pWUnSt53tIe5FjDfVjDmHGYKjwIvW0Q==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.0.tgz", + "integrity": "sha512-FxUHS3WXgx3bTWR6yQHNHHkQHZm/XKIi/CchTnKvBulN6obWpcbzJ6lDToXn+Wp0QlVKd7uYAz2/CTw1j7m+Kg==", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.2.2", - "@smithy/credential-provider-imds": "^4.1.2", - "@smithy/node-config-provider": "^4.2.2", - "@smithy/property-provider": "^4.1.1", - "@smithy/smithy-client": "^4.6.5", - "@smithy/types": "^4.5.0", + "@smithy/config-resolver": "^4.3.0", + "@smithy/credential-provider-imds": "^4.2.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4879,13 +4879,13 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.1.2.tgz", - "integrity": "sha512-+AJsaaEGb5ySvf1SKMRrPZdYHRYSzMkCoK16jWnIMpREAnflVspMIDeCVSZJuj+5muZfgGpNpijE3mUNtjv01Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.0.tgz", + "integrity": "sha512-TXeCn22D56vvWr/5xPqALc9oO+LN+QpFjrSM7peG/ckqEPoI3zaKZFp+bFwfmiHhn5MGWPaLCqDOJPPIixk9Wg==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.2.2", - "@smithy/types": "^4.5.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4893,9 +4893,9 @@ } }, "node_modules/@smithy/util-hex-encoding": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.1.0.tgz", - "integrity": "sha512-1LcueNN5GYC4tr8mo14yVYbh/Ur8jHhWOxniZXii+1+ePiIbsLZ5fEI0QQGtbRRP5mOhmooos+rLmVASGGoq5w==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -4905,12 +4905,12 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.1.1.tgz", - "integrity": "sha512-CGmZ72mL29VMfESz7S6dekqzCh8ZISj3B+w0g1hZFXaOjGTVaSqfAEFAq8EGp8fUL+Q2l8aqNmt8U1tglTikeg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.0.tgz", + "integrity": "sha512-u9OOfDa43MjagtJZ8AapJcmimP+K2Z7szXn8xbty4aza+7P1wjFmy2ewjSbhEiYQoW1unTlOAIV165weYAaowA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.5.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4918,13 +4918,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.1.2.tgz", - "integrity": "sha512-NCgr1d0/EdeP6U5PSZ9Uv5SMR5XRRYoVr1kRVtKZxWL3tixEL3UatrPIMFZSKwHlCcp2zPLDvMubVDULRqeunA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.0.tgz", + "integrity": "sha512-BWSiuGbwRnEE2SFfaAZEX0TqaxtvtSYPM/J73PFVm+A29Fg1HTPiYFb8TmX1DXp4hgcdyJcNQmprfd5foeORsg==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.1.2", - "@smithy/types": "^4.5.0", + "@smithy/service-error-classification": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4932,18 +4932,18 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.3.2.tgz", - "integrity": "sha512-Ka+FA2UCC/Q1dEqUanCdpqwxOFdf5Dg2VXtPtB1qxLcSGh5C1HdzklIt18xL504Wiy9nNUKwDMRTVCbKGoK69g==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.4.0.tgz", + "integrity": "sha512-vtO7ktbixEcrVzMRmpQDnw/Ehr9UWjBvSJ9fyAbadKkC4w5Cm/4lMO8cHz8Ysb8uflvQUNRcuux/oNHKPXkffg==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.2.1", - "@smithy/node-http-handler": "^4.2.1", - "@smithy/types": "^4.5.0", - "@smithy/util-base64": "^4.1.0", - "@smithy/util-buffer-from": "^4.1.0", - "@smithy/util-hex-encoding": "^4.1.0", - "@smithy/util-utf8": "^4.1.0", + "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/node-http-handler": "^4.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-base64": "^4.2.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -4951,9 +4951,9 @@ } }, "node_modules/@smithy/util-uri-escape": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.1.0.tgz", - "integrity": "sha512-b0EFQkq35K5NHUYxU72JuoheM6+pytEVUGlTwiFxWFpmddA+Bpz3LgsPRIpBk8lnPE47yT7AF2Egc3jVnKLuPg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -4963,12 +4963,12 @@ } }, "node_modules/@smithy/util-utf8": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.1.0.tgz", - "integrity": "sha512-mEu1/UIXAdNYuBcyEPbjScKi/+MQVXNIuY/7Cm5XLIWe319kDrT5SizBE95jqtmEXoDbGoZxKLCMttdZdqTZKQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.1.0", + "@smithy/util-buffer-from": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -4976,13 +4976,13 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.1.1.tgz", - "integrity": "sha512-PJBmyayrlfxM7nbqjomF4YcT1sApQwZio0NHSsT0EzhJqljRmvhzqZua43TyEs80nJk2Cn2FGPg/N8phH6KeCQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.0.tgz", + "integrity": "sha512-0Z+nxUU4/4T+SL8BCNN4ztKdQjToNvUYmkF1kXO5T7Yz3Gafzh0HeIG6mrkN8Fz3gn9hSyxuAT+6h4vM+iQSBQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.1.1", - "@smithy/types": "^4.5.0", + "@smithy/abort-controller": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -4990,9 +4990,9 @@ } }, "node_modules/@smithy/uuid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.0.0.tgz", - "integrity": "sha512-OlA/yZHh0ekYFnbUkmYBDQPE6fGfdrvgz39ktp8Xf+FA6BfxLejPTMDOG0Nfk5/rDySAz1dRbFf24zaAFYVXlQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", + "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -6383,9 +6383,9 @@ } }, "node_modules/aws-sdk-client-mock-vitest": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/aws-sdk-client-mock-vitest/-/aws-sdk-client-mock-vitest-6.2.0.tgz", - "integrity": "sha512-ZEkadDIGjwqel4Fwl4bX87RVxA9joT9uxKqb3KCwIj4SoXnjDYs19ke2F5lI8ub3+GMzUud4+RAS3ptDtI8ciw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock-vitest/-/aws-sdk-client-mock-vitest-6.2.1.tgz", + "integrity": "sha512-sFfMbrkkl01dkXkObWm8hfS6JSyKcDc7R+nKf3/cunfP+z4tpg1XQSegjlNk/cu1KeB2BqUFpZY3SnHmi7LWDA==", "dev": true, "license": "MIT", "dependencies": { @@ -10699,8 +10699,8 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.896.0", - "@aws-sdk/lib-dynamodb": "^3.896.0", + "@aws-sdk/client-dynamodb": "^3.902.0", + "@aws-sdk/lib-dynamodb": "^3.902.0", "aws-sdk-client-mock": "^4.1.0" }, "peerDependencies": { @@ -10800,7 +10800,7 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.896.0", + "@aws-sdk/client-cloudwatch": "^3.901.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, @@ -10822,11 +10822,11 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.896.0", - "@aws-sdk/client-dynamodb": "^3.896.0", - "@aws-sdk/client-secrets-manager": "^3.896.0", - "@aws-sdk/client-ssm": "^3.896.0", - "@aws-sdk/util-dynamodb": "^3.896.0", + "@aws-sdk/client-appconfigdata": "^3.901.0", + "@aws-sdk/client-dynamodb": "^3.902.0", + "@aws-sdk/client-secrets-manager": "^3.901.0", + "@aws-sdk/client-ssm": "^3.901.0", + "@aws-sdk/util-dynamodb": "^3.902.0", "@smithy/util-base64": "^4.0.0", "aws-sdk-client-mock": "^4.1.0" }, @@ -10889,7 +10889,7 @@ "license": "MIT-0", "dependencies": { "@aws-cdk/toolkit-lib": "^1.9.0", - "@aws-sdk/client-lambda": "^3.896.0", + "@aws-sdk/client-lambda": "^3.901.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.219.0", "esbuild": "^0.25.10", @@ -10897,7 +10897,7 @@ }, "devDependencies": { "@types/promise-retry": "^1.1.6", - "aws-sdk-client-mock-vitest": "^6.2.0" + "aws-sdk-client-mock-vitest": "^6.2.1" } }, "packages/tracer": { @@ -10910,8 +10910,8 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.896.0", - "@aws-sdk/client-xray": "^3.896.0" + "@aws-sdk/client-dynamodb": "^3.902.0", + "@aws-sdk/client-xray": "^3.901.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x" diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index 797c10f651..8e2c7e802d 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -151,8 +151,8 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.896.0", - "@aws-sdk/lib-dynamodb": "^3.896.0", + "@aws-sdk/client-dynamodb": "^3.902.0", + "@aws-sdk/lib-dynamodb": "^3.902.0", "aws-sdk-client-mock": "^4.1.0" } } diff --git a/packages/metrics/package.json b/packages/metrics/package.json index f8dfecfb76..e707244dc7 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -65,7 +65,7 @@ "main": "./lib/cjs/index.js", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.896.0", + "@aws-sdk/client-cloudwatch": "^3.901.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, diff --git a/packages/parameters/package.json b/packages/parameters/package.json index 4f28072fc4..4ca19b576c 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -156,11 +156,11 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.896.0", - "@aws-sdk/client-dynamodb": "^3.896.0", - "@aws-sdk/client-secrets-manager": "^3.896.0", - "@aws-sdk/client-ssm": "^3.896.0", - "@aws-sdk/util-dynamodb": "^3.896.0", + "@aws-sdk/client-appconfigdata": "^3.901.0", + "@aws-sdk/client-dynamodb": "^3.902.0", + "@aws-sdk/client-secrets-manager": "^3.901.0", + "@aws-sdk/client-ssm": "^3.901.0", + "@aws-sdk/util-dynamodb": "^3.902.0", "@smithy/util-base64": "^4.0.0", "aws-sdk-client-mock": "^4.1.0" }, diff --git a/packages/testing/package.json b/packages/testing/package.json index 9295e71565..e269cbf84f 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -99,7 +99,7 @@ "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/testing#readme", "dependencies": { "@aws-cdk/toolkit-lib": "^1.9.0", - "@aws-sdk/client-lambda": "^3.896.0", + "@aws-sdk/client-lambda": "^3.901.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.219.0", "esbuild": "^0.25.10", @@ -107,6 +107,6 @@ }, "devDependencies": { "@types/promise-retry": "^1.1.6", - "aws-sdk-client-mock-vitest": "^6.2.0" + "aws-sdk-client-mock-vitest": "^6.2.1" } } diff --git a/packages/tracer/package.json b/packages/tracer/package.json index 9c8cf5911f..47e0c8d1ae 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -30,8 +30,8 @@ "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.896.0", - "@aws-sdk/client-xray": "^3.896.0" + "@aws-sdk/client-dynamodb": "^3.902.0", + "@aws-sdk/client-xray": "^3.901.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x" From 34ddf5163f29c2c165d12efd58ebc79a19a905eb Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Tue, 7 Oct 2025 16:04:52 +0200 Subject: [PATCH 220/255] chore: add AWS bootstrap js + update urls (#4614) --- .github/DISCUSSION_TEMPLATE/rfcs.yml | 2 +- .github/ISSUE_TEMPLATE/feature_request.yml | 2 +- .github/ISSUE_TEMPLATE/maintenance.yml | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 2 +- CONTRIBUTING.md | 4 +- MAINTAINERS.md | 2 +- README.md | 36 +++--- docs/contributing/conventions.md | 4 +- docs/contributing/getting_started.md | 4 +- docs/contributing/setup.md | 2 +- docs/features/event-handler/rest.md | 20 ++-- docs/features/kafka.md | 11 +- docs/features/logger.md | 4 +- docs/features/tracer.md | 2 +- docs/features/validation.md | 8 +- docs/index.md | 28 ++--- docs/javascript/aws-amplify.min.js | 108 ------------------ docs/javascript/extra.js | 71 ------------ docs/maintainers.md | 16 +-- docs/overrides/main.html | 5 + docs/we_made_this.md | 2 +- examples/app/functions/get-all-items.ts | 2 +- examples/app/functions/get-by-id.ts | 2 +- .../templates/gettingStartedSam.yaml | 2 +- mkdocs.yml | 7 +- packages/batch/README.md | 8 +- packages/commons/README.md | 19 +-- packages/event-handler/README.md | 10 +- packages/idempotency/README.md | 18 +-- packages/idempotency/src/IdempotencyConfig.ts | 2 +- .../src/persistence/CachePersistenceLayer.ts | 2 +- .../persistence/DynamoDBPersistenceLayer.ts | 2 +- .../src/types/ConfigServiceInterface.ts | 2 +- packages/jmespath/README.md | 8 +- packages/kafka/README.md | 8 +- packages/logger/README.md | 6 +- packages/logger/src/Logger.ts | 2 +- .../src/types/ConfigServiceInterface.ts | 2 +- packages/logger/src/types/Logger.ts | 4 +- packages/logger/src/types/logKeys.ts | 6 +- packages/metrics/README.md | 8 +- .../src/types/ConfigServiceInterface.ts | 2 +- packages/parameters/README.md | 22 ++-- .../src/appconfig/AppConfigProvider.ts | 4 +- .../parameters/src/appconfig/getAppConfig.ts | 2 +- .../src/dynamodb/DynamoDBProvider.ts | 6 +- .../parameters/src/secrets/SecretsProvider.ts | 6 +- packages/parameters/src/secrets/getSecret.ts | 2 +- packages/parameters/src/ssm/SSMProvider.ts | 10 +- packages/parameters/src/ssm/getParameter.ts | 2 +- packages/parameters/src/ssm/getParameters.ts | 2 +- .../parameters/src/ssm/getParametersByName.ts | 2 +- packages/parameters/src/ssm/setParameter.ts | 2 +- packages/parser/README.md | 12 +- packages/tracer/README.md | 6 +- packages/tracer/src/Tracer.ts | 2 +- .../src/types/ConfigServiceInterface.ts | 2 +- packages/validation/README.md | 8 +- 58 files changed, 180 insertions(+), 367 deletions(-) delete mode 100644 docs/javascript/aws-amplify.min.js diff --git a/.github/DISCUSSION_TEMPLATE/rfcs.yml b/.github/DISCUSSION_TEMPLATE/rfcs.yml index 2f4c68b167..98ed1f9c0a 100644 --- a/.github/DISCUSSION_TEMPLATE/rfcs.yml +++ b/.github/DISCUSSION_TEMPLATE/rfcs.yml @@ -88,7 +88,7 @@ body: attributes: label: Acknowledgment options: - - label: This RFC meets [Powertools for AWS Lambda (TypeScript) Tenets](https://docs.powertools.aws.dev/lambda/typescript/latest/#tenets) + - label: This RFC meets [Powertools for AWS Lambda (TypeScript) Tenets](https://docs.aws.amazon.com/powertools/typescript/latest/#tenets) required: true - label: Should this be considered in other Powertools for AWS Lambda languages? i.e. [Python](https://github.com/aws-powertools/powertools-lambda-python/), [Java](https://github.com/aws-powertools/powertools-lambda-java/), and [.NET](https://github.com/aws-powertools/powertools-lambda-dotnet/) required: false diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 618fc1d8f6..d8a844d864 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -35,7 +35,7 @@ body: attributes: label: Acknowledgment options: - - label: This feature request meets [Powertools for AWS Lambda (TypeScript) Tenets](https://docs.powertools.aws.dev/lambda/typescript/latest/#tenets) + - label: This feature request meets [Powertools for AWS Lambda (TypeScript) Tenets](https://docs.aws.amazon.com/powertools/typescript/latest/#tenets) required: true - label: Should this be considered in other Powertools for AWS Lambda languages? i.e. [Python](https://github.com/aws-powertools/powertools-lambda-python/), [Java](https://github.com/aws-powertools/powertools-lambda-java/), and [.NET](https://github.com/aws-powertools/powertools-lambda-dotnet/) required: false diff --git a/.github/ISSUE_TEMPLATE/maintenance.yml b/.github/ISSUE_TEMPLATE/maintenance.yml index 026e6b050e..0c8f72a11b 100644 --- a/.github/ISSUE_TEMPLATE/maintenance.yml +++ b/.github/ISSUE_TEMPLATE/maintenance.yml @@ -55,7 +55,7 @@ body: attributes: label: Acknowledgment options: - - label: This request meets [Powertools for AWS Lambda (TypeScript) Tenets](https://docs.powertools.aws.dev/lambda/typescript/latest/#tenets) + - label: This request meets [Powertools for AWS Lambda (TypeScript) Tenets](https://docs.aws.amazon.com/powertools/typescript/latest/#tenets) required: true - label: Should this be considered in other Powertools for AWS Lambda languages? i.e. [Python](https://github.com/aws-powertools/powertools-lambda-python/), [Java](https://github.com/aws-powertools/powertools-lambda-java/), and [.NET](https://github.com/aws-powertools/powertools-lambda-dotnet/) required: false diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 210c64711e..cb1bd5abee 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -15,7 +15,7 @@ Before creating the pull request, please make sure you do the following: - Read the Contributing Guidelines at https://github.com/aws-powertools/powertools-lambda-typescript/blob/main/CONTRIBUTING.md#sending-a-pull-request - Check that there isn't already a PR that addresses the same issue. If you find a duplicate, please leave a comment under the existing PR so we can discuss how to move forward -- Check that the change meets the project's tenets https://docs.powertools.aws.dev/lambda/typescript/latest/#tenets +- Check that the change meets the project's tenets https://docs.aws.amazon.com/powertools/typescript/latest/#tenets - Add a PR title that follows the conventional commit semantics - https://github.com/aws-powertools/powertools-lambda-typescript/blob/main/.github/semantic.yml#L2 - If relevant, add tests that prove that the change is effective and works - Whenever relevant, make sure to comment functions/methods/types and make appropriate changes to the documentation diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1fb13dda87..4f49440b26 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -152,9 +152,9 @@ If you have Python 3.x installed, you can run the documentation website and API | Category | Convention | | --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Docstring** | We use [TypeDoc](https://typedoc.org) annotations to help generate more readable API references. For public APIs, we always include at least one **Example** to ease everyone's experience when using an IDE. | -| **Style guide** | We use [Biome](http://biomejs.dev) to enforce style and format beyond good practices. We use TypeScript types, function return types, and access modifiers to convey intent. | +| **Style guide** | We use [Biome](http://biomejs.dev) to enforce style and format beyond good practices. We use TypeScript types, function return types, and access modifiers to convey intent. | | **Core utilities** | Core utilities always accept `serviceName` as a constructor parameter, can work in isolation, and are also available in other languages implementation. | -| **Utilities** | Utilities are not as strict as core and focus on community needs: development productivity, industry leading practices, etc. Both core and general utilities follow our [Tenets](https://docs.powertools.aws.dev/lambda/typescript/#tenets). | +| **Utilities** | Utilities are not as strict as core and focus on community needs: development productivity, industry leading practices, etc. Both core and general utilities follow our [Tenets](https://docs.aws.amazon.com/powertools/typescript/#tenets). | | **Errors** | Specific errors thrown by Powertools live within utilities themselves and use `Error` suffix e.g. `IdempotencyKeyError`. | | **Git commits** | We follow [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/). We do not enforce conventional commits on contributors to lower the entry bar. Instead, we enforce a conventional PR title so our label automation and changelog are generated correctly. | | **API documentation** | API reference docs are generated from docstrings which should have Examples section to allow developers to have what they need within their own IDE. Documentation website covers the wider usage, tips, and strive to be concise. | diff --git a/MAINTAINERS.md b/MAINTAINERS.md index 068e42dfcd..4263851370 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -1,4 +1,4 @@ > [!IMPORTANT] -> Maintainers' playbook moved: +> Maintainers' playbook moved: diff --git a/README.md b/README.md index 25660c273a..c6b3747563 100644 --- a/README.md +++ b/README.md @@ -9,39 +9,39 @@ [![Discord](https://img.shields.io/badge/Discord-Join_Community-7289da.svg)](https://discord.gg/B8zZKbbyET) -Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.powertools.aws.dev/lambda/typescript/latest/#features). +Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.aws.amazon.com/powertools/typescript/latest/#features). You can use the library in both TypeScript and JavaScript code bases. > Also available in [Python](https://github.com/aws-powertools/powertools-lambda-python), [Java](https://github.com/aws-powertools/powertools-lambda-java), and [.NET](https://github.com/aws-powertools/powertools-lambda-dotnet). -**[Documentation](https://docs.powertools.aws.dev/lambda/typescript/latest)** | **[npmjs.com](https://www.npmjs.com/org/aws-lambda-powertools)** | **[Roadmap](https://docs.powertools.aws.dev/lambda/typescript/latest/roadmap)** | **[Examples](https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/examples)** +**[Documentation](https://docs.aws.amazon.com/powertools/typescript/latest)** | **[npmjs.com](https://www.npmjs.com/org/aws-lambda-powertools)** | **[Roadmap](https://docs.aws.amazon.com/powertools/typescript/latest/roadmap)** | **[Examples](https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/examples)** ## Features -Find the complete project's [documentation here](https://docs.powertools.aws.dev/lambda/typescript/latest). +Find the complete project's [documentation here](https://docs.aws.amazon.com/powertools/typescript/latest). -- **[Tracer](https://docs.powertools.aws.dev/lambda/typescript/latest/features/tracer/)** - Utilities to trace Lambda function handlers, and both synchronous and asynchronous functions -- **[Logger](https://docs.powertools.aws.dev/lambda/typescript/latest/features/logger/)** - Structured logging made easier, and a middleware to enrich log items with key details of the Lambda context -- **[Metrics](https://docs.powertools.aws.dev/lambda/typescript/latest/features/metrics/)** - Custom Metrics created asynchronously via CloudWatch Embedded Metric Format (EMF) -- **[Event Handler](https://docs.powertools.aws.dev/lambda/typescript/latest/features/event-handler/)** - Lightweight routing to reduce boilerplate for API Gateway REST/HTTP API, ALB and Lambda Function URLs -- **[Parameters](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/)** - High-level functions to retrieve one or more parameters from AWS SSM Parameter Store, AWS Secrets Manager, AWS AppConfig, and Amazon DynamoDB -- **[Idempotency](https://docs.powertools.aws.dev/lambda/typescript/latest/features/idempotency/)** - Class method decorator, Middy middleware, and function wrapper to make your Lambda functions idempotent and prevent duplicate execution based on payload content -- **[Batch Processing](https://docs.powertools.aws.dev/lambda/typescript/latest/features/batch/)** - Utility to handle partial failures when processing batches from Amazon SQS, Amazon Kinesis Data Streams, and Amazon DynamoDB Streams. -- **[JMESPath Functions](https://docs.powertools.aws.dev/lambda/typescript/latest/features/jmespath/)** - Built-in JMESPath functions to easily deserialize common encoded JSON payloads in Lambda functions. -- **[Parser (Zod)](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parser/)** - Utility that provides data validation and parsing using Zod, a TypeScript-first schema declaration and validation library. -- **[Validation](https://docs.powertools.aws.dev/lambda/typescript/latest/features/validation/)** - JSON Schema validation for events and responses, including JMESPath support to unwrap events before validation. +- **[Tracer](https://docs.aws.amazon.com/powertools/typescript/latest/features/tracer/)** - Utilities to trace Lambda function handlers, and both synchronous and asynchronous functions +- **[Logger](https://docs.aws.amazon.com/powertools/typescript/latest/features/logger/)** - Structured logging made easier, and a middleware to enrich log items with key details of the Lambda context +- **[Metrics](https://docs.aws.amazon.com/powertools/typescript/latest/features/metrics/)** - Custom Metrics created asynchronously via CloudWatch Embedded Metric Format (EMF) +- **[Event Handler](https://docs.aws.amazon.com/powertools/typescript/latest/features/event-handler/)** - Lightweight routing to reduce boilerplate for API Gateway REST/HTTP API, ALB and Lambda Function URLs +- **[Parameters](https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/)** - High-level functions to retrieve one or more parameters from AWS SSM Parameter Store, AWS Secrets Manager, AWS AppConfig, and Amazon DynamoDB +- **[Idempotency](https://docs.aws.amazon.com/powertools/typescript/latest/features/idempotency/)** - Class method decorator, Middy middleware, and function wrapper to make your Lambda functions idempotent and prevent duplicate execution based on payload content +- **[Batch Processing](https://docs.aws.amazon.com/powertools/typescript/latest/features/batch/)** - Utility to handle partial failures when processing batches from Amazon SQS, Amazon Kinesis Data Streams, and Amazon DynamoDB Streams. +- **[JMESPath Functions](https://docs.aws.amazon.com/powertools/typescript/latest/features/jmespath/)** - Built-in JMESPath functions to easily deserialize common encoded JSON payloads in Lambda functions. +- **[Parser (Zod)](https://docs.aws.amazon.com/powertools/typescript/latest/features/parser/)** - Utility that provides data validation and parsing using Zod, a TypeScript-first schema declaration and validation library. +- **[Validation](https://docs.aws.amazon.com/powertools/typescript/latest/features/validation/)** - JSON Schema validation for events and responses, including JMESPath support to unwrap events before validation. ## Install -You can use Powertools for AWS Lambda (TypeScript) by installing it with your favorite dependency management, or [via Lambda Layers](https://docs.powertools.aws.dev/lambda/typescript/latest/getting-started/lambda-layers/). All features are available as individual packages, so you can install only the ones you need, for example: +You can use Powertools for AWS Lambda (TypeScript) by installing it with your favorite dependency management, or [via Lambda Layers](https://docs.aws.amazon.com/powertools/typescript/latest/getting-started/lambda-layers/). All features are available as individual packages, so you can install only the ones you need, for example: - **Logger**: `npm install @aws-lambda-powertools/logger` - **Metrics**: `npm install @aws-lambda-powertools/metrics` - **Tracer**: `npm install @aws-lambda-powertools/tracer` - **Event Handler**: `npm install @aws-lambda-powertools/event-handler` -- **Parameters**: `npm install @aws-lambda-powertools/parameters @aws-sdk/client-ssm` see [documentation](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/#installation) for other providers -- **Idempotency**: `npm install @aws-lambda-powertools/idempotency @aws-sdk/client-dynamodb @aws-sdk/lib-dynamodb` see [documentation](https://docs.powertools.aws.dev/lambda/typescript/latest/features/idempotency/#installation) for other providers +- **Parameters**: `npm install @aws-lambda-powertools/parameters @aws-sdk/client-ssm` see [documentation](https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/#installation) for other providers +- **Idempotency**: `npm install @aws-lambda-powertools/idempotency @aws-sdk/client-dynamodb @aws-sdk/lib-dynamodb` see [documentation](https://docs.aws.amazon.com/powertools/typescript/latest/features/idempotency/#installation) for other providers - **Batch Processing**: `npm install @aws-lambda-powertools/batch` - **JMESPath Functions**: `npm install @aws-lambda-powertools/jmespath` - **Parser**: `npm install @aws-lambda-powertools/parser zod@~3` @@ -82,11 +82,11 @@ The following companies, among others, use Powertools: ### Sharing your work -Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.powertools.aws.dev/lambda/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). +Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.aws.amazon.com/powertools/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). ### Using Lambda Layer -This helps us understand who uses Powertools for AWS Lambda (Typescript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.powertools.aws.dev/lambda/typescript/latest/getting-started/lambda-layers/), you can add Powertools for AWS Lambda as a dev dependency to not impact the development process. +This helps us understand who uses Powertools for AWS Lambda (Typescript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.aws.amazon.com/powertools/typescript/latest/getting-started/lambda-layers/), you can add Powertools for AWS Lambda as a dev dependency to not impact the development process. ## Credits diff --git a/docs/contributing/conventions.md b/docs/contributing/conventions.md index a8ee3bcc01..9ee3649c54 100644 --- a/docs/contributing/conventions.md +++ b/docs/contributing/conventions.md @@ -14,9 +14,9 @@ As we gather more concrete examples, this page will have one section for each ca | Category | Convention | | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Docstring** | We use [TypeDoc](https://typedoc.org){target="_blank"} annotations to help generate more readable API references. For public APIs, we always include at least one **Example** to ease everyone's experience when using an IDE. | -| **Style guide** | We use [Biome](http://biomejs.dev){target="_blank"} for linting and formatting to enforce beyond good practices. We use TypeScript types, function return types, and access modifiers to convey intent. | +| **Style guide** | We use [Biome](http://biomejs.dev){target="_blank"} for linting and formatting to enforce beyond good practices. We use TypeScript types, function return types, and access modifiers to convey intent. | | **Core utilities** | Core utilities always accept `serviceName` as a constructor parameter, can work in isolation, and are also available in other languages implementation. | -| **Utilities** | Utilities are not as strict as core and focus on community needs: development productivity, industry leading practices, etc. Both core and general utilities follow our [Tenets](https://docs.powertools.aws.dev/lambda/typescript/#tenets){target="_blank"}. | +| **Utilities** | Utilities are not as strict as core and focus on community needs: development productivity, industry leading practices, etc. Both core and general utilities follow our [Tenets](https://docs.aws.amazon.com/powertools/typescript/#tenets){target="_blank"}. | | **Errors** | Specific errors thrown by Powertools live within utilities themselves and use `Error` suffix e.g. `IdempotencyKeyError`. | | **Git commits** | We follow [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/){target="_blank"}. We do not enforce conventional commits on contributors to lower the entry bar. Instead, we enforce a conventional PR title so our label automation and changelog are generated correctly. | | **API documentation** | API reference docs are generated from docstrings which should have Examples section to allow developers to have what they need within their own IDE. Documentation website covers the wider usage, tips, and strive to be concise. | diff --git a/docs/contributing/getting_started.md b/docs/contributing/getting_started.md index 44bb7c66ac..7e12b95cb1 100644 --- a/docs/contributing/getting_started.md +++ b/docs/contributing/getting_started.md @@ -25,7 +25,7 @@ Whether you're new contributor or a pro, we compiled a list of the common contri Each type link goes to their respective template, or Discord invite. | Type | Description | -|------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [Documentation](https://s12d.com/pt-ts-new-issue-documentation){target="_blank" rel="nofollow"} | Ideas to make user guide or API guide clearer. This includes typos, diagrams, tutorials, the lack of documentation, etc. | | [Feature request](https://s12d.com/pt-ts-new-issue-feature-request){target="_blank" rel="nofollow"} | New features or enhancements that could help you, your team, or existing and future customers. Check out our [process to understand how we prioritize it](../roadmap.md#process){target="_blank"} | | [Design proposals](https://s12d.com/pt-ts-new-rfc){target="_blank" rel="nofollow"} | Request for Comments (RFC) including user experience (UX) based on a feature request to gather the community feedback, and demonstrate the art of the possible. | @@ -45,7 +45,7 @@ Whether you're new contributor or a pro, we compiled a list of the common contri | [Missing customer feedback issues](https://s12d.com/pt-ts-need-customer-feedback){target="_blank" rel="nofollow"} | These are items we'd like to hear from more customers before making any decision. Sharing your thoughts, use case, or asking additional questions are great help | | [Pending design proposals](https://s12d.com/pt-ts-open-rfcs){target="_blank" rel="nofollow"} | These are feature requests that initially look good but need a RFC to enrich the discussion by validating user-experience, tradeoffs, and highlight use cases | | [Backlog items](https://s12d.com/pt-ts-backlog){target="_blank" rel="nofollow"} | We use GitHub projects to surface what we're working on, needs triage, etc. This view shows items we already triaged but don't have the bandwidth to tackle them just yet | -| [Documentation](https://docs.powertools.aws.dev/lambda/typescript/latest/){target="_blank"} | Documentation can always be improved. Look for areas that could use a better example, or a diagram - keep in mind a diverse audience and English as a second language folks | +| [Documentation](https://docs.aws.amazon.com/powertools/typescript/latest/){target="_blank"} | Documentation can always be improved. Look for areas that could use a better example, or a diagram - keep in mind a diverse audience and English as a second language folks | | [Participate in discussions](https://discord.gg/B8zZKbbyET){target="_blank" rel="nofollow"} | There's always a discussion that could benefit others in the form of documentation, blog post, etc. | | [Roadmap](../roadmap.md){target="_blank"} | Some roadmap items need a RFC to discuss design options, or gather customers use case before we can prioritize it | | Build a sample application | Using Powertools for AWS Lambda in different contexts will give you insights on what could be made easier, which documentation could be enriched, and more | diff --git a/docs/contributing/setup.md b/docs/contributing/setup.md index 7f10903d87..f3671355c6 100644 --- a/docs/contributing/setup.md +++ b/docs/contributing/setup.md @@ -5,7 +5,7 @@ description: Setting up your development environment for contribution -[![Join our Discord](https://dcbadge.vercel.app/api/server/B8zZKbbyET)](https://discord.gg/B8zZKbbyET){target="_blank" rel="nofollow"} +[![Join our Discord](https://img.shields.io/badge/Discord-Join_Community-7289da.svg)](https://discord.gg/B8zZKbbyET){target="_blank" rel="nofollow"} This page describes how to setup your development environment (Cloud or locally) to contribute to Powertools for AWS Lambda (TypeScript). diff --git a/docs/features/event-handler/rest.md b/docs/features/event-handler/rest.md index 9fdfe3a46e..5edcc7692f 100644 --- a/docs/features/event-handler/rest.md +++ b/docs/features/event-handler/rest.md @@ -179,7 +179,7 @@ If you need to send custom headers or a different response structure/code, you c The following HTTP error classes are available for use in your route handlers: | Error Class | HTTP Status Code | Description | -|------------------------------|------------------|----------------------------------------------------------------------------------------| +| ---------------------------- | ---------------- | -------------------------------------------------------------------------------------- | | `BadRequestError` | 400 | Bad Request - The request cannot be fulfilled due to bad syntax | | `UnauthorizedError` | 401 | Unauthorized - Authentication is required and has failed or not been provided | | `ForbiddenError` | 403 | Forbidden - The request is valid but the server is refusing action | @@ -436,14 +436,14 @@ For convenience, these are the default CORS settings applied when you register t !!! warning "Security consideration" Always set the `origin` option to a specific domain or list of domains in production environments to avoid security risks associated with allowing all origins. -| Key | Default Value | Description | -|------------------|------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `origin` | `*` | Specifies the allowed origin(s) that can access the resource. Use `*` to allow all origins. | -| `methods` | `GET,HEAD,PUT,PATCH,POST,DELETE` | Specifies the allowed HTTP methods. | -| `allowHeaders` | `[Authorization, Content-Type, X-Amz-Date, X-Api-Key, X-Amz-Security-Token]` | Specifies the allowed headers that can be used in the actual request. | -| `exposeHeaders` | `[]` | Any additional header beyond the [safe listed by CORS specification](https://developer.mozilla.org/en-US/docs/Glossary/CORS-safelisted_response_header){target="_blank"}. | -| `credentials` | `false` | Only necessary when you need to expose cookies, authorization headers or TLS client certificates. | -| `maxAge` | `0` | Indicates how long the results of a preflight request can be cached. Value is in seconds. | +| Key | Default Value | Description | +| --------------- | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `origin` | `*` | Specifies the allowed origin(s) that can access the resource. Use `*` to allow all origins. | +| `methods` | `GET,HEAD,PUT,PATCH,POST,DELETE` | Specifies the allowed HTTP methods. | +| `allowHeaders` | `[Authorization, Content-Type, X-Amz-Date, X-Api-Key, X-Amz-Security-Token]` | Specifies the allowed headers that can be used in the actual request. | +| `exposeHeaders` | `[]` | Any additional header beyond the [safe listed by CORS specification](https://developer.mozilla.org/en-US/docs/Glossary/CORS-safelisted_response_header){target="_blank"}. | +| `credentials` | `false` | Only necessary when you need to expose cookies, authorization headers or TLS client certificates. | +| `maxAge` | `0` | Indicates how long the results of a preflight request can be cached. Value is in seconds. | #### Per-route overrides @@ -559,7 +559,7 @@ When an unhandled error occurs in your route handler or middleware, Event Handle Currently, Event Handler does not support automatic generation of OpenAPI documentation from your route definitions. -We plan to add this feature in a future release with an experience similar to what described in the [utility's RFC](https://github.com/aws-powertools/powertools-lambda-typescript/discussions/3500){target="_blank"} and to what available in [Powertools for AWS Lambda (Python)](https://docs.powertools.aws.dev/lambda/python/latest/core/event_handler/api_gateway/#openapi){target="_blank"}. +We plan to add this feature in a future release with an experience similar to what described in the [utility's RFC](https://github.com/aws-powertools/powertools-lambda-typescript/discussions/3500){target="_blank"} and to what available in [Powertools for AWS Lambda (Python)](https://docs.aws.amazon.com/powertools/python/latest/core/event_handler/api_gateway/#openapi){target="_blank"}. Please [check this issue](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4515) for more details, and add 👍 if you would like us to prioritize it. diff --git a/docs/features/kafka.md b/docs/features/kafka.md index 4f288c70cd..3d96b7f1d3 100644 --- a/docs/features/kafka.md +++ b/docs/features/kafka.md @@ -1,7 +1,6 @@ --- title: Kafka Consumer description: Utility -status: new --- The Kafka Consumer utility transparently handles message deserialization, provides an intuitive developer experience, and integrates seamlessly with the rest of the Powertools for AWS Lambda ecosystem. @@ -38,7 +37,7 @@ The Kafka Consumer utility transparently handles message deserialization, provid Lambda processes Kafka messages as discrete events rather than continuous streams, requiring a different approach to consumer development that Powertools for AWS helps standardize. | Aspect | Traditional Kafka Consumers | Lambda Kafka Consumer | -|-----------------------|-------------------------------------|----------------------------------------------------------------| +| --------------------- | ----------------------------------- | -------------------------------------------------------------- | | **Model** | Pull-based (you poll for messages) | Push-based (Lambda invoked with messages) | | **Scaling** | Manual scaling configuration | Automatic scaling to partition count | | **State** | Long-running application with state | Stateless, ephemeral executions | @@ -201,7 +200,7 @@ The Kafka consumer utility supports multiple serialization formats to match your === "Supported Formats" | Format | Schema Type | Description | Required Parameters | - |----------------------|--------------|-----------------------------------|--------------------------------------| + | -------------------- | ------------ | --------------------------------- | ------------------------------------ | | **JSON** | `"JSON"` | Human-readable text format | None | | **Avro** | `"AVRO"` | Compact binary format with schema | `value.schema` (Avro schema string) | | **Protocol Buffers** | `"PROTOBUF"` | Efficient binary format | `value.schema` (Proto message class) | @@ -209,7 +208,7 @@ The Kafka consumer utility supports multiple serialization formats to match your === "Format Comparison" | Feature | JSON | Avro | Protocol Buffers | - |-------------------------------|----------|----------------------|-------------------------| + | ----------------------------- | -------- | -------------------- | ----------------------- | | **Schema Definition** | Optional | Required JSON schema | Required Protobuf class | | **Schema Evolution** | None | Strong support | Strong support | | **Size Efficiency** | Low | High | Highest | @@ -241,7 +240,7 @@ For debugging purposes, you can also access the original key, value, and headers #### Available metadata properties | Property | Description | Example Use Case | -|-----------------------|------------------------------------------------------------------|---------------------------------------------------------------------| +| --------------------- | ---------------------------------------------------------------- | ------------------------------------------------------------------- | | `topic` | Topic name the record was published to | Routing logic in multi-topic consumers | | `partition` | Kafka partition number | Tracking message distribution | | `offset` | Position in the partition | De-duplication, exactly-once processing | @@ -304,7 +303,7 @@ Handle errors gracefully when processing Kafka messages to ensure your applicati #### Error types | Exception | Description | Common Causes | -|--------------------------------------|-----------------------------------------------|-----------------------------------------------------------------------------| +| ------------------------------------ | --------------------------------------------- | --------------------------------------------------------------------------- | | `KafkaConsumerError`. | Base class for all Kafka consumer errors | General unhandled errors | | `KafkaConsumerDeserializationError` | Thrown when message deserialization fails | Corrupted message data, schema mismatch, or wrong schema type configuration | | `KafkaConsumerMissingSchemaError` | Thrown when a required schema is not provided | Missing schema for AVRO or PROTOBUF formats (required parameter) | diff --git a/docs/features/logger.md b/docs/features/logger.md index 9d40177cdd..833389cade 100644 --- a/docs/features/logger.md +++ b/docs/features/logger.md @@ -58,7 +58,7 @@ These settings will be used across all logs emitted: See all environment variables in the [Environment variables](../environment-variables.md) section. -Check API docs to learn more about [Logger constructor options](https://docs.powertools.aws.dev/lambda/typescript/latest/api/types/_aws_lambda_powertools_logger.types.ConstructorOptions.html){target="_blank"}. +Check API docs to learn more about [Logger constructor options](https://docs.aws.amazon.com/powertools/typescript/latest/api/types/_aws-lambda-powertools_logger.types.ConstructorOptions.html){target="_blank"}. #### Example using AWS Serverless Application Model (SAM) @@ -625,7 +625,7 @@ Log buffering enables you to buffer logs for a specific request or invocation. E When configuring the buffer, you can set the following options to fine-tune how logs are captured, stored, and emitted. You can configure the following options in the `logBufferOptions` constructor parameter: | Parameter | Description | Configuration | Default | -|-------------------- |------------------------------------------------- |------------------------------------ | ------- | +| ------------------- | ------------------------------------------------ | ----------------------------------- | ------- | | `enabled` | Enable or disable log buffering | `true`, `false` | `false` | | `maxBytes` | Maximum size of the log buffer in bytes | `number` | `20480` | | `bufferAtVerbosity` | Minimum log level to buffer | `TRACE`, `DEBUG`, `INFO`, `WARNING` | `DEBUG` | diff --git a/docs/features/tracer.md b/docs/features/tracer.md index 6cd6877e72..1ac01700f0 100644 --- a/docs/features/tracer.md +++ b/docs/features/tracer.md @@ -369,7 +369,7 @@ Tracer exposes a `getRootXrayTraceId()` method that allows you to retrieve the [ ### Escape hatch mechanism -You can use `tracer.provider` attribute to access [a subset of the methods provided](https://docs.powertools.aws.dev/lambda/typescript/latest/api/classes/_aws_lambda_powertools_tracer.provider_ProviderService.ProviderService.html) by the [AWS X-Ray SDK](https://docs.aws.amazon.com/xray-sdk-for-nodejs/latest/reference/AWSXRay.html). +You can use `tracer.provider` attribute to access [a subset of the methods provided](https://docs.aws.amazon.com/powertools/typescript/latest/api/classes/_aws-lambda-powertools_tracer.provider_ProviderService.ProviderService.html) by the [AWS X-Ray SDK](https://docs.aws.amazon.com/xray-sdk-for-nodejs/latest/reference/AWSXRay.html). This is useful when you need a feature available in X-Ray that is not available in the Tracer utility, for example [SQL queries tracing](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-nodejs-sqlclients.html), or [a custom logger](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-nodejs-configuration.html#xray-sdk-nodejs-configuration-logging). diff --git a/docs/features/validation.md b/docs/features/validation.md index 928b0d2b9a..6095cb8287 100644 --- a/docs/features/validation.md +++ b/docs/features/validation.md @@ -144,7 +144,7 @@ Here is an example of how you can use the built-in envelope for SQS events: --8<-- "examples/snippets/validation/samples/gettingStartedSQSEnvelopeEvent.json" ``` -For a complete list of built-in envelopes, check the [built-in envelopes section](https://docs.powertools.aws.dev/lambda/typescript/latest/features/jmespath/#built-in-envelopes). +For a complete list of built-in envelopes, check the [built-in envelopes section](https://docs.aws.amazon.com/powertools/typescript/latest/features/jmespath/#built-in-envelopes). ## Advanced @@ -178,9 +178,9 @@ In some cases, your payloads might require some transformation before validation For this, you can use our buil-in JMESPath functions within your expressions. We have a few built-in functions that you can use: -- [`powertools_json()`](https://docs.powertools.aws.dev/lambda/typescript/latest/features/jmespath/#powertools_json-function): Parses a JSON string -- [`powertools_base64()`](https://docs.powertools.aws.dev/lambda/typescript/latest/features/jmespath/#powertools_base64-function): Decodes a base64 string -- [`powertools_base64_gzip()`](https://docs.powertools.aws.dev/lambda/typescript/latest/features/jmespath/#powertools_base64_gzip-function): Decodes a base64 string and unzips it +- [`powertools_json()`](https://docs.aws.amazon.com/powertools/typescript/latest/features/jmespath/#powertools_json-function): Parses a JSON string +- [`powertools_base64()`](https://docs.aws.amazon.com/powertools/typescript/latest/features/jmespath/#powertools_base64-function): Decodes a base64 string +- [`powertools_base64_gzip()`](https://docs.aws.amazon.com/powertools/typescript/latest/features/jmespath/#powertools_base64_gzip-function): Decodes a base64 string and unzips it We use these functions for [built-in envelopes](#built-in-envelopes) to easily decode and unwrap events from sources like Kinesis, SQS, S3, and more. diff --git a/docs/index.md b/docs/index.md index 9ed5aaa2f3..d3da99e342 100644 --- a/docs/index.md +++ b/docs/index.md @@ -34,7 +34,7 @@ You can use Powertools for AWS Lambda in both TypeScript and JavaScript code bas Powertools for AWS Lambda is also available in other languages - :octicons-arrow-right-24: [Python](https://docs.powertools.aws.dev/lambda/python/latest/){target="_blank" }, [Java](https://docs.powertools.aws.dev/lambda/java/){target="_blank"}, and [.NET](https://docs.powertools.aws.dev/lambda/dotnet/){target="_blank"} + :octicons-arrow-right-24: [Python](https://docs.aws.amazon.com/powertools/python/latest/){target="_blank" }, [Java](https://docs.aws.amazon.com/powertools/java/){target="_blank"}, and [.NET](https://docs.aws.amazon.com/powertools/dotnet/){target="_blank"} @@ -42,19 +42,19 @@ You can use Powertools for AWS Lambda in both TypeScript and JavaScript code bas Powertools for AWS Lambda (TypeScript) is built as a modular toolkit, so you can pick and choose the utilities you want to use. The following table lists the available utilities, and links to their documentation. -| Utility | Description | -| ---------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [Tracer](./features/tracer.md) | Decorators and utilities to trace Lambda function handlers, and both synchronous and asynchronous functions | -| [Logger](./features/logger.md) | Structured logging made easier, and a middleware to enrich structured logging with key Lambda context details | -| [Metrics](./features/metrics.md) | Custom Metrics created asynchronously via CloudWatch Embedded Metric Format (EMF) | -| [Event Handler](./features/event-handler/appsync-events.md) | Event Handler for AWS AppSync real-time events, AppSync GraphQL APIs, Bedrock Agents, and more. | -| [Parameters](./features/parameters.md) | High-level functions to retrieve one or more parameters from AWS SSM Parameter Store, AWS Secrets Manager, AWS AppConfig, and Amazon DynamoDB | -| [Idempotency](./features/idempotency.md) | Class method decorator, Middy middleware, and function wrapper to make your Lambda functions idempotent and prevent duplicate execution based on payload content. | -| [Batch Processing](./features/batch.md) | Utility to handle partial failures when processing batches from Amazon SQS, Amazon Kinesis Data Streams, and Amazon DynamoDB Streams. | -| [JMESPath Functions](./features/jmespath.md) | Built-in JMESPath functions to easily deserialize common encoded JSON payloads in Lambda functions. | -| [Parser](./features/parser.md) | Utility to parse and validate AWS Lambda event payloads using Zod, a TypeScript-first schema declaration and validation library. | -| [Validation](./features/validation.md) | JSON Schema validation for events and responses, including JMESPath support to unwrap events before validation. | -| [Kafka](./features/kafka.md) | Utility to easily handle message deserialization and parsing of Kafka events in AWS Lambda functions. | +| Utility | Description | +| ----------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Tracer](./features/tracer.md) | Decorators and utilities to trace Lambda function handlers, and both synchronous and asynchronous functions | +| [Logger](./features/logger.md) | Structured logging made easier, and a middleware to enrich structured logging with key Lambda context details | +| [Metrics](./features/metrics.md) | Custom Metrics created asynchronously via CloudWatch Embedded Metric Format (EMF) | +| [Event Handler](./features/event-handler/appsync-events.md) | Event Handler for AWS AppSync real-time events, AppSync GraphQL APIs, Bedrock Agents, and more. | +| [Parameters](./features/parameters.md) | High-level functions to retrieve one or more parameters from AWS SSM Parameter Store, AWS Secrets Manager, AWS AppConfig, and Amazon DynamoDB | +| [Idempotency](./features/idempotency.md) | Class method decorator, Middy middleware, and function wrapper to make your Lambda functions idempotent and prevent duplicate execution based on payload content. | +| [Batch Processing](./features/batch.md) | Utility to handle partial failures when processing batches from Amazon SQS, Amazon Kinesis Data Streams, and Amazon DynamoDB Streams. | +| [JMESPath Functions](./features/jmespath.md) | Built-in JMESPath functions to easily deserialize common encoded JSON payloads in Lambda functions. | +| [Parser](./features/parser.md) | Utility to parse and validate AWS Lambda event payloads using Zod, a TypeScript-first schema declaration and validation library. | +| [Validation](./features/validation.md) | JSON Schema validation for events and responses, including JMESPath support to unwrap events before validation. | +| [Kafka](./features/kafka.md) | Utility to easily handle message deserialization and parsing of Kafka events in AWS Lambda functions. | ## Examples diff --git a/docs/javascript/aws-amplify.min.js b/docs/javascript/aws-amplify.min.js deleted file mode 100644 index f19b36a50f..0000000000 --- a/docs/javascript/aws-amplify.min.js +++ /dev/null @@ -1,108 +0,0 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("aws_amplify",[],t):"object"==typeof exports?exports.aws_amplify=t():e.aws_amplify=t()}(this,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=157)}([function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"b",(function(){return u})),n.d(t,"f",(function(){return c})),n.d(t,"g",(function(){return f})),n.d(t,"h",(function(){return l})),n.d(t,"c",(function(){return h})),n.d(t,"e",(function(){return g})),n.d(t,"d",(function(){return m}));var r=n(1),i=function(){var e=[],t=[],n=new Set,a=function(n){return e.forEach((function(e){n.add(e.middleware,Object(r.__assign)({},e))})),t.forEach((function(e){n.addRelativeTo(e.middleware,Object(r.__assign)({},e))})),n},u=function(e){var t=[];return e.before.forEach((function(e){0===e.before.length&&0===e.after.length?t.push(e):t.push.apply(t,Object(r.__spread)(u(e)))})),t.push(e),e.after.reverse().forEach((function(e){0===e.before.length&&0===e.after.length?t.push(e):t.push.apply(t,Object(r.__spread)(u(e)))})),t},c=function(){var n,i=[],a=[],c={};return e.forEach((function(e){var t=Object(r.__assign)(Object(r.__assign)({},e),{before:[],after:[]});t.name&&(c[t.name]=t),i.push(t)})),t.forEach((function(e){var t=Object(r.__assign)(Object(r.__assign)({},e),{before:[],after:[]});t.name&&(c[t.name]=t),a.push(t)})),a.forEach((function(e){if(e.toMiddleware){var t=c[e.toMiddleware];if(void 0===t)throw new Error(e.toMiddleware+" is not found when adding "+(e.name||"anonymous")+" middleware "+e.relation+" "+e.toMiddleware);"after"===e.relation&&t.after.push(e),"before"===e.relation&&t.before.push(e)}})),(n=i,n.sort((function(e,t){return o[t.step]-o[e.step]||s[t.priority||"normal"]-s[e.priority||"normal"]}))).map(u).reduce((function(e,t){return e.push.apply(e,Object(r.__spread)(t)),e}),[]).map((function(e){return e.middleware}))},f={add:function(t,i){void 0===i&&(i={});var o=i.name,s=Object(r.__assign)({step:"initialize",priority:"normal",middleware:t},i);if(o){if(n.has(o))throw new Error("Duplicate middleware name '"+o+"'");n.add(o)}e.push(s)},addRelativeTo:function(e,i){var o=i.name,s=Object(r.__assign)({middleware:e},i);if(o){if(n.has(o))throw new Error("Duplicated middleware name '"+o+"'");n.add(o)}t.push(s)},clone:function(){return a(i())},use:function(e){e.applyToStack(f)},remove:function(r){return"string"==typeof r?function(r){var i=!1,o=function(e){return!e.name||e.name!==r||(i=!0,n.delete(r),!1)};return e=e.filter(o),t=t.filter(o),i}(r):function(r){var i=!1,o=function(e){return e.middleware!==r||(i=!0,e.name&&n.delete(e.name),!1)};return e=e.filter(o),t=t.filter(o),i}(r)},removeByTag:function(r){var i=!1,o=function(e){var t=e.tags,o=e.name;return!t||!t.includes(r)||(o&&n.delete(o),i=!0,!1)};return e=e.filter(o),t=t.filter(o),i},concat:function(e){var t=a(i());return t.use(e),t},applyToStack:a,resolve:function(e,t){var n,i;try{for(var o=Object(r.__values)(c().reverse()),s=o.next();!s.done;s=o.next()){e=(0,s.value)(e,t)}}catch(e){n={error:e}}finally{try{s&&!s.done&&(i=o.return)&&i.call(o)}finally{if(n)throw n.error}}return e}};return f},o={initialize:5,serialize:4,build:3,finalizeRequest:2,deserialize:1},s={high:3,normal:2,low:1},a=function(){function e(e){this.middlewareStack=i(),this.config=e}return e.prototype.send=function(e,t,n){var r="function"!=typeof t?t:void 0,i="function"==typeof t?t:n,o=e.resolveMiddleware(this.middlewareStack,this.config,r);if(!i)return o(e).then((function(e){return e.output}));o(e).then((function(e){return i(null,e.output)}),(function(e){return i(e)})).catch((function(){}))},e.prototype.destroy=function(){this.config.requestHandler.destroy&&this.config.requestHandler.destroy()},e}(),u=function(){this.middlewareStack=i()};function c(e){return encodeURIComponent(e).replace(/[!'()*]/g,(function(e){return"%"+e.charCodeAt(0).toString(16)}))}var f=function(e){return Array.isArray(e)?e:[e]},l=function(e){for(var t in e)e.hasOwnProperty(t)&&void 0!==e[t]["#text"]?e[t]=e[t]["#text"]:"object"==typeof e[t]&&null!==e[t]&&(e[t]=l(e[t]));return e},d=function(){var e=Object.getPrototypeOf(this).constructor,t=Function.bind.apply(String,Object(r.__spread)([null],arguments)),n=new t;return Object.setPrototypeOf(n,e.prototype),n};d.prototype=Object.create(String.prototype,{constructor:{value:d,enumerable:!1,writable:!0,configurable:!0}}),Object.setPrototypeOf(d,String);var h=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Object(r.__extends)(t,e),t.prototype.deserializeJSON=function(){return JSON.parse(e.prototype.toString.call(this))},t.prototype.toJSON=function(){return e.prototype.toString.call(this)},t.fromObject=function(e){return e instanceof t?e:new t(e instanceof String||"string"==typeof e?e:JSON.stringify(e))},t}(d),p=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],v=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function g(e){var t=e.getUTCFullYear(),n=e.getUTCMonth(),r=e.getUTCDay(),i=e.getUTCDate(),o=e.getUTCHours(),s=e.getUTCMinutes(),a=e.getUTCSeconds();return p[r]+", "+(i<10?"0"+i:""+i)+" "+v[n]+" "+t+" "+(o<10?"0"+o:""+o)+":"+(s<10?"0"+s:""+s)+":"+(a<10?"0"+a:""+a)+" GMT"}var m="***SensitiveInformation***"},function(e,t,n){"use strict";n.r(t),n.d(t,"__extends",(function(){return i})),n.d(t,"__assign",(function(){return o})),n.d(t,"__rest",(function(){return s})),n.d(t,"__decorate",(function(){return a})),n.d(t,"__param",(function(){return u})),n.d(t,"__metadata",(function(){return c})),n.d(t,"__awaiter",(function(){return f})),n.d(t,"__generator",(function(){return l})),n.d(t,"__createBinding",(function(){return d})),n.d(t,"__exportStar",(function(){return h})),n.d(t,"__values",(function(){return p})),n.d(t,"__read",(function(){return v})),n.d(t,"__spread",(function(){return g})),n.d(t,"__spreadArrays",(function(){return m})),n.d(t,"__await",(function(){return b})),n.d(t,"__asyncGenerator",(function(){return y})),n.d(t,"__asyncDelegator",(function(){return w})),n.d(t,"__asyncValues",(function(){return _})),n.d(t,"__makeTemplateObject",(function(){return S})),n.d(t,"__importStar",(function(){return E})),n.d(t,"__importDefault",(function(){return M})),n.d(t,"__classPrivateFieldGet",(function(){return A})),n.d(t,"__classPrivateFieldSet",(function(){return I})); -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -var r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function i(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var o=function(){return(o=Object.assign||function(e){for(var t,n=1,r=arguments.length;n=0;a--)(i=e[a])&&(s=(o<3?i(s):o>3?i(t,n,s):i(t,n))||s);return o>3&&s&&Object.defineProperty(t,n,s),s}function u(e,t){return function(n,r){t(n,r,e)}}function c(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function f(e,t,n,r){return new(n||(n=Promise))((function(i,o){function s(e){try{u(r.next(e))}catch(e){o(e)}}function a(e){try{u(r.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}u((r=r.apply(e,t||[])).next())}))}function l(e,t){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(i=s.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function v(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s}function g(){for(var e=[],t=0;t1||a(e,t)}))})}function a(e,t){try{(n=i[e](t)).value instanceof b?Promise.resolve(n.value.v).then(u,c):f(o[0][2],n)}catch(e){f(o[0][3],e)}var n}function u(e){a("next",e)}function c(e){a("throw",e)}function f(e,t){e(t),o.shift(),o.length&&a(o[0][0],o[0][1])}}function w(e){var t,n;return t={},r("next"),r("throw",(function(e){throw e})),r("return"),t[Symbol.iterator]=function(){return this},t;function r(r,i){t[r]=e[r]?function(t){return(n=!n)?{value:b(e[r](t)),done:"return"===r}:i?i(t):t}:i}}function _(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=p(e),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(n){t[n]=e[n]&&function(t){return new Promise((function(r,i){(function(e,t,n,r){Promise.resolve(r).then((function(t){e({value:t,done:n})}),t)})(r,i,(t=e[n](t)).done,t.value)}))}}}function S(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e}function E(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function M(e){return e&&e.__esModule?e:{default:e}}function A(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)}function I(e,t,n){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,n),n}},function(e,t,n){"use strict";n.d(t,"b",(function(){return r})),n.d(t,"a",(function(){return o}));var r=function(){function e(e){this.statusCode=e.statusCode,this.headers=e.headers||{},this.body=e.body}return e.isInstance=function(e){if(!e)return!1;var t=e;return"number"==typeof t.statusCode&&"object"==typeof t.headers},e}(),i=n(1),o=function(){function e(e){this.method=e.method||"GET",this.hostname=e.hostname||"localhost",this.port=e.port,this.query=e.query||{},this.headers=e.headers||{},this.body=e.body,this.protocol=e.protocol?":"!==e.protocol.substr(-1)?e.protocol+":":e.protocol:"https:",this.path=e.path?"/"!==e.path.charAt(0)?"/"+e.path:e.path:"/"}return e.isInstance=function(e){if(!e)return!1;var t=e;return"method"in t&&"protocol"in t&&"hostname"in t&&"path"in t&&"object"==typeof t.query&&"object"==typeof t.headers},e.prototype.clone=function(){var t,n=new e(Object(i.__assign)(Object(i.__assign)({},this),{headers:Object(i.__assign)({},this.headers)}));return n.query&&(n.query=(t=n.query,Object.keys(t).reduce((function(e,n){var r,o=t[n];return Object(i.__assign)(Object(i.__assign)({},e),((r={})[n]=Array.isArray(o)?Object(i.__spread)(o):o,r))}),{}))),n},e}()},function(e,t,n){"use strict";n.d(t,"f",(function(){return A})),n.d(t,"t",(function(){return I})),n.d(t,"y",(function(){return k})),n.d(t,"s",(function(){return x})),n.d(t,"e",(function(){return C})),n.d(t,"x",(function(){return P})),n.d(t,"g",(function(){return N})),n.d(t,"h",(function(){return R})),n.d(t,"d",(function(){return D})),n.d(t,"c",(function(){return U})),n.d(t,"b",(function(){return B})),n.d(t,"a",(function(){return j})),n.d(t,"u",(function(){return F})),n.d(t,"v",(function(){return q})),n.d(t,"i",(function(){return K})),n.d(t,"w",(function(){return H})),n.d(t,"j",(function(){return V})),n.d(t,"p",(function(){return G})),n.d(t,"k",(function(){return W})),n.d(t,"q",(function(){return $})),n.d(t,"l",(function(){return Y})),n.d(t,"n",(function(){return J})),n.d(t,"r",(function(){return Z})),n.d(t,"o",(function(){return X})),n.d(t,"m",(function(){return Q}));var r=n(6),i=n(32),o=n.n(i);function s(e){var t=new Error(e);return t.source="ulid",t}var a="0123456789ABCDEFGHJKMNPQRSTVWXYZ",u=a.length,c=Math.pow(2,48)-1;function f(e,t,n){return t>e.length-1?e:e.substr(0,t)+n+e.substr(t+1)}function l(e){var t=Math.floor(e()*u);return t===u&&(t=u-1),a.charAt(t)}function d(e,t){if(isNaN(e))throw new Error(e+" must be a number");if(e>c)throw s("cannot encode time greater than "+c);if(e<0)throw s("time must be positive");if(!1===Number.isInteger(e))throw s("time must be an integer");for(var n=void 0,r="";t>0;t--)r=a.charAt(n=e%u)+r,e=(e-n)/u;return r}function h(e,t){for(var n="";e>0;e--)n=l(t)+n;return n}function p(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments[1];t||(t="undefined"!=typeof window?window:null);var r=t&&(t.crypto||t.msCrypto);if(r)return function(){var e=new Uint8Array(1);return r.getRandomValues(e),e[0]/255};try{var i=n(485);return function(){return i.randomBytes(1).readUInt8()/255}}catch(e){}if(e){try{console.error("secure crypto unusable, falling back to insecure Math.random()!")}catch(e){}return function(){return Math.random()}}throw s("secure crypto unusable, insecure Math.random not allowed")}function v(e){e||(e=p());var t=0,n=void 0;return function(r){if(isNaN(r)&&(r=Date.now()),r<=t){var i=n=function(e){for(var t=void 0,n=e.length,r=void 0,i=void 0,o=u-1;!t&&n-- >=0;){if(r=e[n],-1===(i=a.indexOf(r)))throw s("incorrectly encoded string");i!==o?t=f(e,n,a[i+1]):e=f(e,n,a[0])}if("string"==typeof t)return t;throw s("cannot increment this string")}(n);return d(t,10)+i}t=r;var o=n=h(16,e);return d(r,10)+o}}g||(g=p());var g,m=n(109),b=n(4);function y(e){return(y="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var w,_=function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function s(e){try{u(r.next(e))}catch(e){o(e)}}function a(e){try{u(r.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}u((r=r.apply(e,t||[])).next())}))},S=function(e,t){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(i=s.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},M=function(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},A=function(e,t){if(void 0===t&&(t=!0),t)throw new Error("Invalid "+e)},I=function(e){return void 0===e||null==e},k=function e(t,n,r){var i,o=!1;if(0===r.length)return!0;switch(n){case"not":i="every",o=!0;break;case"and":i="every";break;case"or":i="some";break;default:A(n)}var s=r[i]((function(n){if(Object(b.k)(n)){var r=n.field,i=n.operator,o=n.operand,s=t[r];return O(s,i,o)}if(Object(b.j)(n)){var a=n.type,u=n.predicates;return e(t,a,u)}throw new Error("Not a predicate or group")}));return o?!s:s},O=function(e,t,n){switch(t){case"ne":return e!==n;case"eq":return e===n;case"le":return e<=n;case"lt":return e=n;case"gt":return e>n;case"between":var r=E(n,2),i=r[0],o=r[1];return e>=i&&e<=o;case"beginsWith":return e.startsWith(n);case"contains":return e.indexOf(n)>-1;case"notContains":return-1===e.indexOf(n);default:return A(t,!1),!1}},x=function(e){return e&&"function"==typeof e.copyOf},C=function(e){var t={};return Object.keys(e.models).forEach((function(n){t[n]={indexes:[],relationTypes:[]};var r=e.models[n];Object.keys(r.fields).forEach((function(e){var i=r.fields[e];if("object"===y(i.type)&&"model"in i.type){var o=i.association.connectionType;t[n].relationTypes.push({fieldName:i.name,modelName:i.type.model,relationType:o,targetName:i.association.targetName,associatedWith:i.association.associatedWith}),"BELONGS_TO"===o&&t[n].indexes.push(i.association.targetName)}})),r.attributes&&r.attributes.forEach((function(e){if("key"===e.type){var r=e.properties.fields;r&&r.forEach((function(e){t[n].indexes.includes(e)||t[n].indexes.push(e)}))}}))})),t},T=new WeakMap,P=function(e,t,n,r,i){var o=n.relationships,s=i(n.name,e),a=o[e],u=[],c=s.copyOf(t,(function(e){a.relationTypes.forEach((function(o){var s=i(n.name,o.modelName);switch(o.relationType){case"HAS_ONE":if(t[o.fieldName]){var a=void 0;try{a=r(s,t[o.fieldName])}catch(e){}u.push({modelName:o.modelName,item:t[o.fieldName],instance:a}),e[o.fieldName]=e[o.fieldName].id}break;case"BELONGS_TO":if(t[o.fieldName]){a=void 0;try{a=r(s,t[o.fieldName])}catch(e){}e[o.fieldName]._deleted||u.push({modelName:o.modelName,item:t[o.fieldName],instance:a})}e[o.targetName]=e[o.fieldName]?e[o.fieldName].id:null,delete e[o.fieldName];break;case"HAS_MANY":break;default:A(o.relationType)}}))}));u.unshift({modelName:e,item:c,instance:c}),T.has(n)||T.set(n,Array.from(n.modelTopologicalOrdering.keys()));var f=T.get(n);return u.sort((function(e,t){return f.indexOf(e.modelName)-f.indexOf(t.modelName)})),u},N=function(e,t){var n="";return e.some((function(e){e.modelName===t&&(n=e.targetName)})),n},R=function(e,t){return e.find((function(e){return e===t}))};!function(e){e.DATASTORE="datastore",e.USER="user",e.SYNC="sync",e.STORAGE="storage"}(w||(w={}));var L,j=w.DATASTORE,D=w.USER,U=w.SYNC,B=w.STORAGE,F=function(){return new Promise((function(e){var t,n=Object(m.v4)(),r=function(){L=!1,e(!0)},i=function(){return _(void 0,void 0,void 0,(function(){return S(this,(function(r){switch(r.label){case 0:return t&&t.result&&"function"==typeof t.result.close?[4,t.result.close()]:[3,2];case 1:r.sent(),r.label=2;case 2:return[4,indexedDB.deleteDatabase(n)];case 3:return r.sent(),L=!0,[2,e(!1)]}}))}))};return!0===L?i():!1===L||null===indexedDB?r():((t=indexedDB.open(n)).onerror=r,void(t.onsuccess=i))}))},z=function(){return(e=1,r.Buffer.from(o.a.lib.WordArray.random(e).toString(),"hex")).readUInt8(0)/255;var e};function q(e){var t=v(z);return function(){return t(e)}}function K(){return"undefined"!=typeof performance&&performance&&"function"==typeof performance.now?0|performance.now():Date.now()}function H(e){return function(t,n){var r,i;try{for(var o=M(e),s=o.next();!s.done;s=o.next()){var a=s.value,u=a.field,c=a.sortDirection===b.e.ASCENDING?1:-1;if(t[u]n[u])return 1*c}}catch(e){r={error:e}}finally{try{s&&!s.done&&(i=o.return)&&i.call(o)}finally{if(r)throw r.error}}return 0}}var V=function(e){return!!/^\d{4}-\d{2}-\d{2}(Z|[+-]\d{2}:\d{2}($|:\d{2}))?$/.exec(e)},G=function(e){return!!/^\d{2}:\d{2}(:\d{2}(.\d+)?)?(Z|[+-]\d{2}:\d{2}($|:\d{2}))?$/.exec(e)},W=function(e){return!!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(:\d{2}(.\d+)?)?(Z|[+-]\d{2}:\d{2}($|:\d{2}))?$/.exec(e)},$=function(e){return!!/^\d+$/.exec(String(e))},Y=function(e){return!!/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.exec(e)},J=function(e){try{return JSON.parse(e),!0}catch(e){return!1}},Z=function(e){try{return!!new URL(e)}catch(e){return!1}},X=function(e){return!!/^\+?\d[\d\s-]+$/.exec(e)},Q=function(e){return!!/((^((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))$)|(^((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?$))$/.exec(e)}},function(e,t,n){"use strict";n.d(t,"l",(function(){return f})),n.d(t,"m",(function(){return l})),n.d(t,"b",(function(){return r})),n.d(t,"g",(function(){return d})),n.d(t,"h",(function(){return h})),n.d(t,"i",(function(){return p})),n.d(t,"f",(function(){return v})),n.d(t,"c",(function(){return i})),n.d(t,"k",(function(){return g})),n.d(t,"j",(function(){return m})),n.d(t,"d",(function(){return o})),n.d(t,"e",(function(){return s})),n.d(t,"n",(function(){return b})),n.d(t,"a",(function(){return y}));var r,i,o,s,a=n(3),u=function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function s(e){try{u(r.next(e))}catch(e){o(e)}}function a(e){try{u(r.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}u((r=r.apply(e,t||[])).next())}))},c=function(e,t){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(i=s.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1] - * @license MIT - */ -var r=n(269),i=n(270),o=n(160);function s(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function a(e,t){if(s()=s())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s().toString(16)+" bytes");return 0|e}function p(e,t){if(u.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return F(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return z(e).length;default:if(r)return F(e).length;t=(""+t).toLowerCase(),r=!0}}function v(e,t,n){var r=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return x(this,t,n);case"utf8":case"utf-8":return I(this,t,n);case"ascii":return k(this,t,n);case"latin1":case"binary":return O(this,t,n);case"base64":return A(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return C(this,t,n);default:if(r)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),r=!0}}function g(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function m(e,t,n,r,i){if(0===e.length)return-1;if("string"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=i?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(i)return-1;n=e.length-1}else if(n<0){if(!i)return-1;n=0}if("string"==typeof t&&(t=u.from(t,r)),u.isBuffer(t))return 0===t.length?-1:b(e,t,n,r,i);if("number"==typeof t)return t&=255,u.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):b(e,[t],n,r,i);throw new TypeError("val must be string, number or Buffer")}function b(e,t,n,r,i){var o,s=1,a=e.length,u=t.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(e.length<2||t.length<2)return-1;s=2,a/=2,u/=2,n/=2}function c(e,t){return 1===s?e[t]:e.readUInt16BE(t*s)}if(i){var f=-1;for(o=n;oa&&(n=a-u),o=n;o>=0;o--){for(var l=!0,d=0;di&&(r=i):r=i;var o=t.length;if(o%2!=0)throw new TypeError("Invalid hex string");r>o/2&&(r=o/2);for(var s=0;s>8,i=n%256,o.push(i),o.push(r);return o}(t,e.length-n),e,n,r)}function A(e,t,n){return 0===t&&n===e.length?r.fromByteArray(e):r.fromByteArray(e.slice(t,n))}function I(e,t,n){n=Math.min(e.length,n);for(var r=[],i=t;i239?4:c>223?3:c>191?2:1;if(i+l<=n)switch(l){case 1:c<128&&(f=c);break;case 2:128==(192&(o=e[i+1]))&&(u=(31&c)<<6|63&o)>127&&(f=u);break;case 3:o=e[i+1],s=e[i+2],128==(192&o)&&128==(192&s)&&(u=(15&c)<<12|(63&o)<<6|63&s)>2047&&(u<55296||u>57343)&&(f=u);break;case 4:o=e[i+1],s=e[i+2],a=e[i+3],128==(192&o)&&128==(192&s)&&128==(192&a)&&(u=(15&c)<<18|(63&o)<<12|(63&s)<<6|63&a)>65535&&u<1114112&&(f=u)}null===f?(f=65533,l=1):f>65535&&(f-=65536,r.push(f>>>10&1023|55296),f=56320|1023&f),r.push(f),i+=l}return function(e){var t=e.length;if(t<=4096)return String.fromCharCode.apply(String,e);var n="",r=0;for(;r0&&(e=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(e+=" ... ")),""},u.prototype.compare=function(e,t,n,r,i){if(!u.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===i&&(i=this.length),t<0||n>e.length||r<0||i>this.length)throw new RangeError("out of range index");if(r>=i&&t>=n)return 0;if(r>=i)return-1;if(t>=n)return 1;if(this===e)return 0;for(var o=(i>>>=0)-(r>>>=0),s=(n>>>=0)-(t>>>=0),a=Math.min(o,s),c=this.slice(r,i),f=e.slice(t,n),l=0;li)&&(n=i),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var o=!1;;)switch(r){case"hex":return y(this,e,t,n);case"utf8":case"utf-8":return w(this,e,t,n);case"ascii":return _(this,e,t,n);case"latin1":case"binary":return S(this,e,t,n);case"base64":return E(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return M(this,e,t,n);default:if(o)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),o=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function k(e,t,n){var r="";n=Math.min(e.length,n);for(var i=t;ir)&&(n=r);for(var i="",o=t;on)throw new RangeError("Trying to access beyond buffer length")}function P(e,t,n,r,i,o){if(!u.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>i||te.length)throw new RangeError("Index out of range")}function N(e,t,n,r){t<0&&(t=65535+t+1);for(var i=0,o=Math.min(e.length-n,2);i>>8*(r?i:1-i)}function R(e,t,n,r){t<0&&(t=4294967295+t+1);for(var i=0,o=Math.min(e.length-n,4);i>>8*(r?i:3-i)&255}function L(e,t,n,r,i,o){if(n+r>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function j(e,t,n,r,o){return o||L(e,0,n,4),i.write(e,t,n,r,23,4),n+4}function D(e,t,n,r,o){return o||L(e,0,n,8),i.write(e,t,n,r,52,8),n+8}u.prototype.slice=function(e,t){var n,r=this.length;if((e=~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),(t=void 0===t?r:~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),t0&&(i*=256);)r+=this[e+--t]*i;return r},u.prototype.readUInt8=function(e,t){return t||T(e,1,this.length),this[e]},u.prototype.readUInt16LE=function(e,t){return t||T(e,2,this.length),this[e]|this[e+1]<<8},u.prototype.readUInt16BE=function(e,t){return t||T(e,2,this.length),this[e]<<8|this[e+1]},u.prototype.readUInt32LE=function(e,t){return t||T(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},u.prototype.readUInt32BE=function(e,t){return t||T(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},u.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||T(e,t,this.length);for(var r=this[e],i=1,o=0;++o=(i*=128)&&(r-=Math.pow(2,8*t)),r},u.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||T(e,t,this.length);for(var r=t,i=1,o=this[e+--r];r>0&&(i*=256);)o+=this[e+--r]*i;return o>=(i*=128)&&(o-=Math.pow(2,8*t)),o},u.prototype.readInt8=function(e,t){return t||T(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},u.prototype.readInt16LE=function(e,t){t||T(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt16BE=function(e,t){t||T(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt32LE=function(e,t){return t||T(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},u.prototype.readInt32BE=function(e,t){return t||T(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},u.prototype.readFloatLE=function(e,t){return t||T(e,4,this.length),i.read(this,e,!0,23,4)},u.prototype.readFloatBE=function(e,t){return t||T(e,4,this.length),i.read(this,e,!1,23,4)},u.prototype.readDoubleLE=function(e,t){return t||T(e,8,this.length),i.read(this,e,!0,52,8)},u.prototype.readDoubleBE=function(e,t){return t||T(e,8,this.length),i.read(this,e,!1,52,8)},u.prototype.writeUIntLE=function(e,t,n,r){(e=+e,t|=0,n|=0,r)||P(this,e,t,n,Math.pow(2,8*n)-1,0);var i=1,o=0;for(this[t]=255&e;++o=0&&(o*=256);)this[t+i]=e/o&255;return t+n},u.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||P(this,e,t,1,255,0),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},u.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||P(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):N(this,e,t,!0),t+2},u.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||P(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):N(this,e,t,!1),t+2},u.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||P(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):R(this,e,t,!0),t+4},u.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||P(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},u.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var i=Math.pow(2,8*n-1);P(this,e,t,n,i-1,-i)}var o=0,s=1,a=0;for(this[t]=255&e;++o>0)-a&255;return t+n},u.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var i=Math.pow(2,8*n-1);P(this,e,t,n,i-1,-i)}var o=n-1,s=1,a=0;for(this[t+o]=255&e;--o>=0&&(s*=256);)e<0&&0===a&&0!==this[t+o+1]&&(a=1),this[t+o]=(e/s>>0)-a&255;return t+n},u.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||P(this,e,t,1,127,-128),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},u.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||P(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):N(this,e,t,!0),t+2},u.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||P(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):N(this,e,t,!1),t+2},u.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||P(this,e,t,4,2147483647,-2147483648),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):R(this,e,t,!0),t+4},u.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||P(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},u.prototype.writeFloatLE=function(e,t,n){return j(this,e,t,!0,n)},u.prototype.writeFloatBE=function(e,t,n){return j(this,e,t,!1,n)},u.prototype.writeDoubleLE=function(e,t,n){return D(this,e,t,!0,n)},u.prototype.writeDoubleBE=function(e,t,n){return D(this,e,t,!1,n)},u.prototype.copy=function(e,t,n,r){if(n||(n=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t=0;--i)e[i+t]=this[i+n];else if(o<1e3||!u.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"==typeof e)for(o=t;o55295&&n<57344){if(!i){if(n>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(s+1===r){(t-=3)>-1&&o.push(239,191,189);continue}i=n;continue}if(n<56320){(t-=3)>-1&&o.push(239,191,189),i=n;continue}n=65536+(i-55296<<10|n-56320)}else i&&(t-=3)>-1&&o.push(239,191,189);if(i=null,n<128){if((t-=1)<0)break;o.push(n)}else if(n<2048){if((t-=2)<0)break;o.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;o.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return o}function z(e){return r.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(U,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function q(e,t,n,r){for(var i=0;i=t.length||i>=e.length);++i)t[i+n]=e[i];return i}}).call(this,n(31))},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:e.exports=function(e,t){if(t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}}},function(e,t,n){ -/*! safe-buffer. MIT License. Feross Aboukhadijeh */ -var r=n(6),i=r.Buffer;function o(e,t){for(var n in e)t[n]=e[n]}function s(e,t,n){return i(e,t,n)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?e.exports=r:(o(r,t),t.Buffer=s),s.prototype=Object.create(i.prototype),o(i,s),s.from=function(e,t,n){if("number"==typeof e)throw new TypeError("Argument must not be a number");return i(e,t,n)},s.alloc=function(e,t,n){if("number"!=typeof e)throw new TypeError("Argument must be a number");var r=i(e);return void 0!==t?"string"==typeof n?r.fill(t,n):r.fill(t):r.fill(0),r},s.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return i(e)},s.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return r.SlowBuffer(e)}},function(e,t,n){"use strict";n.d(t,"c",(function(){return o})),n.d(t,"b",(function(){return s})),n.d(t,"a",(function(){return a}));var r=n(3),i=new WeakSet;function o(e){return i.has(e)}Symbol("A predicate that matches all records");var s=function(){function e(){}return Object.defineProperty(e,"ALL",{get:function(){var e=function(e){return e};return i.add(e),e},enumerable:!0,configurable:!0}),e}(),a=function(){function e(){}return e.createPredicateBuilder=function(t){var n,i=t.name,o=new Set(Object.keys(t.fields)),s=new Proxy({},n={get:function(t,s,a){var u=s;switch(u){case"and":case"or":case"not":return function(t){var r={type:u,predicates:[]},i=new Proxy({},n);return e.predicateGroupsMap.set(i,r),t(i),e.predicateGroupsMap.get(a).predicates.push(r),a};default:Object(r.f)(u,!1)}var c=s;if(!o.has(c))throw new Error("Invalid field for model. field: "+c+", model: "+i);return function(t,n){return e.predicateGroupsMap.get(a).predicates.push({field:c,operator:t,operand:n}),a}}});return e.predicateGroupsMap.set(s,{type:"and",predicates:[]}),s},e.isValidPredicate=function(t){return e.predicateGroupsMap.has(t)},e.getPredicates=function(t,n){if(void 0===n&&(n=!0),n&&!e.isValidPredicate(t))throw new Error("The predicate is not valid");return e.predicateGroupsMap.get(t)},e.createFromExisting=function(t,n){if(n&&t)return n(e.createPredicateBuilder(t))},e.createForId=function(t,n){return e.createPredicateBuilder(t).id("eq",n)},e.predicateGroupsMap=new WeakMap,e}()},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var r=n(1),i={name:"deserializerMiddleware",step:"deserialize",tags:["DESERIALIZER"]},o={name:"serializerMiddleware",step:"serialize",tags:["SERIALIZER"]};function s(e,t,n){return{applyToStack:function(s){s.add(function(e,t){return function(n,i){return function(o){return Object(r.__awaiter)(void 0,void 0,void 0,(function(){var s,a,u,c,f;return Object(r.__generator)(this,(function(l){switch(l.label){case 0:return s=i.logger,a=i.outputFilterSensitiveLog,[4,n(o)];case 1:return u=l.sent().response,"function"==typeof(null==s?void 0:s.debug)&&s.debug({httpResponse:u}),[4,t(u,e)];case 2:return c=l.sent(),c.$metadata,f=Object(r.__rest)(c,["$metadata"]),"function"==typeof(null==s?void 0:s.info)&&s.info({output:a(f)}),[2,{response:u,output:c}]}}))}))}}}(e,n),i),s.add(function(e,t){return function(n,i){return function(o){return Object(r.__awaiter)(void 0,void 0,void 0,(function(){var s,a,u;return Object(r.__generator)(this,(function(c){switch(c.label){case 0:return s=i.logger,a=i.inputFilterSensitiveLog,"function"==typeof(null==s?void 0:s.info)&&s.info({input:a(o.input)}),[4,t(o.input,e)];case 1:return u=c.sent(),"function"==typeof(null==s?void 0:s.debug)&&s.debug({httpRequest:u}),[2,n(Object(r.__assign)(Object(r.__assign)({},o),{request:u}))]}}))}))}}}(e,t),o)}}}},function(e,t,n){"use strict";n.d(t,"b",(function(){return o})),n.d(t,"a",(function(){return v})),n.d(t,"c",(function(){return m}));var r=n(1),i={name:"retryMiddleware",tags:["RETRY"],step:"finalizeRequest",priority:"high"},o=function(e){return{applyToStack:function(t){t.add(function(e){return function(t){return function(n){return Object(r.__awaiter)(void 0,void 0,void 0,(function(){return Object(r.__generator)(this,(function(r){return[2,e.retryStrategy.retry(t,n)]}))}))}}}(e),i)}}},s=n(2),a=["AuthFailure","InvalidSignatureException","RequestExpired","RequestInTheFuture","RequestTimeTooSkewed","SignatureDoesNotMatch"],u=["Throttling","ThrottlingException","ThrottledException","RequestThrottledException","TooManyRequestsException","ProvisionedThroughputExceededException","TransactionInProgressException","RequestLimitExceeded","BandwidthLimitExceeded","LimitExceededException","RequestThrottled","SlowDown","PriorRequestNotComplete","EC2ThrottledException"],c=["AbortError","TimeoutError","RequestTimeout","RequestTimeoutException"],f=[500,502,503,504],l=function(e){var t;return u.includes(e.name)||1==(null===(t=e.$retryable)||void 0===t?void 0:t.throttling)},d=n(27),h=function(e,t){return Math.floor(Math.min(2e4,Math.random()*Math.pow(2,t)*e))},p=function(e){return!!e&&(function(e){return void 0!==e.$retryable}(e)||function(e){return a.includes(e.name)}(e)||l(e)||function(e){var t;return c.includes(e.name)||f.includes((null===(t=e.$metadata)||void 0===t?void 0:t.httpStatusCode)||0)}(e))},v=3,g=function(){function e(e,t){var n,r,i,o,s,a,u,c;this.maxAttemptsProvider=e,this.retryDecider=null!==(n=null==t?void 0:t.retryDecider)&&void 0!==n?n:p,this.delayDecider=null!==(r=null==t?void 0:t.delayDecider)&&void 0!==r?r:h,this.retryQuota=null!==(i=null==t?void 0:t.retryQuota)&&void 0!==i?i:(s=o=500,a=o,u=function(e){return"TimeoutError"===e.name?10:5},c=function(e){return u(e)<=a},Object.freeze({hasRetryTokens:c,retrieveRetryTokens:function(e){if(!c(e))throw new Error("No retry token available");var t=u(e);return a-=t,t},releaseRetryTokens:function(e){a+=null!=e?e:1,a=Math.min(a,s)}}))}return e.prototype.shouldRetry=function(e,t,n){return t>6|192,63&i|128);else if(n+1>18|240,o>>12&63|128,o>>6&63|128,63&o|128)}else t.push(i>>12|224,i>>6&63|128,63&i|128)}return Uint8Array.from(t)}(e)},i=function(e){return"function"==typeof TextDecoder?function(e){return new TextDecoder("utf-8").decode(e)}(e):function(e){for(var t="",n=0,r=e.length;n",'"',"`"," ","\r","\n","\t"]),f=["'"].concat(c),l=["%","/","?",";","#"].concat(f),d=["/","?","#"],h=/^[+a-z0-9A-Z_-]{0,63}$/,p=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,v={javascript:!0,"javascript:":!0},g={javascript:!0,"javascript:":!0},m={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},b=n(368);function y(e,t,n){if(e&&i.isObject(e)&&e instanceof o)return e;var r=new o;return r.parse(e,t,n),r}o.prototype.parse=function(e,t,n){if(!i.isString(e))throw new TypeError("Parameter 'url' must be a string, not "+typeof e);var o=e.indexOf("?"),a=-1!==o&&o127?N+="x":N+=P[R];if(!N.match(h)){var j=C.slice(0,k),D=C.slice(k+1),U=P.match(p);U&&(j.push(U[1]),D.unshift(U[2])),D.length&&(y="/"+D.join(".")+y),this.hostname=j.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),x||(this.hostname=r.toASCII(this.hostname));var B=this.port?":"+this.port:"",F=this.hostname||"";this.host=F+B,this.href+=this.host,x&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==y[0]&&(y="/"+y))}if(!v[S])for(k=0,T=f.length;k0)&&n.host.split("@"))&&(n.auth=x.shift(),n.host=n.hostname=x.shift());return n.search=e.search,n.query=e.query,i.isNull(n.pathname)&&i.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.href=n.format(),n}if(!E.length)return n.pathname=null,n.search?n.path="/"+n.search:n.path=null,n.href=n.format(),n;for(var A=E.slice(-1)[0],I=(n.host||e.host||E.length>1)&&("."===A||".."===A)||""===A,k=0,O=E.length;O>=0;O--)"."===(A=E[O])?E.splice(O,1):".."===A?(E.splice(O,1),k++):k&&(E.splice(O,1),k--);if(!_&&!S)for(;k--;k)E.unshift("..");!_||""===E[0]||E[0]&&"/"===E[0].charAt(0)||E.unshift(""),I&&"/"!==E.join("/").substr(-1)&&E.push("");var x,C=""===E[0]||E[0]&&"/"===E[0].charAt(0);M&&(n.hostname=n.host=C?"":E.length?E.shift():"",(x=!!(n.host&&n.host.indexOf("@")>0)&&n.host.split("@"))&&(n.auth=x.shift(),n.host=n.hostname=x.shift()));return(_=_||n.host&&E.length)&&!C&&E.unshift(""),E.length?n.pathname=E.join("/"):(n.pathname=null,n.path=null),i.isNull(n.pathname)&&i.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.auth=e.auth||n.auth,n.slashes=n.slashes||e.slashes,n.href=n.format(),n},o.prototype.parseHost=function(){var e=this.host,t=a.exec(e);t&&(":"!==(t=t[0])&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return f})),n.d(t,"b",(function(){return l}));for(var r={},i=new Array(64),o=0,s="A".charCodeAt(0),a="Z".charCodeAt(0);o+s<=a;o++){var u=String.fromCharCode(o+s);r[u]=o,i[o]=u}for(o=0,s="a".charCodeAt(0),a="z".charCodeAt(0);o+s<=a;o++){u=String.fromCharCode(o+s);var c=o+26;r[u]=c,i[c]=u}for(o=0;o<10;o++){r[o.toString(10)]=o+52;u=o.toString(10),c=o+52;r[u]=c,i[c]=u}r["+"]=62,i[62]="+",r["/"]=63,i[63]="/";function f(e){var t=e.length/4*3;"=="===e.substr(-2)?t-=2:"="===e.substr(-1)&&t--;for(var n=new ArrayBuffer(t),i=new DataView(n),o=0;o>=6;var f=o/4*3;s>>=a%8;for(var l=Math.floor(a/8),d=0;d>h)}}return new Uint8Array(n)}function l(e){for(var t="",n=0;n>f]}t+="==".slice(0,4-u)}return t}},function(e,t,n){"use strict";n.d(t,"a",(function(){return s})),n.d(t,"b",(function(){return u}));var r=n(1),i=n(2),o=n(74);var s=function(){function e(e){void 0===e&&(e={}),this.httpOptions=e}return e.prototype.destroy=function(){},e.prototype.handle=function(e,t){var n=null==t?void 0:t.abortSignal,s=this.httpOptions.requestTimeout;if(null==n?void 0:n.aborted){var a=new Error("Request aborted");return a.name="AbortError",Promise.reject(a)}var u=e.path;if(e.query){var c=Object(o.a)(e.query);c&&(u+="?"+c)}var f=e.port,l=e.protocol+"//"+e.hostname+(f?":"+f:"")+u,d={body:e.body,headers:new Headers(e.headers),method:e.method};"undefined"!=typeof AbortController&&(d.signal=n);var h,p=new Request(l,d),v=[fetch(p).then((function(e){var t,n,o=e.headers,s={};try{for(var a=Object(r.__values)(o.entries()),u=a.next();!u.done;u=a.next()){var c=u.value;s[c[0]]=c[1]}}catch(e){t={error:e}}finally{try{u&&!u.done&&(n=a.return)&&n.call(a)}finally{if(t)throw t.error}}return void 0!==e.body?{response:new i.b({headers:s,statusCode:e.status,body:e.body})}:e.blob().then((function(t){return{response:new i.b({headers:s,statusCode:e.status,body:t})}}))})),(h=s,void 0===h&&(h=0),new Promise((function(e,t){h&&setTimeout((function(){var e=new Error("Request did not complete within "+h+" ms");e.name="TimeoutError",t(e)}),h)})))];return n&&v.push(new Promise((function(e,t){n.onabort=function(){var e=new Error("Request aborted");e.name="AbortError",t(e)}}))),Promise.race(v)},e}(),a=n(17),u=function(e){return"function"==typeof Blob&&e instanceof Blob?function(e){return Object(r.__awaiter)(this,void 0,void 0,(function(){var t,n;return Object(r.__generator)(this,(function(r){switch(r.label){case 0:return[4,c(e)];case 1:return t=r.sent(),n=Object(a.a)(t),[2,new Uint8Array(n)]}}))}))}(e):function(e){return Object(r.__awaiter)(this,void 0,void 0,(function(){var t,n,i,o,s,a,u;return Object(r.__generator)(this,(function(r){switch(r.label){case 0:t=new Uint8Array(0),n=e.getReader(),i=!1,r.label=1;case 1:return i?[3,3]:[4,n.read()];case 2:return o=r.sent(),s=o.done,(a=o.value)&&(u=t,(t=new Uint8Array(u.length+a.length)).set(u),t.set(a,u.length)),i=s,[3,1];case 3:return[2,t]}}))}))}(e)};function c(e){return new Promise((function(t,n){var r=new FileReader;r.onloadend=function(){var e;if(2!==r.readyState)return n(new Error("Reader aborted too early"));var i=null!==(e=r.result)&&void 0!==e?e:"",o=i.indexOf(","),s=o>-1?o+1:i.length;t(i.substring(s))},r.onabort=function(){return n(new Error("Read aborted"))},r.onerror=function(){return n(r.error)},r.readAsDataURL(e)}))}},function(e,t,n){"use strict";n.d(t,"b",(function(){return s})),n.d(t,"a",(function(){return a}));var r=n(44),i=function(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},o=new r.a("Amplify"),s=function(){function e(){this._components=[],this._config={},this._modules={},this.Auth=null,this.Analytics=null,this.API=null,this.Credentials=null,this.Storage=null,this.I18n=null,this.Cache=null,this.PubSub=null,this.Interactions=null,this.Pushnotification=null,this.UI=null,this.XR=null,this.Predictions=null,this.DataStore=null,this.Logger=r.a,this.ServiceWorker=null}return e.prototype.register=function(e){o.debug("component registered in amplify",e),this._components.push(e),"function"==typeof e.getModuleName?(this._modules[e.getModuleName()]=e,this[e.getModuleName()]=e):o.debug("no getModuleName method for component",e),e.configure(this._config)},e.prototype.configure=function(e){var t=this;return e?(this._config=Object.assign(this._config,e),o.debug("amplify config",this._config),Object.entries(this._modules).forEach((function(e){var n=i(e,2),r=(n[0],n[1]);Object.keys(r).forEach((function(e){t._modules[e]&&(r[e]=t._modules[e])}))})),this._components.map((function(e){e.configure(t._config)})),this._config):this._config},e.prototype.addPluggable=function(e){e&&e.getCategory&&"function"==typeof e.getCategory&&this._components.map((function(t){t.addPluggable&&"function"==typeof t.addPluggable&&t.addPluggable(e)}))},e}(),a=new s},function(e,t){var n,r,i=e.exports={};function o(){throw new Error("setTimeout has not been defined")}function s(){throw new Error("clearTimeout has not been defined")}function a(e){if(n===setTimeout)return setTimeout(e,0);if((n===o||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:o}catch(e){n=o}try{r="function"==typeof clearTimeout?clearTimeout:s}catch(e){r=s}}();var u,c=[],f=!1,l=-1;function d(){f&&u&&(f=!1,u.length?c=u.concat(c):l=-1,c.length&&h())}function h(){if(!f){var e=a(d);f=!0;for(var t=c.length;t;){for(u=c,c=[];++l1)for(var n=1;n=0&&!o.headers[":authority"]?(delete o.headers.host,o.headers[":authority"]=""):o.headers.host||(o.headers.host=o.hostname),[2,t(n)]):[2,t(n)]}))}))}}}(e),s)}}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return i})),n.d(t,"b",(function(){return a}));var r=n(1),i=function(e){var t;return Object(r.__assign)(Object(r.__assign)({},e),{tls:null===(t=e.tls)||void 0===t||t,endpoint:e.endpoint?o(e):function(){return s(e)},isCustomEndpoint:!!e.endpoint})},o=function(e){var t=e.endpoint,n=e.urlParser;if("string"==typeof t){var r=Promise.resolve(n(t));return function(){return r}}if("object"==typeof t){var i=Promise.resolve(t);return function(){return i}}return t},s=function(e){return Object(r.__awaiter)(void 0,void 0,void 0,(function(){var t,n,i,o,s;return Object(r.__generator)(this,(function(r){switch(r.label){case 0:return t=e.tls,n=void 0===t||t,[4,e.region()];case 1:if(i=r.sent(),!new RegExp(/^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])$/).test(i))throw new Error("Invalid region in client config");return[4,e.regionInfoProvider(i)];case 2:if(!(o=(null!==(s=r.sent())&&void 0!==s?s:{}).hostname))throw new Error("Cannot resolve hostname from client config");return[2,e.urlParser((n?"https:":"http:")+"//"+o)]}}))}))},a=function(e){if(!e.region)throw new Error("Region is missing");return Object(r.__assign)(Object(r.__assign)({},e),{region:u(e.region)})},u=function(e){if("string"==typeof e){var t=Promise.resolve(e);return function(){return t}}return e}},function(e,t,n){"use strict";function r(e){return e}n.d(t,"b",(function(){return r})),n.d(t,"a",(function(){return a}));var i=n(1),o=n(2);var s={name:"getUserAgentMiddleware",step:"build",tags:["SET_USER_AGENT","USER_AGENT"]},a=function(e){return{applyToStack:function(t){var n;t.add((n=e,function(e){return function(t){var r=t.request;if(!o.a.isInstance(r))return e(t);var s=r.headers,a="node"===n.runtime?"user-agent":"x-amz-user-agent";return s[a]?s[a]+=" "+n.defaultUserAgent:s[a]=""+n.defaultUserAgent,n.customUserAgent&&(s[a]+=" "+n.customUserAgent),e(Object(i.__assign)(Object(i.__assign)({},t),{request:r}))}}),s)}}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var r=function(e){return function(){throw new Error(e)}}},function(e,t,n){"use strict";n.d(t,"b",(function(){return o})),n.d(t,"a",(function(){return l}));var r=n(1),i=n(111);function o(e){var t,n=this,o=s(e.credentials||e.credentialDefaultProvider(e)),a=e.signingEscapePath,u=void 0===a||a,c=e.systemClockOffset,f=void 0===c?e.systemClockOffset||0:c,l=e.sha256;return t=e.signer?s(e.signer):function(){return s(e.region)().then((function(t){return Object(r.__awaiter)(n,void 0,void 0,(function(){return Object(r.__generator)(this,(function(n){switch(n.label){case 0:return[4,e.regionInfoProvider(t)];case 1:return[2,[n.sent()||{},t]]}}))}))})).then((function(t){var n=Object(r.__read)(t,2),s=n[0],a=n[1],c=s.signingRegion,f=void 0===c?e.signingRegion:c,d=s.signingService,h=void 0===d?e.signingName:d;return e.signingRegion=e.signingRegion||f||a,e.signingName=e.signingName||h,new i.a({credentials:o,region:e.signingRegion,service:e.signingName,sha256:l,uriEscapePath:u})}))},Object(r.__assign)(Object(r.__assign)({},e),{systemClockOffset:f,signingEscapePath:u,credentials:o,signer:t})}function s(e){if("object"==typeof e){var t=Promise.resolve(e);return function(){return t}}return e}var a=n(2),u=function(e){return new Date(Date.now()+e)};function c(e){return function(t,n){return function(i){return Object(r.__awaiter)(this,void 0,void 0,(function(){var o,s,c,f,l,d,h,p,v;return Object(r.__generator)(this,(function(g){switch(g.label){case 0:return a.a.isInstance(i.request)?"function"!=typeof e.signer?[3,2]:[4,e.signer()]:[2,t(i)];case 1:return s=g.sent(),[3,3];case 2:s=e.signer,g.label=3;case 3:return o=s,f=t,l=[Object(r.__assign)({},i)],v={},[4,o.sign(i.request,{signingDate:new Date(Date.now()+e.systemClockOffset),signingRegion:n.signing_region,signingService:n.signing_service})];case 4:return[4,f.apply(void 0,[r.__assign.apply(void 0,l.concat([(v.request=g.sent(),v)]))])];case 5:return c=g.sent(),d=c.response.headers,(h=d&&(d.date||d.Date))&&(p=Date.parse(h),m=p,b=e.systemClockOffset,Math.abs(u(b).getTime()-m)>=3e5&&(e.systemClockOffset=p-Date.now())),[2,c]}var m,b}))}))}}}var f={name:"awsAuthMiddleware",tags:["SIGNATURE","AWSAUTH"],relation:"after",toMiddleware:"retryMiddleware"},l=function(e){return{applyToStack:function(t){t.addRelativeTo(c(e),f)}}}},function(e,t,n){"use strict";var r=n(19),i={keyPrefix:"aws-amplify-cache",capacityInBytes:1048576,itemMaxSize:21e4,defaultTTL:2592e5,defaultPriority:5,warningThreshold:.8,storage:(new(n(86).a)).getStorage()};function o(e){var t=0;t=e.length;for(var n=e.length;n>=0;n-=1){var r=e.charCodeAt(n);r>127&&r<=2047?t+=1:r>2047&&r<=65535&&(t+=2),r>=56320&&r<=57343&&(n-=1)}return t}function s(){return(new Date).getTime()}function a(e){return Number.isInteger?Number.isInteger(e):function(e){return"number"==typeof e&&isFinite(e)&&Math.floor(e)===e}(e)}var u={},c=(function(){function e(){}e.clear=function(){u={}},e.getItem=function(e){return u[e]||null},e.setItem=function(e,t){u[e]=t},e.removeItem=function(e){delete u[e]}}(),n(44));function f(e){return(f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var l,d=new c.a("StorageCache"),h=function(){function e(e){this.config=Object.assign({},e),this.cacheCurSizeKey=this.config.keyPrefix+"CurSize",this.checkConfig()}return e.prototype.getModuleName=function(){return"Cache"},e.prototype.checkConfig=function(){a(this.config.capacityInBytes)||(d.error("Invalid parameter: capacityInBytes. It should be an Integer. Setting back to default."),this.config.capacityInBytes=i.capacityInBytes),a(this.config.itemMaxSize)||(d.error("Invalid parameter: itemMaxSize. It should be an Integer. Setting back to default."),this.config.itemMaxSize=i.itemMaxSize),a(this.config.defaultTTL)||(d.error("Invalid parameter: defaultTTL. It should be an Integer. Setting back to default."),this.config.defaultTTL=i.defaultTTL),a(this.config.defaultPriority)||(d.error("Invalid parameter: defaultPriority. It should be an Integer. Setting back to default."),this.config.defaultPriority=i.defaultPriority),this.config.itemMaxSize>this.config.capacityInBytes&&(d.error("Invalid parameter: itemMaxSize. It should be smaller than capacityInBytes. Setting back to default."),this.config.itemMaxSize=i.itemMaxSize),(this.config.defaultPriority>5||this.config.defaultPriority<1)&&(d.error("Invalid parameter: defaultPriority. It should be between 1 and 5. Setting back to default."),this.config.defaultPriority=i.defaultPriority),(Number(this.config.warningThreshold)>1||Number(this.config.warningThreshold)<0)&&(d.error("Invalid parameter: warningThreshold. It should be between 0 and 1. Setting back to default."),this.config.warningThreshold=i.warningThreshold);this.config.capacityInBytes>5242880&&(d.error("Cache Capacity should be less than 5MB. Setting back to default. Setting back to default."),this.config.capacityInBytes=i.capacityInBytes)},e.prototype.fillCacheItem=function(e,t,n){var r={key:e,data:t,timestamp:s(),visitedTime:s(),priority:n.priority,expires:n.expires,type:f(t),byteSize:0};return r.byteSize=o(JSON.stringify(r)),r.byteSize=o(JSON.stringify(r)),r},e.prototype.configure=function(e){return e?(e.keyPrefix&&d.warn("Don't try to configure keyPrefix!"),this.config=Object.assign({},this.config,e,e.Cache),this.checkConfig(),this.config):this.config},e}(),p=(l=function(e,t){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)},function(e,t){function n(){this.constructor=e}l(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),v=new c.a("Cache"),g=new(function(e){function t(t){var n=this,r=t?Object.assign({},i,t):i;return(n=e.call(this,r)||this).config.storage=r.storage,n.getItem=n.getItem.bind(n),n.setItem=n.setItem.bind(n),n.removeItem=n.removeItem.bind(n),n}return p(t,e),t.prototype._decreaseCurSizeInBytes=function(e){var t=this.getCacheCurSize();this.config.storage.setItem(this.cacheCurSizeKey,(t-e).toString())},t.prototype._increaseCurSizeInBytes=function(e){var t=this.getCacheCurSize();this.config.storage.setItem(this.cacheCurSizeKey,(t+e).toString())},t.prototype._refreshItem=function(e,t){return e.visitedTime=s(),this.config.storage.setItem(t,JSON.stringify(e)),e},t.prototype._isExpired=function(e){var t=this.config.storage.getItem(e),n=JSON.parse(t);return s()>=n.expires},t.prototype._removeItem=function(e,t){var n=t||JSON.parse(this.config.storage.getItem(e)).byteSize;this._decreaseCurSizeInBytes(n),this.config.storage.removeItem(e)},t.prototype._setItem=function(e,t){this._increaseCurSizeInBytes(t.byteSize);try{this.config.storage.setItem(e,JSON.stringify(t))}catch(e){this._decreaseCurSizeInBytes(t.byteSize),v.error("Failed to set item "+e)}},t.prototype._sizeToPop=function(e){var t=this.getCacheCurSize()+e-this.config.capacityInBytes,n=(1-this.config.warningThreshold)*this.config.capacityInBytes;return t>n?t:n},t.prototype._isCacheFull=function(e){return e+this.getCacheCurSize()>this.config.capacityInBytes},t.prototype._findValidKeys=function(){for(var e=[],t=[],n=0;nt.priority?-1:e.priority5)v.warn("Invalid parameter: priority due to out or range. It should be within 1 and 5.");else{var o=this.fillCacheItem(r,t,i);if(o.byteSize>this.config.itemMaxSize)v.warn("Item with key: "+e+" you are trying to put into is too big!");else try{var a=this.config.storage.getItem(r);if(a&&this._removeItem(r,JSON.parse(a).byteSize),this._isCacheFull(o.byteSize)){var u=this._findValidKeys();if(this._isCacheFull(o.byteSize)){var c=this._sizeToPop(o.byteSize);this._popOutItems(u,c)}}this._setItem(r,o)}catch(e){v.warn("setItem failed! "+e)}}}else v.warn("The value of item should not be undefined!");else v.warn("Invalid key: should not be empty or 'CurSize'")},t.prototype.getItem=function(e,t){v.log("Get item: key is "+e+" with options "+t);var n=null,r=this.config.keyPrefix+e;if(r===this.config.keyPrefix||r===this.cacheCurSizeKey)return v.warn("Invalid key: should not be empty or 'CurSize'"),null;try{if(null!=(n=this.config.storage.getItem(r))){if(!this._isExpired(r)){var i=JSON.parse(n);return(i=this._refreshItem(i,r)).data}this._removeItem(r,JSON.parse(n).byteSize),n=null}if(t&&void 0!==t.callback){var o=t.callback();return null!==o&&this.setItem(e,o,t),o}return null}catch(e){return v.warn("getItem failed! "+e),null}},t.prototype.removeItem=function(e){v.log("Remove item: key is "+e);var t=this.config.keyPrefix+e;if(t!==this.config.keyPrefix&&t!==this.cacheCurSizeKey)try{var n=this.config.storage.getItem(t);n&&this._removeItem(t,JSON.parse(n).byteSize)}catch(e){v.warn("removeItem failed! "+e)}},t.prototype.clear=function(){v.log("Clear Cache");for(var e=[],t=0;t=49&&s<=54?s-49+10:s>=17&&s<=22?s-17+10:15&s}return r}function u(e,t,n,r){for(var i=0,o=Math.min(e.length,n),s=t;s=49?a-49+10:a>=17?a-17+10:a}return i}o.isBN=function(e){return e instanceof o||null!==e&&"object"==typeof e&&e.constructor.wordSize===o.wordSize&&Array.isArray(e.words)},o.max=function(e,t){return e.cmp(t)>0?e:t},o.min=function(e,t){return e.cmp(t)<0?e:t},o.prototype._init=function(e,t,n){if("number"==typeof e)return this._initNumber(e,t,n);if("object"==typeof e)return this._initArray(e,t,n);"hex"===t&&(t=16),r(t===(0|t)&&t>=2&&t<=36);var i=0;"-"===(e=e.toString().replace(/\s+/g,""))[0]&&i++,16===t?this._parseHex(e,i):this._parseBase(e,t,i),"-"===e[0]&&(this.negative=1),this.strip(),"le"===n&&this._initArray(this.toArray(),t,n)},o.prototype._initNumber=function(e,t,n){e<0&&(this.negative=1,e=-e),e<67108864?(this.words=[67108863&e],this.length=1):e<4503599627370496?(this.words=[67108863&e,e/67108864&67108863],this.length=2):(r(e<9007199254740992),this.words=[67108863&e,e/67108864&67108863,1],this.length=3),"le"===n&&this._initArray(this.toArray(),t,n)},o.prototype._initArray=function(e,t,n){if(r("number"==typeof e.length),e.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(e.length/3),this.words=new Array(this.length);for(var i=0;i=0;i-=3)s=e[i]|e[i-1]<<8|e[i-2]<<16,this.words[o]|=s<>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);else if("le"===n)for(i=0,o=0;i>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);return this.strip()},o.prototype._parseHex=function(e,t){this.length=Math.ceil((e.length-t)/6),this.words=new Array(this.length);for(var n=0;n=t;n-=6)i=a(e,n,n+6),this.words[r]|=i<>>26-o&4194303,(o+=24)>=26&&(o-=26,r++);n+6!==t&&(i=a(e,t,n+6),this.words[r]|=i<>>26-o&4194303),this.strip()},o.prototype._parseBase=function(e,t,n){this.words=[0],this.length=1;for(var r=0,i=1;i<=67108863;i*=t)r++;r--,i=i/t|0;for(var o=e.length-n,s=o%r,a=Math.min(o,o-s)+n,c=0,f=n;f1&&0===this.words[this.length-1];)this.length--;return this._normSign()},o.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},o.prototype.inspect=function(){return(this.red?""};var c=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],f=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],l=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function d(e,t,n){n.negative=t.negative^e.negative;var r=e.length+t.length|0;n.length=r,r=r-1|0;var i=0|e.words[0],o=0|t.words[0],s=i*o,a=67108863&s,u=s/67108864|0;n.words[0]=a;for(var c=1;c>>26,l=67108863&u,d=Math.min(c,t.length-1),h=Math.max(0,c-e.length+1);h<=d;h++){var p=c-h|0;f+=(s=(i=0|e.words[p])*(o=0|t.words[h])+l)/67108864|0,l=67108863&s}n.words[c]=0|l,u=0|f}return 0!==u?n.words[c]=0|u:n.length--,n.strip()}o.prototype.toString=function(e,t){var n;if(t=0|t||1,16===(e=e||10)||"hex"===e){n="";for(var i=0,o=0,s=0;s>>24-i&16777215)||s!==this.length-1?c[6-u.length]+u+n:u+n,(i+=2)>=26&&(i-=26,s--)}for(0!==o&&(n=o.toString(16)+n);n.length%t!=0;)n="0"+n;return 0!==this.negative&&(n="-"+n),n}if(e===(0|e)&&e>=2&&e<=36){var d=f[e],h=l[e];n="";var p=this.clone();for(p.negative=0;!p.isZero();){var v=p.modn(h).toString(e);n=(p=p.idivn(h)).isZero()?v+n:c[d-v.length]+v+n}for(this.isZero()&&(n="0"+n);n.length%t!=0;)n="0"+n;return 0!==this.negative&&(n="-"+n),n}r(!1,"Base should be between 2 and 36")},o.prototype.toNumber=function(){var e=this.words[0];return 2===this.length?e+=67108864*this.words[1]:3===this.length&&1===this.words[2]?e+=4503599627370496+67108864*this.words[1]:this.length>2&&r(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-e:e},o.prototype.toJSON=function(){return this.toString(16)},o.prototype.toBuffer=function(e,t){return r(void 0!==s),this.toArrayLike(s,e,t)},o.prototype.toArray=function(e,t){return this.toArrayLike(Array,e,t)},o.prototype.toArrayLike=function(e,t,n){var i=this.byteLength(),o=n||Math.max(1,i);r(i<=o,"byte array longer than desired length"),r(o>0,"Requested array length <= 0"),this.strip();var s,a,u="le"===t,c=new e(o),f=this.clone();if(u){for(a=0;!f.isZero();a++)s=f.andln(255),f.iushrn(8),c[a]=s;for(;a=4096&&(n+=13,t>>>=13),t>=64&&(n+=7,t>>>=7),t>=8&&(n+=4,t>>>=4),t>=2&&(n+=2,t>>>=2),n+t},o.prototype._zeroBits=function(e){if(0===e)return 26;var t=e,n=0;return 0==(8191&t)&&(n+=13,t>>>=13),0==(127&t)&&(n+=7,t>>>=7),0==(15&t)&&(n+=4,t>>>=4),0==(3&t)&&(n+=2,t>>>=2),0==(1&t)&&n++,n},o.prototype.bitLength=function(){var e=this.words[this.length-1],t=this._countBits(e);return 26*(this.length-1)+t},o.prototype.zeroBits=function(){if(this.isZero())return 0;for(var e=0,t=0;te.length?this.clone().ior(e):e.clone().ior(this)},o.prototype.uor=function(e){return this.length>e.length?this.clone().iuor(e):e.clone().iuor(this)},o.prototype.iuand=function(e){var t;t=this.length>e.length?e:this;for(var n=0;ne.length?this.clone().iand(e):e.clone().iand(this)},o.prototype.uand=function(e){return this.length>e.length?this.clone().iuand(e):e.clone().iuand(this)},o.prototype.iuxor=function(e){var t,n;this.length>e.length?(t=this,n=e):(t=e,n=this);for(var r=0;re.length?this.clone().ixor(e):e.clone().ixor(this)},o.prototype.uxor=function(e){return this.length>e.length?this.clone().iuxor(e):e.clone().iuxor(this)},o.prototype.inotn=function(e){r("number"==typeof e&&e>=0);var t=0|Math.ceil(e/26),n=e%26;this._expand(t),n>0&&t--;for(var i=0;i0&&(this.words[i]=~this.words[i]&67108863>>26-n),this.strip()},o.prototype.notn=function(e){return this.clone().inotn(e)},o.prototype.setn=function(e,t){r("number"==typeof e&&e>=0);var n=e/26|0,i=e%26;return this._expand(n+1),this.words[n]=t?this.words[n]|1<e.length?(n=this,r=e):(n=e,r=this);for(var i=0,o=0;o>>26;for(;0!==i&&o>>26;if(this.length=n.length,0!==i)this.words[this.length]=i,this.length++;else if(n!==this)for(;oe.length?this.clone().iadd(e):e.clone().iadd(this)},o.prototype.isub=function(e){if(0!==e.negative){e.negative=0;var t=this.iadd(e);return e.negative=1,t._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(e),this.negative=1,this._normSign();var n,r,i=this.cmp(e);if(0===i)return this.negative=0,this.length=1,this.words[0]=0,this;i>0?(n=this,r=e):(n=e,r=this);for(var o=0,s=0;s>26,this.words[s]=67108863&t;for(;0!==o&&s>26,this.words[s]=67108863&t;if(0===o&&s>>13,h=0|s[1],p=8191&h,v=h>>>13,g=0|s[2],m=8191&g,b=g>>>13,y=0|s[3],w=8191&y,_=y>>>13,S=0|s[4],E=8191&S,M=S>>>13,A=0|s[5],I=8191&A,k=A>>>13,O=0|s[6],x=8191&O,C=O>>>13,T=0|s[7],P=8191&T,N=T>>>13,R=0|s[8],L=8191&R,j=R>>>13,D=0|s[9],U=8191&D,B=D>>>13,F=0|a[0],z=8191&F,q=F>>>13,K=0|a[1],H=8191&K,V=K>>>13,G=0|a[2],W=8191&G,$=G>>>13,Y=0|a[3],J=8191&Y,Z=Y>>>13,X=0|a[4],Q=8191&X,ee=X>>>13,te=0|a[5],ne=8191&te,re=te>>>13,ie=0|a[6],oe=8191&ie,se=ie>>>13,ae=0|a[7],ue=8191&ae,ce=ae>>>13,fe=0|a[8],le=8191&fe,de=fe>>>13,he=0|a[9],pe=8191&he,ve=he>>>13;n.negative=e.negative^t.negative,n.length=19;var ge=(c+(r=Math.imul(l,z))|0)+((8191&(i=(i=Math.imul(l,q))+Math.imul(d,z)|0))<<13)|0;c=((o=Math.imul(d,q))+(i>>>13)|0)+(ge>>>26)|0,ge&=67108863,r=Math.imul(p,z),i=(i=Math.imul(p,q))+Math.imul(v,z)|0,o=Math.imul(v,q);var me=(c+(r=r+Math.imul(l,H)|0)|0)+((8191&(i=(i=i+Math.imul(l,V)|0)+Math.imul(d,H)|0))<<13)|0;c=((o=o+Math.imul(d,V)|0)+(i>>>13)|0)+(me>>>26)|0,me&=67108863,r=Math.imul(m,z),i=(i=Math.imul(m,q))+Math.imul(b,z)|0,o=Math.imul(b,q),r=r+Math.imul(p,H)|0,i=(i=i+Math.imul(p,V)|0)+Math.imul(v,H)|0,o=o+Math.imul(v,V)|0;var be=(c+(r=r+Math.imul(l,W)|0)|0)+((8191&(i=(i=i+Math.imul(l,$)|0)+Math.imul(d,W)|0))<<13)|0;c=((o=o+Math.imul(d,$)|0)+(i>>>13)|0)+(be>>>26)|0,be&=67108863,r=Math.imul(w,z),i=(i=Math.imul(w,q))+Math.imul(_,z)|0,o=Math.imul(_,q),r=r+Math.imul(m,H)|0,i=(i=i+Math.imul(m,V)|0)+Math.imul(b,H)|0,o=o+Math.imul(b,V)|0,r=r+Math.imul(p,W)|0,i=(i=i+Math.imul(p,$)|0)+Math.imul(v,W)|0,o=o+Math.imul(v,$)|0;var ye=(c+(r=r+Math.imul(l,J)|0)|0)+((8191&(i=(i=i+Math.imul(l,Z)|0)+Math.imul(d,J)|0))<<13)|0;c=((o=o+Math.imul(d,Z)|0)+(i>>>13)|0)+(ye>>>26)|0,ye&=67108863,r=Math.imul(E,z),i=(i=Math.imul(E,q))+Math.imul(M,z)|0,o=Math.imul(M,q),r=r+Math.imul(w,H)|0,i=(i=i+Math.imul(w,V)|0)+Math.imul(_,H)|0,o=o+Math.imul(_,V)|0,r=r+Math.imul(m,W)|0,i=(i=i+Math.imul(m,$)|0)+Math.imul(b,W)|0,o=o+Math.imul(b,$)|0,r=r+Math.imul(p,J)|0,i=(i=i+Math.imul(p,Z)|0)+Math.imul(v,J)|0,o=o+Math.imul(v,Z)|0;var we=(c+(r=r+Math.imul(l,Q)|0)|0)+((8191&(i=(i=i+Math.imul(l,ee)|0)+Math.imul(d,Q)|0))<<13)|0;c=((o=o+Math.imul(d,ee)|0)+(i>>>13)|0)+(we>>>26)|0,we&=67108863,r=Math.imul(I,z),i=(i=Math.imul(I,q))+Math.imul(k,z)|0,o=Math.imul(k,q),r=r+Math.imul(E,H)|0,i=(i=i+Math.imul(E,V)|0)+Math.imul(M,H)|0,o=o+Math.imul(M,V)|0,r=r+Math.imul(w,W)|0,i=(i=i+Math.imul(w,$)|0)+Math.imul(_,W)|0,o=o+Math.imul(_,$)|0,r=r+Math.imul(m,J)|0,i=(i=i+Math.imul(m,Z)|0)+Math.imul(b,J)|0,o=o+Math.imul(b,Z)|0,r=r+Math.imul(p,Q)|0,i=(i=i+Math.imul(p,ee)|0)+Math.imul(v,Q)|0,o=o+Math.imul(v,ee)|0;var _e=(c+(r=r+Math.imul(l,ne)|0)|0)+((8191&(i=(i=i+Math.imul(l,re)|0)+Math.imul(d,ne)|0))<<13)|0;c=((o=o+Math.imul(d,re)|0)+(i>>>13)|0)+(_e>>>26)|0,_e&=67108863,r=Math.imul(x,z),i=(i=Math.imul(x,q))+Math.imul(C,z)|0,o=Math.imul(C,q),r=r+Math.imul(I,H)|0,i=(i=i+Math.imul(I,V)|0)+Math.imul(k,H)|0,o=o+Math.imul(k,V)|0,r=r+Math.imul(E,W)|0,i=(i=i+Math.imul(E,$)|0)+Math.imul(M,W)|0,o=o+Math.imul(M,$)|0,r=r+Math.imul(w,J)|0,i=(i=i+Math.imul(w,Z)|0)+Math.imul(_,J)|0,o=o+Math.imul(_,Z)|0,r=r+Math.imul(m,Q)|0,i=(i=i+Math.imul(m,ee)|0)+Math.imul(b,Q)|0,o=o+Math.imul(b,ee)|0,r=r+Math.imul(p,ne)|0,i=(i=i+Math.imul(p,re)|0)+Math.imul(v,ne)|0,o=o+Math.imul(v,re)|0;var Se=(c+(r=r+Math.imul(l,oe)|0)|0)+((8191&(i=(i=i+Math.imul(l,se)|0)+Math.imul(d,oe)|0))<<13)|0;c=((o=o+Math.imul(d,se)|0)+(i>>>13)|0)+(Se>>>26)|0,Se&=67108863,r=Math.imul(P,z),i=(i=Math.imul(P,q))+Math.imul(N,z)|0,o=Math.imul(N,q),r=r+Math.imul(x,H)|0,i=(i=i+Math.imul(x,V)|0)+Math.imul(C,H)|0,o=o+Math.imul(C,V)|0,r=r+Math.imul(I,W)|0,i=(i=i+Math.imul(I,$)|0)+Math.imul(k,W)|0,o=o+Math.imul(k,$)|0,r=r+Math.imul(E,J)|0,i=(i=i+Math.imul(E,Z)|0)+Math.imul(M,J)|0,o=o+Math.imul(M,Z)|0,r=r+Math.imul(w,Q)|0,i=(i=i+Math.imul(w,ee)|0)+Math.imul(_,Q)|0,o=o+Math.imul(_,ee)|0,r=r+Math.imul(m,ne)|0,i=(i=i+Math.imul(m,re)|0)+Math.imul(b,ne)|0,o=o+Math.imul(b,re)|0,r=r+Math.imul(p,oe)|0,i=(i=i+Math.imul(p,se)|0)+Math.imul(v,oe)|0,o=o+Math.imul(v,se)|0;var Ee=(c+(r=r+Math.imul(l,ue)|0)|0)+((8191&(i=(i=i+Math.imul(l,ce)|0)+Math.imul(d,ue)|0))<<13)|0;c=((o=o+Math.imul(d,ce)|0)+(i>>>13)|0)+(Ee>>>26)|0,Ee&=67108863,r=Math.imul(L,z),i=(i=Math.imul(L,q))+Math.imul(j,z)|0,o=Math.imul(j,q),r=r+Math.imul(P,H)|0,i=(i=i+Math.imul(P,V)|0)+Math.imul(N,H)|0,o=o+Math.imul(N,V)|0,r=r+Math.imul(x,W)|0,i=(i=i+Math.imul(x,$)|0)+Math.imul(C,W)|0,o=o+Math.imul(C,$)|0,r=r+Math.imul(I,J)|0,i=(i=i+Math.imul(I,Z)|0)+Math.imul(k,J)|0,o=o+Math.imul(k,Z)|0,r=r+Math.imul(E,Q)|0,i=(i=i+Math.imul(E,ee)|0)+Math.imul(M,Q)|0,o=o+Math.imul(M,ee)|0,r=r+Math.imul(w,ne)|0,i=(i=i+Math.imul(w,re)|0)+Math.imul(_,ne)|0,o=o+Math.imul(_,re)|0,r=r+Math.imul(m,oe)|0,i=(i=i+Math.imul(m,se)|0)+Math.imul(b,oe)|0,o=o+Math.imul(b,se)|0,r=r+Math.imul(p,ue)|0,i=(i=i+Math.imul(p,ce)|0)+Math.imul(v,ue)|0,o=o+Math.imul(v,ce)|0;var Me=(c+(r=r+Math.imul(l,le)|0)|0)+((8191&(i=(i=i+Math.imul(l,de)|0)+Math.imul(d,le)|0))<<13)|0;c=((o=o+Math.imul(d,de)|0)+(i>>>13)|0)+(Me>>>26)|0,Me&=67108863,r=Math.imul(U,z),i=(i=Math.imul(U,q))+Math.imul(B,z)|0,o=Math.imul(B,q),r=r+Math.imul(L,H)|0,i=(i=i+Math.imul(L,V)|0)+Math.imul(j,H)|0,o=o+Math.imul(j,V)|0,r=r+Math.imul(P,W)|0,i=(i=i+Math.imul(P,$)|0)+Math.imul(N,W)|0,o=o+Math.imul(N,$)|0,r=r+Math.imul(x,J)|0,i=(i=i+Math.imul(x,Z)|0)+Math.imul(C,J)|0,o=o+Math.imul(C,Z)|0,r=r+Math.imul(I,Q)|0,i=(i=i+Math.imul(I,ee)|0)+Math.imul(k,Q)|0,o=o+Math.imul(k,ee)|0,r=r+Math.imul(E,ne)|0,i=(i=i+Math.imul(E,re)|0)+Math.imul(M,ne)|0,o=o+Math.imul(M,re)|0,r=r+Math.imul(w,oe)|0,i=(i=i+Math.imul(w,se)|0)+Math.imul(_,oe)|0,o=o+Math.imul(_,se)|0,r=r+Math.imul(m,ue)|0,i=(i=i+Math.imul(m,ce)|0)+Math.imul(b,ue)|0,o=o+Math.imul(b,ce)|0,r=r+Math.imul(p,le)|0,i=(i=i+Math.imul(p,de)|0)+Math.imul(v,le)|0,o=o+Math.imul(v,de)|0;var Ae=(c+(r=r+Math.imul(l,pe)|0)|0)+((8191&(i=(i=i+Math.imul(l,ve)|0)+Math.imul(d,pe)|0))<<13)|0;c=((o=o+Math.imul(d,ve)|0)+(i>>>13)|0)+(Ae>>>26)|0,Ae&=67108863,r=Math.imul(U,H),i=(i=Math.imul(U,V))+Math.imul(B,H)|0,o=Math.imul(B,V),r=r+Math.imul(L,W)|0,i=(i=i+Math.imul(L,$)|0)+Math.imul(j,W)|0,o=o+Math.imul(j,$)|0,r=r+Math.imul(P,J)|0,i=(i=i+Math.imul(P,Z)|0)+Math.imul(N,J)|0,o=o+Math.imul(N,Z)|0,r=r+Math.imul(x,Q)|0,i=(i=i+Math.imul(x,ee)|0)+Math.imul(C,Q)|0,o=o+Math.imul(C,ee)|0,r=r+Math.imul(I,ne)|0,i=(i=i+Math.imul(I,re)|0)+Math.imul(k,ne)|0,o=o+Math.imul(k,re)|0,r=r+Math.imul(E,oe)|0,i=(i=i+Math.imul(E,se)|0)+Math.imul(M,oe)|0,o=o+Math.imul(M,se)|0,r=r+Math.imul(w,ue)|0,i=(i=i+Math.imul(w,ce)|0)+Math.imul(_,ue)|0,o=o+Math.imul(_,ce)|0,r=r+Math.imul(m,le)|0,i=(i=i+Math.imul(m,de)|0)+Math.imul(b,le)|0,o=o+Math.imul(b,de)|0;var Ie=(c+(r=r+Math.imul(p,pe)|0)|0)+((8191&(i=(i=i+Math.imul(p,ve)|0)+Math.imul(v,pe)|0))<<13)|0;c=((o=o+Math.imul(v,ve)|0)+(i>>>13)|0)+(Ie>>>26)|0,Ie&=67108863,r=Math.imul(U,W),i=(i=Math.imul(U,$))+Math.imul(B,W)|0,o=Math.imul(B,$),r=r+Math.imul(L,J)|0,i=(i=i+Math.imul(L,Z)|0)+Math.imul(j,J)|0,o=o+Math.imul(j,Z)|0,r=r+Math.imul(P,Q)|0,i=(i=i+Math.imul(P,ee)|0)+Math.imul(N,Q)|0,o=o+Math.imul(N,ee)|0,r=r+Math.imul(x,ne)|0,i=(i=i+Math.imul(x,re)|0)+Math.imul(C,ne)|0,o=o+Math.imul(C,re)|0,r=r+Math.imul(I,oe)|0,i=(i=i+Math.imul(I,se)|0)+Math.imul(k,oe)|0,o=o+Math.imul(k,se)|0,r=r+Math.imul(E,ue)|0,i=(i=i+Math.imul(E,ce)|0)+Math.imul(M,ue)|0,o=o+Math.imul(M,ce)|0,r=r+Math.imul(w,le)|0,i=(i=i+Math.imul(w,de)|0)+Math.imul(_,le)|0,o=o+Math.imul(_,de)|0;var ke=(c+(r=r+Math.imul(m,pe)|0)|0)+((8191&(i=(i=i+Math.imul(m,ve)|0)+Math.imul(b,pe)|0))<<13)|0;c=((o=o+Math.imul(b,ve)|0)+(i>>>13)|0)+(ke>>>26)|0,ke&=67108863,r=Math.imul(U,J),i=(i=Math.imul(U,Z))+Math.imul(B,J)|0,o=Math.imul(B,Z),r=r+Math.imul(L,Q)|0,i=(i=i+Math.imul(L,ee)|0)+Math.imul(j,Q)|0,o=o+Math.imul(j,ee)|0,r=r+Math.imul(P,ne)|0,i=(i=i+Math.imul(P,re)|0)+Math.imul(N,ne)|0,o=o+Math.imul(N,re)|0,r=r+Math.imul(x,oe)|0,i=(i=i+Math.imul(x,se)|0)+Math.imul(C,oe)|0,o=o+Math.imul(C,se)|0,r=r+Math.imul(I,ue)|0,i=(i=i+Math.imul(I,ce)|0)+Math.imul(k,ue)|0,o=o+Math.imul(k,ce)|0,r=r+Math.imul(E,le)|0,i=(i=i+Math.imul(E,de)|0)+Math.imul(M,le)|0,o=o+Math.imul(M,de)|0;var Oe=(c+(r=r+Math.imul(w,pe)|0)|0)+((8191&(i=(i=i+Math.imul(w,ve)|0)+Math.imul(_,pe)|0))<<13)|0;c=((o=o+Math.imul(_,ve)|0)+(i>>>13)|0)+(Oe>>>26)|0,Oe&=67108863,r=Math.imul(U,Q),i=(i=Math.imul(U,ee))+Math.imul(B,Q)|0,o=Math.imul(B,ee),r=r+Math.imul(L,ne)|0,i=(i=i+Math.imul(L,re)|0)+Math.imul(j,ne)|0,o=o+Math.imul(j,re)|0,r=r+Math.imul(P,oe)|0,i=(i=i+Math.imul(P,se)|0)+Math.imul(N,oe)|0,o=o+Math.imul(N,se)|0,r=r+Math.imul(x,ue)|0,i=(i=i+Math.imul(x,ce)|0)+Math.imul(C,ue)|0,o=o+Math.imul(C,ce)|0,r=r+Math.imul(I,le)|0,i=(i=i+Math.imul(I,de)|0)+Math.imul(k,le)|0,o=o+Math.imul(k,de)|0;var xe=(c+(r=r+Math.imul(E,pe)|0)|0)+((8191&(i=(i=i+Math.imul(E,ve)|0)+Math.imul(M,pe)|0))<<13)|0;c=((o=o+Math.imul(M,ve)|0)+(i>>>13)|0)+(xe>>>26)|0,xe&=67108863,r=Math.imul(U,ne),i=(i=Math.imul(U,re))+Math.imul(B,ne)|0,o=Math.imul(B,re),r=r+Math.imul(L,oe)|0,i=(i=i+Math.imul(L,se)|0)+Math.imul(j,oe)|0,o=o+Math.imul(j,se)|0,r=r+Math.imul(P,ue)|0,i=(i=i+Math.imul(P,ce)|0)+Math.imul(N,ue)|0,o=o+Math.imul(N,ce)|0,r=r+Math.imul(x,le)|0,i=(i=i+Math.imul(x,de)|0)+Math.imul(C,le)|0,o=o+Math.imul(C,de)|0;var Ce=(c+(r=r+Math.imul(I,pe)|0)|0)+((8191&(i=(i=i+Math.imul(I,ve)|0)+Math.imul(k,pe)|0))<<13)|0;c=((o=o+Math.imul(k,ve)|0)+(i>>>13)|0)+(Ce>>>26)|0,Ce&=67108863,r=Math.imul(U,oe),i=(i=Math.imul(U,se))+Math.imul(B,oe)|0,o=Math.imul(B,se),r=r+Math.imul(L,ue)|0,i=(i=i+Math.imul(L,ce)|0)+Math.imul(j,ue)|0,o=o+Math.imul(j,ce)|0,r=r+Math.imul(P,le)|0,i=(i=i+Math.imul(P,de)|0)+Math.imul(N,le)|0,o=o+Math.imul(N,de)|0;var Te=(c+(r=r+Math.imul(x,pe)|0)|0)+((8191&(i=(i=i+Math.imul(x,ve)|0)+Math.imul(C,pe)|0))<<13)|0;c=((o=o+Math.imul(C,ve)|0)+(i>>>13)|0)+(Te>>>26)|0,Te&=67108863,r=Math.imul(U,ue),i=(i=Math.imul(U,ce))+Math.imul(B,ue)|0,o=Math.imul(B,ce),r=r+Math.imul(L,le)|0,i=(i=i+Math.imul(L,de)|0)+Math.imul(j,le)|0,o=o+Math.imul(j,de)|0;var Pe=(c+(r=r+Math.imul(P,pe)|0)|0)+((8191&(i=(i=i+Math.imul(P,ve)|0)+Math.imul(N,pe)|0))<<13)|0;c=((o=o+Math.imul(N,ve)|0)+(i>>>13)|0)+(Pe>>>26)|0,Pe&=67108863,r=Math.imul(U,le),i=(i=Math.imul(U,de))+Math.imul(B,le)|0,o=Math.imul(B,de);var Ne=(c+(r=r+Math.imul(L,pe)|0)|0)+((8191&(i=(i=i+Math.imul(L,ve)|0)+Math.imul(j,pe)|0))<<13)|0;c=((o=o+Math.imul(j,ve)|0)+(i>>>13)|0)+(Ne>>>26)|0,Ne&=67108863;var Re=(c+(r=Math.imul(U,pe))|0)+((8191&(i=(i=Math.imul(U,ve))+Math.imul(B,pe)|0))<<13)|0;return c=((o=Math.imul(B,ve))+(i>>>13)|0)+(Re>>>26)|0,Re&=67108863,u[0]=ge,u[1]=me,u[2]=be,u[3]=ye,u[4]=we,u[5]=_e,u[6]=Se,u[7]=Ee,u[8]=Me,u[9]=Ae,u[10]=Ie,u[11]=ke,u[12]=Oe,u[13]=xe,u[14]=Ce,u[15]=Te,u[16]=Pe,u[17]=Ne,u[18]=Re,0!==c&&(u[19]=c,n.length++),n};function p(e,t,n){return(new v).mulp(e,t,n)}function v(e,t){this.x=e,this.y=t}Math.imul||(h=d),o.prototype.mulTo=function(e,t){var n=this.length+e.length;return 10===this.length&&10===e.length?h(this,e,t):n<63?d(this,e,t):n<1024?function(e,t,n){n.negative=t.negative^e.negative,n.length=e.length+t.length;for(var r=0,i=0,o=0;o>>26)|0)>>>26,s&=67108863}n.words[o]=a,r=s,s=i}return 0!==r?n.words[o]=r:n.length--,n.strip()}(this,e,t):p(this,e,t)},v.prototype.makeRBT=function(e){for(var t=new Array(e),n=o.prototype._countBits(e)-1,r=0;r>=1;return r},v.prototype.permute=function(e,t,n,r,i,o){for(var s=0;s>>=1)i++;return 1<>>=13,n[2*s+1]=8191&o,o>>>=13;for(s=2*t;s>=26,t+=i/67108864|0,t+=o>>>26,this.words[n]=67108863&o}return 0!==t&&(this.words[n]=t,this.length++),this},o.prototype.muln=function(e){return this.clone().imuln(e)},o.prototype.sqr=function(){return this.mul(this)},o.prototype.isqr=function(){return this.imul(this.clone())},o.prototype.pow=function(e){var t=function(e){for(var t=new Array(e.bitLength()),n=0;n>>i}return t}(e);if(0===t.length)return new o(1);for(var n=this,r=0;r=0);var t,n=e%26,i=(e-n)/26,o=67108863>>>26-n<<26-n;if(0!==n){var s=0;for(t=0;t>>26-n}s&&(this.words[t]=s,this.length++)}if(0!==i){for(t=this.length-1;t>=0;t--)this.words[t+i]=this.words[t];for(t=0;t=0),i=t?(t-t%26)/26:0;var o=e%26,s=Math.min((e-o)/26,this.length),a=67108863^67108863>>>o<s)for(this.length-=s,c=0;c=0&&(0!==f||c>=i);c--){var l=0|this.words[c];this.words[c]=f<<26-o|l>>>o,f=l&a}return u&&0!==f&&(u.words[u.length++]=f),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},o.prototype.ishrn=function(e,t,n){return r(0===this.negative),this.iushrn(e,t,n)},o.prototype.shln=function(e){return this.clone().ishln(e)},o.prototype.ushln=function(e){return this.clone().iushln(e)},o.prototype.shrn=function(e){return this.clone().ishrn(e)},o.prototype.ushrn=function(e){return this.clone().iushrn(e)},o.prototype.testn=function(e){r("number"==typeof e&&e>=0);var t=e%26,n=(e-t)/26,i=1<=0);var t=e%26,n=(e-t)/26;if(r(0===this.negative,"imaskn works only with positive numbers"),this.length<=n)return this;if(0!==t&&n++,this.length=Math.min(n,this.length),0!==t){var i=67108863^67108863>>>t<=67108864;t++)this.words[t]-=67108864,t===this.length-1?this.words[t+1]=1:this.words[t+1]++;return this.length=Math.max(this.length,t+1),this},o.prototype.isubn=function(e){if(r("number"==typeof e),r(e<67108864),e<0)return this.iaddn(-e);if(0!==this.negative)return this.negative=0,this.iaddn(e),this.negative=1,this;if(this.words[0]-=e,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var t=0;t>26)-(u/67108864|0),this.words[i+n]=67108863&o}for(;i>26,this.words[i+n]=67108863&o;if(0===a)return this.strip();for(r(-1===a),a=0,i=0;i>26,this.words[i]=67108863&o;return this.negative=1,this.strip()},o.prototype._wordDiv=function(e,t){var n=(this.length,e.length),r=this.clone(),i=e,s=0|i.words[i.length-1];0!==(n=26-this._countBits(s))&&(i=i.ushln(n),r.iushln(n),s=0|i.words[i.length-1]);var a,u=r.length-i.length;if("mod"!==t){(a=new o(null)).length=u+1,a.words=new Array(a.length);for(var c=0;c=0;l--){var d=67108864*(0|r.words[i.length+l])+(0|r.words[i.length+l-1]);for(d=Math.min(d/s|0,67108863),r._ishlnsubmul(i,d,l);0!==r.negative;)d--,r.negative=0,r._ishlnsubmul(i,1,l),r.isZero()||(r.negative^=1);a&&(a.words[l]=d)}return a&&a.strip(),r.strip(),"div"!==t&&0!==n&&r.iushrn(n),{div:a||null,mod:r}},o.prototype.divmod=function(e,t,n){return r(!e.isZero()),this.isZero()?{div:new o(0),mod:new o(0)}:0!==this.negative&&0===e.negative?(a=this.neg().divmod(e,t),"mod"!==t&&(i=a.div.neg()),"div"!==t&&(s=a.mod.neg(),n&&0!==s.negative&&s.iadd(e)),{div:i,mod:s}):0===this.negative&&0!==e.negative?(a=this.divmod(e.neg(),t),"mod"!==t&&(i=a.div.neg()),{div:i,mod:a.mod}):0!=(this.negative&e.negative)?(a=this.neg().divmod(e.neg(),t),"div"!==t&&(s=a.mod.neg(),n&&0!==s.negative&&s.isub(e)),{div:a.div,mod:s}):e.length>this.length||this.cmp(e)<0?{div:new o(0),mod:this}:1===e.length?"div"===t?{div:this.divn(e.words[0]),mod:null}:"mod"===t?{div:null,mod:new o(this.modn(e.words[0]))}:{div:this.divn(e.words[0]),mod:new o(this.modn(e.words[0]))}:this._wordDiv(e,t);var i,s,a},o.prototype.div=function(e){return this.divmod(e,"div",!1).div},o.prototype.mod=function(e){return this.divmod(e,"mod",!1).mod},o.prototype.umod=function(e){return this.divmod(e,"mod",!0).mod},o.prototype.divRound=function(e){var t=this.divmod(e);if(t.mod.isZero())return t.div;var n=0!==t.div.negative?t.mod.isub(e):t.mod,r=e.ushrn(1),i=e.andln(1),o=n.cmp(r);return o<0||1===i&&0===o?t.div:0!==t.div.negative?t.div.isubn(1):t.div.iaddn(1)},o.prototype.modn=function(e){r(e<=67108863);for(var t=(1<<26)%e,n=0,i=this.length-1;i>=0;i--)n=(t*n+(0|this.words[i]))%e;return n},o.prototype.idivn=function(e){r(e<=67108863);for(var t=0,n=this.length-1;n>=0;n--){var i=(0|this.words[n])+67108864*t;this.words[n]=i/e|0,t=i%e}return this.strip()},o.prototype.divn=function(e){return this.clone().idivn(e)},o.prototype.egcd=function(e){r(0===e.negative),r(!e.isZero());var t=this,n=e.clone();t=0!==t.negative?t.umod(e):t.clone();for(var i=new o(1),s=new o(0),a=new o(0),u=new o(1),c=0;t.isEven()&&n.isEven();)t.iushrn(1),n.iushrn(1),++c;for(var f=n.clone(),l=t.clone();!t.isZero();){for(var d=0,h=1;0==(t.words[0]&h)&&d<26;++d,h<<=1);if(d>0)for(t.iushrn(d);d-- >0;)(i.isOdd()||s.isOdd())&&(i.iadd(f),s.isub(l)),i.iushrn(1),s.iushrn(1);for(var p=0,v=1;0==(n.words[0]&v)&&p<26;++p,v<<=1);if(p>0)for(n.iushrn(p);p-- >0;)(a.isOdd()||u.isOdd())&&(a.iadd(f),u.isub(l)),a.iushrn(1),u.iushrn(1);t.cmp(n)>=0?(t.isub(n),i.isub(a),s.isub(u)):(n.isub(t),a.isub(i),u.isub(s))}return{a:a,b:u,gcd:n.iushln(c)}},o.prototype._invmp=function(e){r(0===e.negative),r(!e.isZero());var t=this,n=e.clone();t=0!==t.negative?t.umod(e):t.clone();for(var i,s=new o(1),a=new o(0),u=n.clone();t.cmpn(1)>0&&n.cmpn(1)>0;){for(var c=0,f=1;0==(t.words[0]&f)&&c<26;++c,f<<=1);if(c>0)for(t.iushrn(c);c-- >0;)s.isOdd()&&s.iadd(u),s.iushrn(1);for(var l=0,d=1;0==(n.words[0]&d)&&l<26;++l,d<<=1);if(l>0)for(n.iushrn(l);l-- >0;)a.isOdd()&&a.iadd(u),a.iushrn(1);t.cmp(n)>=0?(t.isub(n),s.isub(a)):(n.isub(t),a.isub(s))}return(i=0===t.cmpn(1)?s:a).cmpn(0)<0&&i.iadd(e),i},o.prototype.gcd=function(e){if(this.isZero())return e.abs();if(e.isZero())return this.abs();var t=this.clone(),n=e.clone();t.negative=0,n.negative=0;for(var r=0;t.isEven()&&n.isEven();r++)t.iushrn(1),n.iushrn(1);for(;;){for(;t.isEven();)t.iushrn(1);for(;n.isEven();)n.iushrn(1);var i=t.cmp(n);if(i<0){var o=t;t=n,n=o}else if(0===i||0===n.cmpn(1))break;t.isub(n)}return n.iushln(r)},o.prototype.invm=function(e){return this.egcd(e).a.umod(e)},o.prototype.isEven=function(){return 0==(1&this.words[0])},o.prototype.isOdd=function(){return 1==(1&this.words[0])},o.prototype.andln=function(e){return this.words[0]&e},o.prototype.bincn=function(e){r("number"==typeof e);var t=e%26,n=(e-t)/26,i=1<>>26,a&=67108863,this.words[s]=a}return 0!==o&&(this.words[s]=o,this.length++),this},o.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},o.prototype.cmpn=function(e){var t,n=e<0;if(0!==this.negative&&!n)return-1;if(0===this.negative&&n)return 1;if(this.strip(),this.length>1)t=1;else{n&&(e=-e),r(e<=67108863,"Number is too big");var i=0|this.words[0];t=i===e?0:ie.length)return 1;if(this.length=0;n--){var r=0|this.words[n],i=0|e.words[n];if(r!==i){ri&&(t=1);break}}return t},o.prototype.gtn=function(e){return 1===this.cmpn(e)},o.prototype.gt=function(e){return 1===this.cmp(e)},o.prototype.gten=function(e){return this.cmpn(e)>=0},o.prototype.gte=function(e){return this.cmp(e)>=0},o.prototype.ltn=function(e){return-1===this.cmpn(e)},o.prototype.lt=function(e){return-1===this.cmp(e)},o.prototype.lten=function(e){return this.cmpn(e)<=0},o.prototype.lte=function(e){return this.cmp(e)<=0},o.prototype.eqn=function(e){return 0===this.cmpn(e)},o.prototype.eq=function(e){return 0===this.cmp(e)},o.red=function(e){return new S(e)},o.prototype.toRed=function(e){return r(!this.red,"Already a number in reduction context"),r(0===this.negative,"red works only with positives"),e.convertTo(this)._forceRed(e)},o.prototype.fromRed=function(){return r(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},o.prototype._forceRed=function(e){return this.red=e,this},o.prototype.forceRed=function(e){return r(!this.red,"Already a number in reduction context"),this._forceRed(e)},o.prototype.redAdd=function(e){return r(this.red,"redAdd works only with red numbers"),this.red.add(this,e)},o.prototype.redIAdd=function(e){return r(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,e)},o.prototype.redSub=function(e){return r(this.red,"redSub works only with red numbers"),this.red.sub(this,e)},o.prototype.redISub=function(e){return r(this.red,"redISub works only with red numbers"),this.red.isub(this,e)},o.prototype.redShl=function(e){return r(this.red,"redShl works only with red numbers"),this.red.shl(this,e)},o.prototype.redMul=function(e){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,e),this.red.mul(this,e)},o.prototype.redIMul=function(e){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,e),this.red.imul(this,e)},o.prototype.redSqr=function(){return r(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},o.prototype.redISqr=function(){return r(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},o.prototype.redSqrt=function(){return r(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},o.prototype.redInvm=function(){return r(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},o.prototype.redNeg=function(){return r(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},o.prototype.redPow=function(e){return r(this.red&&!e.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,e)};var g={k256:null,p224:null,p192:null,p25519:null};function m(e,t){this.name=e,this.p=new o(t,16),this.n=this.p.bitLength(),this.k=new o(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function b(){m.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function y(){m.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function w(){m.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function _(){m.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function S(e){if("string"==typeof e){var t=o._prime(e);this.m=t.p,this.prime=t}else r(e.gtn(1),"modulus must be greater than 1"),this.m=e,this.prime=null}function E(e){S.call(this,e),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new o(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}m.prototype._tmp=function(){var e=new o(null);return e.words=new Array(Math.ceil(this.n/13)),e},m.prototype.ireduce=function(e){var t,n=e;do{this.split(n,this.tmp),t=(n=(n=this.imulK(n)).iadd(this.tmp)).bitLength()}while(t>this.n);var r=t0?n.isub(this.p):void 0!==n.strip?n.strip():n._strip(),n},m.prototype.split=function(e,t){e.iushrn(this.n,0,t)},m.prototype.imulK=function(e){return e.imul(this.k)},i(b,m),b.prototype.split=function(e,t){for(var n=Math.min(e.length,9),r=0;r>>22,i=o}i>>>=22,e.words[r-10]=i,0===i&&e.length>10?e.length-=10:e.length-=9},b.prototype.imulK=function(e){e.words[e.length]=0,e.words[e.length+1]=0,e.length+=2;for(var t=0,n=0;n>>=26,e.words[n]=i,t=r}return 0!==t&&(e.words[e.length++]=t),e},o._prime=function(e){if(g[e])return g[e];var t;if("k256"===e)t=new b;else if("p224"===e)t=new y;else if("p192"===e)t=new w;else{if("p25519"!==e)throw new Error("Unknown prime "+e);t=new _}return g[e]=t,t},S.prototype._verify1=function(e){r(0===e.negative,"red works only with positives"),r(e.red,"red works only with red numbers")},S.prototype._verify2=function(e,t){r(0==(e.negative|t.negative),"red works only with positives"),r(e.red&&e.red===t.red,"red works only with red numbers")},S.prototype.imod=function(e){return this.prime?this.prime.ireduce(e)._forceRed(this):e.umod(this.m)._forceRed(this)},S.prototype.neg=function(e){return e.isZero()?e.clone():this.m.sub(e)._forceRed(this)},S.prototype.add=function(e,t){this._verify2(e,t);var n=e.add(t);return n.cmp(this.m)>=0&&n.isub(this.m),n._forceRed(this)},S.prototype.iadd=function(e,t){this._verify2(e,t);var n=e.iadd(t);return n.cmp(this.m)>=0&&n.isub(this.m),n},S.prototype.sub=function(e,t){this._verify2(e,t);var n=e.sub(t);return n.cmpn(0)<0&&n.iadd(this.m),n._forceRed(this)},S.prototype.isub=function(e,t){this._verify2(e,t);var n=e.isub(t);return n.cmpn(0)<0&&n.iadd(this.m),n},S.prototype.shl=function(e,t){return this._verify1(e),this.imod(e.ushln(t))},S.prototype.imul=function(e,t){return this._verify2(e,t),this.imod(e.imul(t))},S.prototype.mul=function(e,t){return this._verify2(e,t),this.imod(e.mul(t))},S.prototype.isqr=function(e){return this.imul(e,e.clone())},S.prototype.sqr=function(e){return this.mul(e,e)},S.prototype.sqrt=function(e){if(e.isZero())return e.clone();var t=this.m.andln(3);if(r(t%2==1),3===t){var n=this.m.add(new o(1)).iushrn(2);return this.pow(e,n)}for(var i=this.m.subn(1),s=0;!i.isZero()&&0===i.andln(1);)s++,i.iushrn(1);r(!i.isZero());var a=new o(1).toRed(this),u=a.redNeg(),c=this.m.subn(1).iushrn(1),f=this.m.bitLength();for(f=new o(2*f*f).toRed(this);0!==this.pow(f,c).cmp(u);)f.redIAdd(u);for(var l=this.pow(f,i),d=this.pow(e,i.addn(1).iushrn(1)),h=this.pow(e,i),p=s;0!==h.cmp(a);){for(var v=h,g=0;0!==v.cmp(a);g++)v=v.redSqr();r(g=0;r--){for(var c=t.words[r],f=u-1;f>=0;f--){var l=c>>f&1;i!==n[0]&&(i=this.sqr(i)),0!==l||0!==s?(s<<=1,s|=l,(4===++a||0===r&&0===f)&&(i=this.mul(i,n[s]),a=0,s=0)):a=0}u=26}return i},S.prototype.convertTo=function(e){var t=e.umod(this.m);return t===e?t.clone():t},S.prototype.convertFrom=function(e){var t=e.clone();return t.red=null,t},o.mont=function(e){return new E(e)},i(E,S),E.prototype.convertTo=function(e){return this.imod(e.ushln(this.shift))},E.prototype.convertFrom=function(e){var t=this.imod(e.mul(this.rinv));return t.red=null,t},E.prototype.imul=function(e,t){if(e.isZero()||t.isZero())return e.words[0]=0,e.length=1,e;var n=e.imul(t),r=n.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=n.isub(r).iushrn(this.shift),o=i;return i.cmp(this.m)>=0?o=i.isub(this.m):i.cmpn(0)<0&&(o=i.iadd(this.m)),o._forceRed(this)},E.prototype.mul=function(e,t){if(e.isZero()||t.isZero())return new o(0)._forceRed(this);var n=e.mul(t),r=n.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=n.isub(r).iushrn(this.shift),s=i;return i.cmp(this.m)>=0?s=i.isub(this.m):i.cmpn(0)<0&&(s=i.iadd(this.m)),s._forceRed(this)},E.prototype.invm=function(e){return this.imod(e._invmp(this.m).mul(this.r2))._forceRed(this)}}(e,this)}).call(this,n(57)(e))},function(e,t,n){"use strict";n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return C})),n.d(t,"c",(function(){return P})),n.d(t,"d",(function(){return N})),n.d(t,"e",(function(){return V})),n.d(t,"f",(function(){return F})),n.d(t,"g",(function(){return te})),n.d(t,"h",(function(){return j})),n.d(t,"i",(function(){return re})); -/*! - * Copyright 2016 Amazon.com, - * Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Amazon Software License (the "License"). - * You may not use this file except in compliance with the - * License. A copy of the License is located at - * - * http://aws.amazon.com/asl/ - * - * or in the "license" file accompanying this file. This file is - * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - * CONDITIONS OF ANY KIND, express or implied. See the License - * for the specific language governing permissions and - * limitations under the License. - */ -var r=function(){function e(e){var t=e||{},n=t.ValidationData,r=t.Username,i=t.Password,o=t.AuthParameters,s=t.ClientMetadata;this.validationData=n||{},this.authParameters=o||{},this.clientMetadata=s||{},this.username=r,this.password=i}var t=e.prototype;return t.getUsername=function(){return this.username},t.getPassword=function(){return this.password},t.getValidationData=function(){return this.validationData},t.getAuthParameters=function(){return this.authParameters},t.getClientMetadata=function(){return this.clientMetadata},e}(),i=n(6),o=n(32),s=n.n(o),a=(n(161),n(87)),u=n.n(a),c=n(75),f=n.n(c),l=n(250);var d,h=function(){function e(e,t){e=this.words=e||[],this.sigBytes=null!=t?t:4*e.length}var t=e.prototype;return t.random=function(t){for(var n=[],r=0;r>>2]>>>24-i%4*8&255;r.push((o>>>4).toString(16)),r.push((15&o).toString(16))}return r.join("")}(this)},e}(),p=v;function v(e,t){null!=e&&this.fromString(e,t)}function g(){return new v(null)}var m="undefined"!=typeof navigator;m&&"Microsoft Internet Explorer"==navigator.appName?(v.prototype.am=function(e,t,n,r,i,o){for(var s=32767&t,a=t>>15;--o>=0;){var u=32767&this[e],c=this[e++]>>15,f=a*u+c*s;i=((u=s*u+((32767&f)<<15)+n[r]+(1073741823&i))>>>30)+(f>>>15)+a*c+(i>>>30),n[r++]=1073741823&u}return i},d=30):m&&"Netscape"!=navigator.appName?(v.prototype.am=function(e,t,n,r,i,o){for(;--o>=0;){var s=t*this[e++]+n[r]+i;i=Math.floor(s/67108864),n[r++]=67108863&s}return i},d=26):(v.prototype.am=function(e,t,n,r,i,o){for(var s=16383&t,a=t>>14;--o>=0;){var u=16383&this[e],c=this[e++]>>14,f=a*u+c*s;i=((u=s*u+((16383&f)<<14)+n[r]+i)>>28)+(f>>14)+a*c,n[r++]=268435455&u}return i},d=28),v.prototype.DB=d,v.prototype.DM=(1<>>16)&&(e=t,n+=16),0!=(t=e>>8)&&(e=t,n+=8),0!=(t=e>>4)&&(e=t,n+=4),0!=(t=e>>2)&&(e=t,n+=2),0!=(t=e>>1)&&(e=t,n+=1),n}function A(e){this.m=e,this.mp=e.invDigit(),this.mpl=32767&this.mp,this.mph=this.mp>>15,this.um=(1<0&&this.m.subTo(t,t),t},A.prototype.revert=function(e){var t=g();return e.copyTo(t),this.reduce(t),t},A.prototype.reduce=function(e){for(;e.t<=this.mt2;)e[e.t++]=0;for(var t=0;t>15)*this.mpl&this.um)<<15)&e.DM;for(e[n=t+this.m.t]+=this.m.am(0,r,e,t,0,this.m.t);e[n]>=e.DV;)e[n]-=e.DV,e[++n]++}e.clamp(),e.drShiftTo(this.m.t,e),e.compareTo(this.m)>=0&&e.subTo(this.m,e)},A.prototype.mulTo=function(e,t,n){e.multiplyTo(t,n),this.reduce(n)},A.prototype.sqrTo=function(e,t){e.squareTo(t),this.reduce(t)},v.prototype.copyTo=function(e){for(var t=this.t-1;t>=0;--t)e[t]=this[t];e.t=this.t,e.s=this.s},v.prototype.fromInt=function(e){this.t=1,this.s=e<0?-1:0,e>0?this[0]=e:e<-1?this[0]=e+this.DV:this.t=0},v.prototype.fromString=function(e,t){var n;if(16==t)n=4;else if(8==t)n=3;else if(2==t)n=1;else if(32==t)n=5;else{if(4!=t)throw new Error("Only radix 2, 4, 8, 16, 32 are supported");n=2}this.t=0,this.s=0;for(var r=e.length,i=!1,o=0;--r>=0;){var s=S(e,r);s<0?"-"==e.charAt(r)&&(i=!0):(i=!1,0==o?this[this.t++]=s:o+n>this.DB?(this[this.t-1]|=(s&(1<>this.DB-o):this[this.t-1]|=s<=this.DB&&(o-=this.DB))}this.clamp(),i&&v.ZERO.subTo(this,this)},v.prototype.clamp=function(){for(var e=this.s&this.DM;this.t>0&&this[this.t-1]==e;)--this.t},v.prototype.dlShiftTo=function(e,t){var n;for(n=this.t-1;n>=0;--n)t[n+e]=this[n];for(n=e-1;n>=0;--n)t[n]=0;t.t=this.t+e,t.s=this.s},v.prototype.drShiftTo=function(e,t){for(var n=e;n=0;--n)t[n+s+1]=this[n]>>i|a,a=(this[n]&o)<=0;--n)t[n]=0;t[s]=a,t.t=this.t+s+1,t.s=this.s,t.clamp()},v.prototype.rShiftTo=function(e,t){t.s=this.s;var n=Math.floor(e/this.DB);if(n>=this.t)t.t=0;else{var r=e%this.DB,i=this.DB-r,o=(1<>r;for(var s=n+1;s>r;r>0&&(t[this.t-n-1]|=(this.s&o)<>=this.DB;if(e.t>=this.DB;r+=this.s}else{for(r+=this.s;n>=this.DB;r-=e.s}t.s=r<0?-1:0,r<-1?t[n++]=this.DV+r:r>0&&(t[n++]=r),t.t=n,t.clamp()},v.prototype.multiplyTo=function(e,t){var n=this.abs(),r=e.abs(),i=n.t;for(t.t=i+r.t;--i>=0;)t[i]=0;for(i=0;i=0;)e[n]=0;for(n=0;n=t.DV&&(e[n+t.t]-=t.DV,e[n+t.t+1]=1)}e.t>0&&(e[e.t-1]+=t.am(n,t[n],e,2*n,0,1)),e.s=0,e.clamp()},v.prototype.divRemTo=function(e,t,n){var r=e.abs();if(!(r.t<=0)){var i=this.abs();if(i.t0?(r.lShiftTo(u,o),i.lShiftTo(u,n)):(r.copyTo(o),i.copyTo(n));var c=o.t,f=o[c-1];if(0!=f){var l=f*(1<1?o[c-2]>>this.F2:0),d=this.FV/l,h=(1<=0&&(n[n.t++]=1,n.subTo(y,n)),v.ONE.dlShiftTo(c,y),y.subTo(o,o);o.t=0;){var w=n[--m]==f?this.DM:Math.floor(n[m]*d+(n[m-1]+p)*h);if((n[m]+=o.am(0,w,n,b,0,c))0&&n.rShiftTo(u,n),s<0&&v.ZERO.subTo(n,n)}}},v.prototype.invDigit=function(){if(this.t<1)return 0;var e=this[0];if(0==(1&e))return 0;var t=3&e;return(t=(t=(t=(t=t*(2-(15&e)*t)&15)*(2-(255&e)*t)&255)*(2-((65535&e)*t&65535))&65535)*(2-e*t%this.DV)%this.DV)>0?this.DV-t:-t},v.prototype.addTo=function(e,t){for(var n=0,r=0,i=Math.min(e.t,this.t);n>=this.DB;if(e.t>=this.DB;r+=this.s}else{for(r+=this.s;n>=this.DB;r+=e.s}t.s=r<0?-1:0,r>0?t[n++]=r:r<-1&&(t[n++]=this.DV+r),t.t=n,t.clamp()},v.prototype.toString=function(e){if(this.s<0)return"-"+this.negate().toString(e);var t;if(16==e)t=4;else if(8==e)t=3;else if(2==e)t=1;else if(32==e)t=5;else{if(4!=e)throw new Error("Only radix 2, 4, 8, 16, 32 are supported");t=2}var n,r=(1<0)for(a>a)>0&&(i=!0,o=_(n));s>=0;)a>(a+=this.DB-t)):(n=this[s]>>(a-=t)&r,a<=0&&(a+=this.DB,--s)),n>0&&(i=!0),i&&(o+=_(n));return i?o:"0"},v.prototype.negate=function(){var e=g();return v.ZERO.subTo(this,e),e},v.prototype.abs=function(){return this.s<0?this.negate():this},v.prototype.compareTo=function(e){var t=this.s-e.s;if(0!=t)return t;var n=this.t;if(0!=(t=n-e.t))return this.s<0?-t:t;for(;--n>=0;)if(0!=(t=this[n]-e[n]))return t;return 0},v.prototype.bitLength=function(){return this.t<=0?0:this.DB*(this.t-1)+M(this[this.t-1]^this.s&this.DM)},v.prototype.mod=function(e){var t=g();return this.abs().divRemTo(e,null,t),this.s<0&&t.compareTo(v.ZERO)>0&&e.subTo(t,t),t},v.prototype.equals=function(e){return 0==this.compareTo(e)},v.prototype.add=function(e){var t=g();return this.addTo(e,t),t},v.prototype.subtract=function(e){var t=g();return this.subTo(e,t),t},v.prototype.multiply=function(e){var t=g();return this.multiplyTo(e,t),t},v.prototype.divide=function(e){var t=g();return this.divRemTo(e,t,null),t},v.prototype.modPow=function(e,t,n){var r,i=e.bitLength(),o=E(1),s=new A(t);if(i<=0)return o;r=i<18?1:i<48?3:i<144?4:i<768?5:6;var a=new Array,u=3,c=r-1,f=(1<1){var l=g();for(s.sqrTo(a[1],l);u<=f;)a[u]=g(),s.mulTo(l,a[u-2],a[u]),u+=2}var d,h,p=e.t-1,v=!0,m=g();for(i=M(e[p])-1;p>=0;){for(i>=c?d=e[p]>>i-c&f:(d=(e[p]&(1<0&&(d|=e[p-1]>>this.DB+i-c)),u=r;0==(1&d);)d>>=1,--u;if((i-=u)<0&&(i+=this.DB,--p),v)a[d].copyTo(o),v=!1;else{for(;u>1;)s.sqrTo(o,m),s.sqrTo(m,o),u-=2;u>0?s.sqrTo(o,m):(h=o,o=m,m=h),s.mulTo(m,a[d],o)}for(;p>=0&&0==(e[p]&1<>>2]>>>24-o%4*8&255;t[r+o>>>2]|=s<<24-(r+o)%4*8}else for(o=0;o>>2]=n[o>>>2];return this.sigBytes+=i,this},clamp:function(){var t=this.words,n=this.sigBytes;t[n>>>2]&=4294967295<<32-n%4*8,t.length=e.ceil(n/4)},clone:function(){var e=o.clone.call(this);return e.words=this.words.slice(0),e},random:function(t){for(var n,r=[],i=function(t){t=t;var n=987654321,r=4294967295;return function(){var i=((n=36969*(65535&n)+(n>>16)&r)<<16)+(t=18e3*(65535&t)+(t>>16)&r)&r;return i/=4294967296,(i+=.5)*(e.random()>.5?1:-1)}},o=0;o>>2]>>>24-i%4*8&255;r.push((o>>>4).toString(16)),r.push((15&o).toString(16))}return r.join("")},parse:function(e){for(var t=e.length,n=[],r=0;r>>3]|=parseInt(e.substr(r,2),16)<<24-r%8*4;return new s.init(n,t/2)}},c=a.Latin1={stringify:function(e){for(var t=e.words,n=e.sigBytes,r=[],i=0;i>>2]>>>24-i%4*8&255;r.push(String.fromCharCode(o))}return r.join("")},parse:function(e){for(var t=e.length,n=[],r=0;r>>2]|=(255&e.charCodeAt(r))<<24-r%4*8;return new s.init(n,t)}},f=a.Utf8={stringify:function(e){try{return decodeURIComponent(escape(c.stringify(e)))}catch(e){throw new Error("Malformed UTF-8 data")}},parse:function(e){return c.parse(unescape(encodeURIComponent(e)))}},l=i.BufferedBlockAlgorithm=o.extend({reset:function(){this._data=new s.init,this._nDataBytes=0},_append:function(e){"string"==typeof e&&(e=f.parse(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes},_process:function(t){var n=this._data,r=n.words,i=n.sigBytes,o=this.blockSize,a=i/(4*o),u=(a=t?e.ceil(a):e.max((0|a)-this._minBufferSize,0))*o,c=e.min(4*u,i);if(u){for(var f=0;fo?1*r:0})),!0},s=function(e,t){var n=Object.assign({},e);return t&&("string"==typeof t?delete n[t]:t.forEach((function(e){delete n[e]}))),n},a=function(e,t){void 0===t&&(t="application/octet-stream");var n=e.toLowerCase(),i=r.filter((function(e){return n.endsWith("."+e.ext)}));return i.length>0?i[0].type:t},u=function(e){var t=e.toLowerCase();return!!t.startsWith("text/")||("application/json"===t||"application/xml"===t||"application/sh"===t)},c=function(){for(var e="",t="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",n=32;n>0;n-=1)e+=t[Math.floor(Math.random()*t.length)];return e},f=function(e){if(e.isResolved)return e;var t=!0,n=!1,r=!1,i=e.then((function(e){return r=!0,t=!1,e}),(function(e){throw n=!0,t=!1,e}));return i.isFullfilled=function(){return r},i.isPending=function(){return t},i.isRejected=function(){return n},i},l=function(){if("undefined"==typeof self)return!1;var e=self;return void 0!==e.WorkerGlobalScope&&self instanceof e.WorkerGlobalScope},d=function(){return{isBrowser:"undefined"!=typeof window&&void 0!==window.document,isNode:void 0!==e&&null!=e.versions&&null!=e.versions.node}},h=function e(t,n,r){if(void 0===n&&(n=[]),void 0===r&&(r=[]),!v(t))return t;var i={};for(var o in t){if(t.hasOwnProperty(o))i[n.includes(o)?o:o[0].toLowerCase()+o.slice(1)]=r.includes(o)?t[o]:e(t[o],n,r)}return i},p=function e(t,n,r){if(void 0===n&&(n=[]),void 0===r&&(r=[]),!v(t))return t;var i={};for(var o in t){if(t.hasOwnProperty(o))i[n.includes(o)?o:o[0].toUpperCase()+o.slice(1)]=r.includes(o)?t[o]:e(t[o],n,r)}return i},v=function(e){return!(!(e instanceof Object)||e instanceof Array||e instanceof Function||e instanceof Number||e instanceof String||e instanceof Boolean)},g=function(){function e(){}return e.isEmpty=i,e.sortByField=o,e.objectLessAttributes=s,e.filenameToContentType=a,e.isTextFile=u,e.generateRandomString=c,e.makeQuerablePromise=f,e.isWebWorker=l,e.browserOrNode=d,e.transferKeyToLowerCase=h,e.transferKeyToUpperCase=p,e.isStrictObject=v,e}()}).call(this,n(20))},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var r,i=n(105);!function(e){e.CONNECTION_CLOSED="Connection closed",e.TIMEOUT_DISCONNECT="Timeout disconnect",e.SUBSCRIPTION_ACK="Subscription ack"}(r||(r={})),t.b=i.a},function(e,t,n){"use strict";var r;n.d(t,"a",(function(){return r})),function(e){e.DEFAULT_MSG="Authentication Error",e.EMPTY_USERNAME="Username cannot be empty",e.INVALID_USERNAME="The username should either be a string or one of the sign in types",e.EMPTY_PASSWORD="Password cannot be empty",e.EMPTY_CODE="Confirmation code cannot be empty",e.SIGN_UP_ERROR="Error creating account",e.NO_MFA="No valid MFA method provided",e.INVALID_MFA="Invalid MFA type",e.EMPTY_CHALLENGE="Challenge response cannot be empty",e.NO_USER_SESSION="Failed to get the session because the user is empty"}(r||(r={}))},function(e,t,n){var r=n(228),i=n(230),o=n(231),s=n(61),a=n(232),u=n(138),c=n(229),f=n(139),l=Object.prototype.hasOwnProperty;e.exports=function(e){if(null==e)return!0;if(a(e)&&(s(e)||"string"==typeof e||"function"==typeof e.splice||u(e)||f(e)||o(e)))return!e.length;var t=i(e);if("[object Map]"==t||"[object Set]"==t)return!e.size;if(c(e))return!r(e).length;for(var n in e)if(l.call(e,n))return!1;return!0}},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var r=n(1),i=n(2);var o={step:"build",tags:["SET_CONTENT_LENGTH","CONTENT_LENGTH"],name:"contentLengthMiddleware"},s=function(e){return{applyToStack:function(t){t.add(function(e){var t=this;return function(n){return function(o){return Object(r.__awaiter)(t,void 0,void 0,(function(){var t,s,a,u,c;return Object(r.__generator)(this,(function(f){return t=o.request,i.a.isInstance(t)&&(s=t.body,a=t.headers,s&&-1===Object.keys(a).map((function(e){return e.toLowerCase()})).indexOf("content-length")&&void 0!==(u=e(s))&&(t.headers=Object(r.__assign)(Object(r.__assign)({},t.headers),((c={})["content-length"]=String(u),c)))),[2,n(Object(r.__assign)(Object(r.__assign)({},o),{request:t}))]}))}))}}}(e.bodyLengthChecker),o)}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WebCryptoSha256=t.Ie11Sha256=void 0,n(1).__exportStar(n(373),t);var r=n(216);Object.defineProperty(t,"Ie11Sha256",{enumerable:!0,get:function(){return r.Sha256}});var i=n(219);Object.defineProperty(t,"WebCryptoSha256",{enumerable:!0,get:function(){return i.Sha256}})},function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var r=n(106),i=function(e){var t,n=new URL(e),i=n.hostname,o=n.pathname,s=n.port,a=n.protocol,u=n.search;return u&&(t=Object(r.a)(u)),{hostname:i,port:s?parseInt(s):void 0,protocol:a,path:o,query:t}}},function(e,t,n){"use strict";function r(e){if("string"==typeof e){for(var t=e.length,n=t-1;n>=0;n--){var r=e.charCodeAt(n);r>127&&r<=2047?t++:r>2047&&r<=65535&&(t+=2)}return t}return"number"==typeof e.byteLength?e.byteLength:"number"==typeof e.size?e.size:void 0}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";function r(e,t){return"aws-sdk-js-v3-"+e+"/"+t+" "+("undefined"!=typeof navigator&&"string"==typeof navigator.userAgent?navigator.userAgent:"")}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";var r=n(63);n(30);t.a=r.a},function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var r=n(1),i={name:"loggerMiddleware",tags:["LOGGER"],step:"initialize"},o=function(e){return{applyToStack:function(e){e.add((function(e,t){return function(n){return Object(r.__awaiter)(void 0,void 0,void 0,(function(){var i,o,s,a;return Object(r.__generator)(this,(function(r){switch(r.label){case 0:return i=t.logger,[4,e(n)];case 1:return o=r.sent(),i?(s=o.response,"function"==typeof i.info&&i.info({metadata:{statusCode:s.statusCode,requestId:null!==(a=s.headers["x-amzn-requestid"])&&void 0!==a?a:s.headers["x-amzn-request-id"],extendedRequestId:s.headers["x-amz-id-2"],cfId:s.headers["x-amz-cf-id"]}}),[2,o]):[2,o]}}))}))}}),i)}}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var r=function(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},i=function(){for(var e=[],t=0;t=s){var u=console.log.bind(console);"ERROR"===t&&console.error&&(u=console.error.bind(console)),"WARN"===t&&console.warn&&(u=console.warn.bind(console));var c="["+t+"] "+this._ts()+" "+this.name;if(1===n.length&&"string"==typeof n[0])u(c+" - "+n[0]);else if(1===n.length)u(c,n[0]);else if("string"==typeof n[0]){var f=n.slice(1);1===f.length&&(f=f[0]),u(c+" - "+n[0],f)}else u(c,n)}},e.prototype.log=function(){for(var e=[],t=0;t(i>>1)-1?(i>>1)-u:u,o.isubn(a)):a=0,r[s]=a,o.iushrn(1)}return r},r.getJSF=function(e,t){var n=[[],[]];e=e.clone(),t=t.clone();for(var r,i=0,o=0;e.cmpn(-i)>0||t.cmpn(-o)>0;){var s,a,u=e.andln(3)+i&3,c=t.andln(3)+o&3;3===u&&(u=-1),3===c&&(c=-1),s=0==(1&u)?0:3!==(r=e.andln(7)+i&7)&&5!==r||2!==c?u:-u,n[0].push(s),a=0==(1&c)?0:3!==(r=t.andln(7)+o&7)&&5!==r||2!==u?c:-c,n[1].push(a),2*i===s+1&&(i=1-i),2*o===a+1&&(o=1-o),e.iushrn(1),t.iushrn(1)}return n},r.cachedProperty=function(e,t,n){var r="_"+t;e.prototype[t]=function(){return void 0!==this[r]?this[r]:this[r]=n.call(this)}},r.parseBytes=function(e){return"string"==typeof e?r.toArray(e,"hex"):e},r.intFromLE=function(e){return new i(e,"hex","le")}},,function(e,t,n){"use strict";var r,i="object"==typeof Reflect?Reflect:null,o=i&&"function"==typeof i.apply?i.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)};r=i&&"function"==typeof i.ownKeys?i.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var s=Number.isNaN||function(e){return e!=e};function a(){a.init.call(this)}e.exports=a,e.exports.once=function(e,t){return new Promise((function(n,r){function i(){void 0!==o&&e.removeListener("error",o),n([].slice.call(arguments))}var o;"error"!==t&&(o=function(n){e.removeListener(t,i),r(n)},e.once("error",o)),e.once(t,i)}))},a.EventEmitter=a,a.prototype._events=void 0,a.prototype._eventsCount=0,a.prototype._maxListeners=void 0;var u=10;function c(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function f(e){return void 0===e._maxListeners?a.defaultMaxListeners:e._maxListeners}function l(e,t,n,r){var i,o,s,a;if(c(n),void 0===(o=e._events)?(o=e._events=Object.create(null),e._eventsCount=0):(void 0!==o.newListener&&(e.emit("newListener",t,n.listener?n.listener:n),o=e._events),s=o[t]),void 0===s)s=o[t]=n,++e._eventsCount;else if("function"==typeof s?s=o[t]=r?[n,s]:[s,n]:r?s.unshift(n):s.push(n),(i=f(e))>0&&s.length>i&&!s.warned){s.warned=!0;var u=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");u.name="MaxListenersExceededWarning",u.emitter=e,u.type=t,u.count=s.length,a=u,console&&console.warn&&console.warn(a)}return e}function d(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function h(e,t,n){var r={fired:!1,wrapFn:void 0,target:e,type:t,listener:n},i=d.bind(r);return i.listener=n,r.wrapFn=i,i}function p(e,t,n){var r=e._events;if(void 0===r)return[];var i=r[t];return void 0===i?[]:"function"==typeof i?n?[i.listener||i]:[i]:n?function(e){for(var t=new Array(e.length),n=0;n0&&(s=t[0]),s instanceof Error)throw s;var a=new Error("Unhandled error."+(s?" ("+s.message+")":""));throw a.context=s,a}var u=i[e];if(void 0===u)return!1;if("function"==typeof u)o(u,this,t);else{var c=u.length,f=g(u,c);for(n=0;n=0;o--)if(n[o]===t||n[o].listener===t){s=n[o].listener,i=o;break}if(i<0)return this;0===i?n.shift():function(e,t){for(;t+1=0;r--)this.removeListener(e,t[r]);return this},a.prototype.listeners=function(e){return p(this,e,!0)},a.prototype.rawListeners=function(e){return p(this,e,!1)},a.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):v.call(e,t)},a.prototype.listenerCount=v,a.prototype.eventNames=function(){return this._eventsCount>0?r(this._events):[]}},function(e,t,n){"use strict";n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return i}));var r={userAgent:"aws-amplify/3.8.12 js",product:"",navigator:null,isReactNative:!1};if("undefined"!=typeof navigator&&navigator.product)switch(r.product=navigator.product||"",r.navigator=navigator||null,navigator.product){case"ReactNative":r.userAgent="aws-amplify/3.8.12 react-native",r.isReactNative=!0;break;default:r.userAgent="aws-amplify/3.8.12 js",r.isReactNative=!1}var i=function(){return r.userAgent}},function(e,t,n){"use strict";var r=n(46),i=n(7);function o(e,t){return 55296==(64512&e.charCodeAt(t))&&(!(t<0||t+1>=e.length)&&56320==(64512&e.charCodeAt(t+1)))}function s(e){return(e>>>24|e>>>8&65280|e<<8&16711680|(255&e)<<24)>>>0}function a(e){return 1===e.length?"0"+e:e}function u(e){return 7===e.length?"0"+e:6===e.length?"00"+e:5===e.length?"000"+e:4===e.length?"0000"+e:3===e.length?"00000"+e:2===e.length?"000000"+e:1===e.length?"0000000"+e:e}t.inherits=i,t.toArray=function(e,t){if(Array.isArray(e))return e.slice();if(!e)return[];var n=[];if("string"==typeof e)if(t){if("hex"===t)for((e=e.replace(/[^a-z0-9]+/gi,"")).length%2!=0&&(e="0"+e),i=0;i>6|192,n[r++]=63&s|128):o(e,i)?(s=65536+((1023&s)<<10)+(1023&e.charCodeAt(++i)),n[r++]=s>>18|240,n[r++]=s>>12&63|128,n[r++]=s>>6&63|128,n[r++]=63&s|128):(n[r++]=s>>12|224,n[r++]=s>>6&63|128,n[r++]=63&s|128)}else for(i=0;i>>0}return s},t.split32=function(e,t){for(var n=new Array(4*e.length),r=0,i=0;r>>24,n[i+1]=o>>>16&255,n[i+2]=o>>>8&255,n[i+3]=255&o):(n[i+3]=o>>>24,n[i+2]=o>>>16&255,n[i+1]=o>>>8&255,n[i]=255&o)}return n},t.rotr32=function(e,t){return e>>>t|e<<32-t},t.rotl32=function(e,t){return e<>>32-t},t.sum32=function(e,t){return e+t>>>0},t.sum32_3=function(e,t,n){return e+t+n>>>0},t.sum32_4=function(e,t,n,r){return e+t+n+r>>>0},t.sum32_5=function(e,t,n,r,i){return e+t+n+r+i>>>0},t.sum64=function(e,t,n,r){var i=e[t],o=r+e[t+1]>>>0,s=(o>>0,e[t+1]=o},t.sum64_hi=function(e,t,n,r){return(t+r>>>0>>0},t.sum64_lo=function(e,t,n,r){return t+r>>>0},t.sum64_4_hi=function(e,t,n,r,i,o,s,a){var u=0,c=t;return u+=(c=c+r>>>0)>>0)>>0)>>0},t.sum64_4_lo=function(e,t,n,r,i,o,s,a){return t+r+o+a>>>0},t.sum64_5_hi=function(e,t,n,r,i,o,s,a,u,c){var f=0,l=t;return f+=(l=l+r>>>0)>>0)>>0)>>0)>>0},t.sum64_5_lo=function(e,t,n,r,i,o,s,a,u,c){return t+r+o+a+c>>>0},t.rotr64_hi=function(e,t,n){return(t<<32-n|e>>>n)>>>0},t.rotr64_lo=function(e,t,n){return(e<<32-n|t>>>n)>>>0},t.shr64_hi=function(e,t,n){return e>>>n},t.shr64_lo=function(e,t,n){return(e<<32-n|t>>>n)>>>0}},function(e,t,n){"use strict";var r=n(62);t.a=r.a},function(e,t,n){var r=n(223),i="object"==typeof self&&self&&self.Object===Object&&self,o=r||i||Function("return this")();e.exports=o},function(e,t,n){"use strict";const r=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",i="["+r+"][:A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*",o=new RegExp("^"+i+"$");t.isExist=function(e){return void 0!==e},t.isEmptyObject=function(e){return 0===Object.keys(e).length},t.merge=function(e,t,n){if(t){const r=Object.keys(t),i=r.length;for(let o=0;o>5==6?2:e>>4==14?3:e>>3==30?4:e>>6==2?-1:-2}function a(e){var t=this.lastTotal-this.lastNeed,n=function(e,t,n){if(128!=(192&t[0]))return e.lastNeed=0,"�";if(e.lastNeed>1&&t.length>1){if(128!=(192&t[1]))return e.lastNeed=1,"�";if(e.lastNeed>2&&t.length>2&&128!=(192&t[2]))return e.lastNeed=2,"�"}}(this,e);return void 0!==n?n:this.lastNeed<=e.length?(e.copy(this.lastChar,t,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(e.copy(this.lastChar,t,0,e.length),void(this.lastNeed-=e.length))}function u(e,t){if((e.length-t)%2==0){var n=e.toString("utf16le",t);if(n){var r=n.charCodeAt(n.length-1);if(r>=55296&&r<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1],n.slice(0,-1)}return n}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=e[e.length-1],e.toString("utf16le",t,e.length-1)}function c(e){var t=e&&e.length?this.write(e):"";if(this.lastNeed){var n=this.lastTotal-this.lastNeed;return t+this.lastChar.toString("utf16le",0,n)}return t}function f(e,t){var n=(e.length-t)%3;return 0===n?e.toString("base64",t):(this.lastNeed=3-n,this.lastTotal=3,1===n?this.lastChar[0]=e[e.length-1]:(this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1]),e.toString("base64",t,e.length-n))}function l(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+this.lastChar.toString("base64",0,3-this.lastNeed):t}function d(e){return e.toString(this.encoding)}function h(e){return e&&e.length?this.write(e):""}t.StringDecoder=o,o.prototype.write=function(e){if(0===e.length)return"";var t,n;if(this.lastNeed){if(void 0===(t=this.fillLast(e)))return"";n=this.lastNeed,this.lastNeed=0}else n=0;return n=0)return i>0&&(e.lastNeed=i-1),i;if(--r=0)return i>0&&(e.lastNeed=i-2),i;if(--r=0)return i>0&&(2===i?i=0:e.lastNeed=i-3),i;return 0}(this,e,t);if(!this.lastNeed)return e.toString("utf8",t);this.lastTotal=n;var r=e.length-(n-this.lastNeed);return e.copy(this.lastChar,0,r),e.toString("utf8",t,r)},o.prototype.fillLast=function(e){if(this.lastNeed<=e.length)return e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,e.length),this.lastNeed-=e.length}},function(e,t,n){"use strict";var r=n(92),i=Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t};e.exports=l;var o=Object.create(n(80));o.inherits=n(7);var s=n(171),a=n(120);o.inherits(l,s);for(var u=i(a.prototype),c=0;c0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},M="undefined"!=typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("amplify_default"):"@@amplify_default",A=function(e,t,n){o.a.dispatch("auth",{event:e,data:t,message:n},"Auth",M)},I=new i.a("OAuth"),k=function(){function e(e){var t=e.config,n=e.cognitoClientId,r=e.scopes,i=void 0===r?[]:r;if(this._urlOpener=t.urlOpener||v,this._config=t,this._cognitoClientId=n,!this.isValidScopes(i))throw Error("scopes must be a String Array");this._scopes=i}return e.prototype.isValidScopes=function(e){return Array.isArray(e)&&e.every((function(e){return"string"==typeof e}))},e.prototype.oauthSignIn=function(e,t,n,i,o,s){void 0===e&&(e="code"),void 0===o&&(o=r.b.Cognito);var a=this._generateState(32),u=s?a+"-"+s.split("").map((function(e){return e.charCodeAt(0).toString(16).padStart(2,"0")})).join(""):a;!function(e){window.sessionStorage.setItem("oauth_state",e)}(u);var c,f=this._generateRandom(128);c=f,window.sessionStorage.setItem("ouath_pkce_key",c);var l=this._generateChallenge(f),d=this._scopes.join(" "),h="https://"+t+"/oauth2/authorize?"+Object.entries(w(w({redirect_uri:n,response_type:e,client_id:i,identity_provider:o,scope:d,state:u},"code"===e?{code_challenge:l}:{}),"code"===e?{code_challenge_method:"S256"}:{})).map((function(e){var t=E(e,2),n=t[0],r=t[1];return encodeURIComponent(n)+"="+encodeURIComponent(r)})).join("&");I.debug("Redirecting to "+h),this._urlOpener(h,n)},e.prototype._handleCodeFlow=function(e){return _(this,void 0,void 0,(function(){var t,n,i,o,s,a,u,c,f,l,d,h;return S(this,(function(v){switch(v.label){case 0:return(t=(Object(p.parse)(e).query||"").split("&").map((function(e){return e.split("=")})).reduce((function(e,t){var n,r=E(t,2),i=r[0],o=r[1];return w(w({},e),((n={})[i]=o,n))}),{code:void 0}).code)&&Object(p.parse)(e).pathname===Object(p.parse)(this._config.redirectSignIn).pathname?(n="https://"+this._config.domain+"/oauth2/token",A("codeFlow",{},"Retrieving tokens from "+n),i=Object(r.d)(this._config)?this._cognitoClientId:this._config.clientID,o=Object(r.d)(this._config)?this._config.redirectSignIn:this._config.redirectUri,g=window.sessionStorage.getItem("ouath_pkce_key"),window.sessionStorage.removeItem("ouath_pkce_key"),a=w({grant_type:"authorization_code",code:t,client_id:i,redirect_uri:o},(s=g)?{code_verifier:s}:{}),I.debug("Calling token endpoint: "+n+" with",a),u=Object.entries(a).map((function(e){var t=E(e,2),n=t[0],r=t[1];return encodeURIComponent(n)+"="+encodeURIComponent(r)})).join("&"),[4,fetch(n,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:u})]):[2];case 1:return[4,v.sent().json()];case 2:if(c=v.sent(),f=c.access_token,l=c.refresh_token,d=c.id_token,h=c.error)throw new Error(h);return[2,{accessToken:f,refreshToken:l,idToken:d}]}var g}))}))},e.prototype._handleImplicitFlow=function(e){return _(this,void 0,void 0,(function(){var t,n,r;return S(this,(function(i){return t=(Object(p.parse)(e).hash||"#").substr(1).split("&").map((function(e){return e.split("=")})).reduce((function(e,t){var n,r=E(t,2),i=r[0],o=r[1];return w(w({},e),((n={})[i]=o,n))}),{id_token:void 0,access_token:void 0}),n=t.id_token,r=t.access_token,A("implicitFlow",{},"Got tokens from "+e),I.debug("Retrieving implicit tokens from "+e+" with"),[2,{accessToken:r,idToken:n,refreshToken:null}]}))}))},e.prototype.handleAuthResponse=function(e){return _(this,void 0,void 0,(function(){var t,n,r,i,o,s,a;return S(this,(function(u){switch(u.label){case 0:if(u.trys.push([0,5,,6]),t=e?w(w({},(Object(p.parse)(e).hash||"#").substr(1).split("&").map((function(e){return e.split("=")})).reduce((function(e,t){var n=E(t,2),r=n[0],i=n[1];return e[r]=i,e}),{})),(Object(p.parse)(e).query||"").split("&").map((function(e){return e.split("=")})).reduce((function(e,t){var n=E(t,2),r=n[0],i=n[1];return e[r]=i,e}),{})):{},n=t.error,r=t.error_description,n)throw new Error(r);return i=this._validateState(t),I.debug("Starting "+this._config.responseType+" flow with "+e),"code"!==this._config.responseType?[3,2]:(o=[{}],[4,this._handleCodeFlow(e)]);case 1:return[2,w.apply(void 0,[w.apply(void 0,o.concat([u.sent()])),{state:i}])];case 2:return s=[{}],[4,this._handleImplicitFlow(e)];case 3:return[2,w.apply(void 0,[w.apply(void 0,s.concat([u.sent()])),{state:i}])];case 4:return[3,6];case 5:throw a=u.sent(),I.error("Error handling auth response.",a),a;case 6:return[2]}}))}))},e.prototype._validateState=function(e){if(e){var t,n=(t=window.sessionStorage.getItem("oauth_state"),window.sessionStorage.removeItem("oauth_state"),t),r=e.state;if(n&&n!==r)throw new Error("Invalid state in OAuth flow");return r}},e.prototype.signOut=function(){return _(this,void 0,void 0,(function(){var e,t,n;return S(this,(function(i){return e="https://"+this._config.domain+"/logout?",t=Object(r.d)(this._config)?this._cognitoClientId:this._config.oauth.clientID,n=Object(r.d)(this._config)?this._config.redirectSignOut:this._config.returnTo,e+=Object.entries({client_id:t,logout_uri:encodeURIComponent(n)}).map((function(e){var t=E(e,2);return t[0]+"="+t[1]})).join("&"),A("oAuthSignOut",{oAuth:"signOut"},"Signing out from "+e),I.debug("Signing out from "+e),[2,this._urlOpener(e)]}))}))},e.prototype._generateState=function(e){for(var t="",n=e,r="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";n>0;--n)t+=r[Math.round(Math.random()*(r.length-1))];return t},e.prototype._generateChallenge=function(e){return this._base64URL(m()(e))},e.prototype._base64URL=function(e){return e.toString(y.a).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")},e.prototype._generateRandom=function(e){var t=new Uint8Array(e);if("undefined"!=typeof window&&window.crypto)window.crypto.getRandomValues(t);else for(var n=0;n0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},B=new i.a("AuthClass"),F="undefined"!=typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("amplify_default"):"@@amplify_default",z=function(e,t,n){o.a.dispatch("auth",{event:e,data:t,message:n},"Auth",F)},q=new(function(){function e(e){var t=this;this.userPool=null,this.user=null,this.oAuthFlowInProgress=!1,this.Credentials=s.a,this.wrapRefreshSessionCallback=function(e){return function(t,n){return n?z("tokenRefresh",void 0,"New token retrieved"):z("tokenRefresh_failure",t,"Failed to retrieve new token"),e(t,n)}},this.configure(e),this.currentCredentials=this.currentCredentials.bind(this),this.currentUserCredentials=this.currentUserCredentials.bind(this),o.a.listen("auth",(function(e){switch(e.payload.event){case"signIn":t._storage.setItem("amplify-signin-with-hostedUI","false");break;case"signOut":t._storage.removeItem("amplify-signin-with-hostedUI");break;case"cognitoHostedUI":t._storage.setItem("amplify-signin-with-hostedUI","true")}}))}return e.prototype.getModuleName=function(){return"Auth"},e.prototype.configure=function(e){var t=this;if(!e)return this._config||{};B.debug("configure Auth");var n=Object.assign({},this._config,a.a.parseMobilehubConfig(e).Auth,e);this._config=n;var i=this._config,o=i.userPoolId,s=i.userPoolWebClientId,l=i.cookieStorage,d=i.oauth,p=i.region,v=i.identityPoolId,g=i.mandatorySignIn,m=i.refreshHandlers,b=i.identityPoolRegion,y=i.clientMetadata,w=i.endpoint;if(this._config.storage){if(!this._isValidAuthStorage(this._config.storage))throw B.error("The storage in the Auth config is not valid!"),new Error("Empty storage object");this._storage=this._config.storage}else this._storage=l?new h.i(l):e.ssr?new u.a:(new c.a).getStorage();if(this._storageSync=Promise.resolve(),"function"==typeof this._storage.sync&&(this._storageSync=this._storage.sync()),o){var _={UserPoolId:o,ClientId:s,endpoint:w};_.Storage=this._storage,this.userPool=new h.g(_,this.wrapRefreshSessionCallback)}this.Credentials.configure({mandatorySignIn:g,region:b||p,userPoolId:o,identityPoolId:v,refreshHandlers:m,storage:this._storage});var S=d?Object(r.d)(this._config.oauth)?d:d.awsCognito:void 0;if(S){var E=Object.assign({cognitoClientId:s,UserPoolId:o,domain:S.domain,scopes:S.scope,redirectSignIn:S.redirectSignIn,redirectSignOut:S.redirectSignOut,responseType:S.responseType,Storage:this._storage,urlOpener:S.urlOpener,clientMetadata:y},S.options);this._oAuthHandler=new k({scopes:E.scopes,config:E,cognitoClientId:E.cognitoClientId});var M={};!function(e){if(f.a.browserOrNode().isBrowser&&window.location)e({url:window.location.href});else if(!f.a.browserOrNode().isNode)throw new Error("Not supported")}((function(e){var n=e.url;M[n]||(M[n]=!0,t._handleAuthResponse(n))}))}return z("configured",null,"The Auth category has been configured successfully"),this._config},e.prototype.signUp=function(e){for(var t=this,n=[],i=1;i4294967295)throw new RangeError("requested too many random bytes");var n=i.allocUnsafe(e);if(e>0)if(e>65536)for(var s=0;s2?"one of ".concat(t," ").concat(e.slice(0,n-1).join(", "),", or ")+e[n-1]:2===n?"one of ".concat(t," ").concat(e[0]," or ").concat(e[1]):"of ".concat(t," ").concat(e[0])}return"of ".concat(t," ").concat(String(e))}i("ERR_INVALID_OPT_VALUE",(function(e,t){return'The value "'+t+'" is invalid for option "'+e+'"'}),TypeError),i("ERR_INVALID_ARG_TYPE",(function(e,t,n){var r,i,s,a;if("string"==typeof t&&(i="not ",t.substr(!s||s<0?0:+s,i.length)===i)?(r="must not be",t=t.replace(/^not /,"")):r="must be",function(e,t,n){return(void 0===n||n>e.length)&&(n=e.length),e.substring(n-t.length,n)===t}(e," argument"))a="The ".concat(e," ").concat(r," ").concat(o(t,"type"));else{var u=function(e,t,n){return"number"!=typeof n&&(n=0),!(n+t.length>e.length)&&-1!==e.indexOf(t,n)}(e,".")?"property":"argument";a='The "'.concat(e,'" ').concat(u," ").concat(r," ").concat(o(t,"type"))}return a+=". Received type ".concat(typeof n)}),TypeError),i("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF"),i("ERR_METHOD_NOT_IMPLEMENTED",(function(e){return"The "+e+" method is not implemented"})),i("ERR_STREAM_PREMATURE_CLOSE","Premature close"),i("ERR_STREAM_DESTROYED",(function(e){return"Cannot call "+e+" after a stream was destroyed"})),i("ERR_MULTIPLE_CALLBACK","Callback called multiple times"),i("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable"),i("ERR_STREAM_WRITE_AFTER_END","write after end"),i("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError),i("ERR_UNKNOWN_ENCODING",(function(e){return"Unknown encoding: "+e}),TypeError),i("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event"),e.exports.codes=r},function(e,t,n){"use strict";(function(t){var r=Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t};e.exports=c;var i=n(163),o=n(167);n(7)(c,i);for(var s=r(o.prototype),a=0;a=this._finalSize&&(this._update(this._block),this._block.fill(0));var n=8*this._len;if(n<=4294967295)this._block.writeUInt32BE(n,this._blockSize-4);else{var r=(4294967295&n)>>>0,i=(n-r)/4294967296;this._block.writeUInt32BE(i,this._blockSize-8),this._block.writeUInt32BE(r,this._blockSize-4)}this._update(this._block);var o=this._hash();return e?o.toString(e):o},i.prototype._update=function(){throw new Error("_update must be implemented by subclass")},e.exports=i},function(e,t,n){"use strict";var r={};function i(e,t,n){n||(n=Error);var i=function(e){var n,r;function i(n,r,i){return e.call(this,function(e,n,r){return"string"==typeof t?t:t(e,n,r)}(n,r,i))||this}return r=e,(n=i).prototype=Object.create(r.prototype),n.prototype.constructor=n,n.__proto__=r,i}(n);i.prototype.name=n.name,i.prototype.code=e,r[e]=i}function o(e,t){if(Array.isArray(e)){var n=e.length;return e=e.map((function(e){return String(e)})),n>2?"one of ".concat(t," ").concat(e.slice(0,n-1).join(", "),", or ")+e[n-1]:2===n?"one of ".concat(t," ").concat(e[0]," or ").concat(e[1]):"of ".concat(t," ").concat(e[0])}return"of ".concat(t," ").concat(String(e))}i("ERR_INVALID_OPT_VALUE",(function(e,t){return'The value "'+t+'" is invalid for option "'+e+'"'}),TypeError),i("ERR_INVALID_ARG_TYPE",(function(e,t,n){var r,i,s,a;if("string"==typeof t&&(i="not ",t.substr(!s||s<0?0:+s,i.length)===i)?(r="must not be",t=t.replace(/^not /,"")):r="must be",function(e,t,n){return(void 0===n||n>e.length)&&(n=e.length),e.substring(n-t.length,n)===t}(e," argument"))a="The ".concat(e," ").concat(r," ").concat(o(t,"type"));else{var u=function(e,t,n){return"number"!=typeof n&&(n=0),!(n+t.length>e.length)&&-1!==e.indexOf(t,n)}(e,".")?"property":"argument";a='The "'.concat(e,'" ').concat(u," ").concat(r," ").concat(o(t,"type"))}return a+=". Received type ".concat(typeof n)}),TypeError),i("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF"),i("ERR_METHOD_NOT_IMPLEMENTED",(function(e){return"The "+e+" method is not implemented"})),i("ERR_STREAM_PREMATURE_CLOSE","Premature close"),i("ERR_STREAM_DESTROYED",(function(e){return"Cannot call "+e+" after a stream was destroyed"})),i("ERR_MULTIPLE_CALLBACK","Callback called multiple times"),i("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable"),i("ERR_STREAM_WRITE_AFTER_END","write after end"),i("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError),i("ERR_UNKNOWN_ENCODING",(function(e){return"Unknown encoding: "+e}),TypeError),i("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event"),e.exports.codes=r},function(e,t,n){"use strict";(function(t){var r=Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t};e.exports=c;var i=n(192),o=n(196);n(7)(c,i);for(var s=r(o.prototype),a=0;a0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},i={clockOffset:0,getDateWithClockOffset:function(){return i.clockOffset?new Date((new Date).getTime()+i.clockOffset):new Date},getClockOffset:function(){return i.clockOffset},getHeaderStringFromDate:function(e){return void 0===e&&(e=i.getDateWithClockOffset()),e.toISOString().replace(/[:\-]|\.\d{3}/g,"")},getDateFromHeaderString:function(e){var t=r(e.match(/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2}).+/),7),n=t[1],i=t[2],o=t[3],s=t[4],a=t[5],u=t[6];return new Date(Date.UTC(Number(n),Number(i)-1,Number(o),Number(s),Number(a),Number(u)))},isClockSkewed:function(e){return Math.abs(e.getTime()-i.getDateWithClockOffset().getTime())>=3e5},isClockSkewError:function(e){if(!e.response||!e.response.headers)return!1;var t=e.response.headers;return Boolean("BadRequestException"===t["x-amzn-errortype"]&&(t.date||t.Date))},setClockOffset:function(e){i.clockOffset=e}}},,function(e,t,n){"use strict";var r=n(7),i=n(113),o=n(116),s=n(117),a=n(56);function u(e){a.call(this,"digest"),this._hash=e}r(u,a),u.prototype._update=function(e){this._hash.update(e)},u.prototype._final=function(){return this._hash.digest()},e.exports=function(e){return"md5"===(e=e.toLowerCase())?new i:"rmd160"===e||"ripemd160"===e?new o:new u(s(e))}},function(e,t,n){(function(e){function n(e){return Object.prototype.toString.call(e)}t.isArray=function(e){return Array.isArray?Array.isArray(e):"[object Array]"===n(e)},t.isBoolean=function(e){return"boolean"==typeof e},t.isNull=function(e){return null===e},t.isNullOrUndefined=function(e){return null==e},t.isNumber=function(e){return"number"==typeof e},t.isString=function(e){return"string"==typeof e},t.isSymbol=function(e){return"symbol"==typeof e},t.isUndefined=function(e){return void 0===e},t.isRegExp=function(e){return"[object RegExp]"===n(e)},t.isObject=function(e){return"object"==typeof e&&null!==e},t.isDate=function(e){return"[object Date]"===n(e)},t.isError=function(e){return"[object Error]"===n(e)||e instanceof Error},t.isFunction=function(e){return"function"==typeof e},t.isPrimitive=function(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||void 0===e},t.isBuffer=e.isBuffer}).call(this,n(6).Buffer)},function(e,t,n){(function(t){e.exports=function(e,n){for(var r=Math.min(e.length,n.length),i=new t(r),o=0;o=this._delta8){var n=(e=this.pending).length%this._delta8;this.pending=e.slice(e.length-n,e.length),0===this.pending.length&&(this.pending=null),e=r.join32(e,0,e.length-n,this.endian);for(var i=0;i>>24&255,r[i++]=e>>>16&255,r[i++]=e>>>8&255,r[i++]=255&e}else for(r[i++]=255&e,r[i++]=e>>>8&255,r[i++]=e>>>16&255,r[i++]=e>>>24&255,r[i++]=0,r[i++]=0,r[i++]=0,r[i++]=0,o=8;o>>7)^(p<<14|p>>>18)^p>>>3,g=c[h-2],m=(g<<15|g>>>17)^(g<<13|g>>>19)^g>>>10;c[h]=v+c[h-7]+m+c[h-16]}var b=r&i^r&o^i&o,y=(r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22),w=d+((a<<26|a>>>6)^(a<<21|a>>>11)^(a<<7|a>>>25))+(a&f^~a&l)+u[h]+c[h];d=l,l=f,f=a,a=s+w|0,s=o,o=i,i=r,r=w+(y+b)|0}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+o|0,n[3]=n[3]+s|0,n[4]=n[4]+a|0,n[5]=n[5]+f|0,n[6]=n[6]+l|0,n[7]=n[7]+d|0},_doFinalize:function(){var t=this._data,n=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return n[i>>>5]|=128<<24-i%32,n[14+(i+64>>>9<<4)]=e.floor(r/4294967296),n[15+(i+64>>>9<<4)]=r,t.sigBytes=4*n.length,this._process(),this._hash},clone:function(){var e=o.clone.call(this);return e._hash=this._hash.clone(),e}});t.SHA256=o._createHelper(f),t.HmacSHA256=o._createHmacHelper(f)}(Math),r.SHA256)},function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var r=n(44),i=function(){return(i=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},s=function(){for(var e=[],t=0;t-1)&&(r===u||a.warn("WARNING: "+e+" is protected and dispatching on it can have unintended consequences"));var o={channel:e,payload:i({},t),source:n,patternInfo:[]};try{this._toListeners(o)}catch(e){a.error(e)}},e.prototype.listen=function(e,t,n){var r,i=this;if(void 0===n&&(n="noname"),function(e){return void 0!==e.onHubCapsule}(t))a.warn("WARNING onHubCapsule is Deprecated. Please pass in a callback."),r=t.onHubCapsule.bind(t);else{if("function"!=typeof t)throw new Error("No callback supplied to Hub");r=t}if(e instanceof RegExp)this.patterns.push({pattern:e,callback:r});else{var o=this.listeners[e];o||(o=[],this.listeners[e]=o),o.push({name:n,callback:r})}return function(){i.remove(e,r)}},e.prototype._toListeners=function(e){var t=e.channel,n=e.payload,r=this.listeners[t];if(r&&r.forEach((function(r){a.debug("Dispatching to "+t+" with ",n);try{r.callback(e)}catch(e){a.error(e)}})),this.patterns.length>0){if(!n.message)return void a.warn("Cannot perform pattern matching without a message key");var s=n.message;this.patterns.forEach((function(t){var n=s.match(t.pattern);if(n){var r=o(n).slice(1),u=i(i({},e),{patternInfo:r});try{t.callback(u)}catch(e){a.error(e)}}}))}},e}())("__default__")},function(e,t,n){"use strict";n.d(t,"a",(function(){return Lt}));var r=n(44),i=n(86),o=n(33),s=n(73),a=n(514),u=n(50),c=n(19),f=n(1),l=function(e,t){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};function d(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}l(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var h=function(){return(h=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s}var m,b,y,w,_,S,E,M,A,I,k,O,x,C,T,P,N,R,L,j,D,U,B,F,z,q,K,H,V,G,W,$,Y,J,Z,X,Q,ee,te,ne,re,ie,oe,se,ae,ue,ce,fe,le,de,he,pe,ve,ge,me,be,ye;Object.create;!function(e){e.AUTHENTICATED_ROLE="AuthenticatedRole",e.DENY="Deny"}(m||(m={})),(b||(b={})).filterSensitiveLog=function(e){return h({},e)},(y||(y={})).filterSensitiveLog=function(e){return h({},e)},(w||(w={})).filterSensitiveLog=function(e){return h({},e)},(_||(_={})).filterSensitiveLog=function(e){return h({},e)},(S||(S={})).filterSensitiveLog=function(e){return h({},e)},(E||(E={})).filterSensitiveLog=function(e){return h({},e)},(M||(M={})).filterSensitiveLog=function(e){return h({},e)},(A||(A={})).filterSensitiveLog=function(e){return h({},e)},(I||(I={})).filterSensitiveLog=function(e){return h({},e)},(k||(k={})).filterSensitiveLog=function(e){return h({},e)},function(e){e.ACCESS_DENIED="AccessDenied",e.INTERNAL_SERVER_ERROR="InternalServerError"}(O||(O={})),(x||(x={})).filterSensitiveLog=function(e){return h({},e)},(C||(C={})).filterSensitiveLog=function(e){return h({},e)},(T||(T={})).filterSensitiveLog=function(e){return h({},e)},(P||(P={})).filterSensitiveLog=function(e){return h({},e)},(N||(N={})).filterSensitiveLog=function(e){return h({},e)},(R||(R={})).filterSensitiveLog=function(e){return h({},e)},(L||(L={})).filterSensitiveLog=function(e){return h({},e)},(j||(j={})).filterSensitiveLog=function(e){return h({},e)},(D||(D={})).filterSensitiveLog=function(e){return h({},e)},(U||(U={})).filterSensitiveLog=function(e){return h({},e)},(B||(B={})).filterSensitiveLog=function(e){return h({},e)},(F||(F={})).filterSensitiveLog=function(e){return h({},e)},(z||(z={})).filterSensitiveLog=function(e){return h({},e)},(q||(q={})).filterSensitiveLog=function(e){return h({},e)},(K||(K={})).filterSensitiveLog=function(e){return h({},e)},function(e){e.CONTAINS="Contains",e.EQUALS="Equals",e.NOT_EQUAL="NotEqual",e.STARTS_WITH="StartsWith"}(H||(H={})),(V||(V={})).filterSensitiveLog=function(e){return h({},e)},(G||(G={})).filterSensitiveLog=function(e){return h({},e)},function(e){e.RULES="Rules",e.TOKEN="Token"}(W||(W={})),($||($={})).filterSensitiveLog=function(e){return h({},e)},(Y||(Y={})).filterSensitiveLog=function(e){return h({},e)},(J||(J={})).filterSensitiveLog=function(e){return h({},e)},(Z||(Z={})).filterSensitiveLog=function(e){return h({},e)},(X||(X={})).filterSensitiveLog=function(e){return h({},e)},(Q||(Q={})).filterSensitiveLog=function(e){return h({},e)},(ee||(ee={})).filterSensitiveLog=function(e){return h({},e)},(te||(te={})).filterSensitiveLog=function(e){return h({},e)},(ne||(ne={})).filterSensitiveLog=function(e){return h({},e)},(re||(re={})).filterSensitiveLog=function(e){return h({},e)},(ie||(ie={})).filterSensitiveLog=function(e){return h({},e)},(oe||(oe={})).filterSensitiveLog=function(e){return h({},e)},(se||(se={})).filterSensitiveLog=function(e){return h({},e)},(ae||(ae={})).filterSensitiveLog=function(e){return h({},e)},(ue||(ue={})).filterSensitiveLog=function(e){return h({},e)},(ce||(ce={})).filterSensitiveLog=function(e){return h({},e)},(fe||(fe={})).filterSensitiveLog=function(e){return h({},e)},(le||(le={})).filterSensitiveLog=function(e){return h({},e)},(de||(de={})).filterSensitiveLog=function(e){return h({},e)},(he||(he={})).filterSensitiveLog=function(e){return h({},e)},(pe||(pe={})).filterSensitiveLog=function(e){return h({},e)},(ve||(ve={})).filterSensitiveLog=function(e){return h({},e)},(ge||(ge={})).filterSensitiveLog=function(e){return h({},e)},(me||(me={})).filterSensitiveLog=function(e){return h({},e)},(be||(be={})).filterSensitiveLog=function(e){return h({},e)},(ye||(ye={})).filterSensitiveLog=function(e){return h({},e)};var we=n(2),_e=function(e,t){return p(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,f,l,d,p,g,m,b,y;return v(this,(function(v){switch(v.label){case 0:return r=[h({},e)],y={},[4,Je(e.body,t)];case 1:switch(n=h.apply(void 0,r.concat([(y.body=v.sent(),y)])),o="UnknownError",s=n.body.__type.split("#"),o=void 0===s[1]?s[0]:s[1],o){case"ExternalServiceException":case"com.amazonaws.cognitoidentity#ExternalServiceException":return[3,2];case"InternalErrorException":case"com.amazonaws.cognitoidentity#InternalErrorException":return[3,4];case"InvalidIdentityPoolConfigurationException":case"com.amazonaws.cognitoidentity#InvalidIdentityPoolConfigurationException":return[3,6];case"InvalidParameterException":case"com.amazonaws.cognitoidentity#InvalidParameterException":return[3,8];case"NotAuthorizedException":case"com.amazonaws.cognitoidentity#NotAuthorizedException":return[3,10];case"ResourceConflictException":case"com.amazonaws.cognitoidentity#ResourceConflictException":return[3,12];case"ResourceNotFoundException":case"com.amazonaws.cognitoidentity#ResourceNotFoundException":return[3,14];case"TooManyRequestsException":case"com.amazonaws.cognitoidentity#TooManyRequestsException":return[3,16]}return[3,18];case 2:return a=[{}],[4,Ee(n,t)];case 3:return i=h.apply(void 0,[h.apply(void 0,a.concat([v.sent()])),{name:o,$metadata:We(e)}]),[3,19];case 4:return u=[{}],[4,Me(n,t)];case 5:return i=h.apply(void 0,[h.apply(void 0,u.concat([v.sent()])),{name:o,$metadata:We(e)}]),[3,19];case 6:return c=[{}],[4,Ae(n,t)];case 7:return i=h.apply(void 0,[h.apply(void 0,c.concat([v.sent()])),{name:o,$metadata:We(e)}]),[3,19];case 8:return f=[{}],[4,Ie(n,t)];case 9:return i=h.apply(void 0,[h.apply(void 0,f.concat([v.sent()])),{name:o,$metadata:We(e)}]),[3,19];case 10:return l=[{}],[4,Oe(n,t)];case 11:return i=h.apply(void 0,[h.apply(void 0,l.concat([v.sent()])),{name:o,$metadata:We(e)}]),[3,19];case 12:return d=[{}],[4,xe(n,t)];case 13:return i=h.apply(void 0,[h.apply(void 0,d.concat([v.sent()])),{name:o,$metadata:We(e)}]),[3,19];case 14:return p=[{}],[4,Ce(n,t)];case 15:return i=h.apply(void 0,[h.apply(void 0,p.concat([v.sent()])),{name:o,$metadata:We(e)}]),[3,19];case 16:return g=[{}],[4,Te(n,t)];case 17:return i=h.apply(void 0,[h.apply(void 0,g.concat([v.sent()])),{name:o,$metadata:We(e)}]),[3,19];case 18:m=n.body,o=m.code||m.Code||o,i=h(h({},m),{name:""+o,message:m.message||m.Message||o,$fault:"client",$metadata:We(e)}),v.label=19;case 19:return b=i.message||i.Message||o,i.message=b,delete i.Message,[2,Promise.reject(Object.assign(new Error(b),i))]}}))}))},Se=function(e,t){return p(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,f,l,d,p,g,m,b,y;return v(this,(function(v){switch(v.label){case 0:return r=[h({},e)],y={},[4,Je(e.body,t)];case 1:switch(n=h.apply(void 0,r.concat([(y.body=v.sent(),y)])),o="UnknownError",s=n.body.__type.split("#"),o=void 0===s[1]?s[0]:s[1],o){case"ExternalServiceException":case"com.amazonaws.cognitoidentity#ExternalServiceException":return[3,2];case"InternalErrorException":case"com.amazonaws.cognitoidentity#InternalErrorException":return[3,4];case"InvalidParameterException":case"com.amazonaws.cognitoidentity#InvalidParameterException":return[3,6];case"LimitExceededException":case"com.amazonaws.cognitoidentity#LimitExceededException":return[3,8];case"NotAuthorizedException":case"com.amazonaws.cognitoidentity#NotAuthorizedException":return[3,10];case"ResourceConflictException":case"com.amazonaws.cognitoidentity#ResourceConflictException":return[3,12];case"ResourceNotFoundException":case"com.amazonaws.cognitoidentity#ResourceNotFoundException":return[3,14];case"TooManyRequestsException":case"com.amazonaws.cognitoidentity#TooManyRequestsException":return[3,16]}return[3,18];case 2:return a=[{}],[4,Ee(n,t)];case 3:return i=h.apply(void 0,[h.apply(void 0,a.concat([v.sent()])),{name:o,$metadata:We(e)}]),[3,19];case 4:return u=[{}],[4,Me(n,t)];case 5:return i=h.apply(void 0,[h.apply(void 0,u.concat([v.sent()])),{name:o,$metadata:We(e)}]),[3,19];case 6:return c=[{}],[4,Ie(n,t)];case 7:return i=h.apply(void 0,[h.apply(void 0,c.concat([v.sent()])),{name:o,$metadata:We(e)}]),[3,19];case 8:return f=[{}],[4,ke(n,t)];case 9:return i=h.apply(void 0,[h.apply(void 0,f.concat([v.sent()])),{name:o,$metadata:We(e)}]),[3,19];case 10:return l=[{}],[4,Oe(n,t)];case 11:return i=h.apply(void 0,[h.apply(void 0,l.concat([v.sent()])),{name:o,$metadata:We(e)}]),[3,19];case 12:return d=[{}],[4,xe(n,t)];case 13:return i=h.apply(void 0,[h.apply(void 0,d.concat([v.sent()])),{name:o,$metadata:We(e)}]),[3,19];case 14:return p=[{}],[4,Ce(n,t)];case 15:return i=h.apply(void 0,[h.apply(void 0,p.concat([v.sent()])),{name:o,$metadata:We(e)}]),[3,19];case 16:return g=[{}],[4,Te(n,t)];case 17:return i=h.apply(void 0,[h.apply(void 0,g.concat([v.sent()])),{name:o,$metadata:We(e)}]),[3,19];case 18:m=n.body,o=m.code||m.Code||o,i=h(h({},m),{name:""+o,message:m.message||m.Message||o,$fault:"client",$metadata:We(e)}),v.label=19;case 19:return b=i.message||i.Message||o,i.message=b,delete i.Message,[2,Promise.reject(Object.assign(new Error(b),i))]}}))}))},Ee=function(e,t){return p(void 0,void 0,void 0,(function(){var n,r;return v(this,(function(i){return n=e.body,r=je(n,t),[2,h({name:"ExternalServiceException",$fault:"client",$metadata:We(e)},r)]}))}))},Me=function(e,t){return p(void 0,void 0,void 0,(function(){var n,r;return v(this,(function(i){return n=e.body,r=Be(n,t),[2,h({name:"InternalErrorException",$fault:"server",$metadata:We(e)},r)]}))}))},Ae=function(e,t){return p(void 0,void 0,void 0,(function(){var n,r;return v(this,(function(i){return n=e.body,r=Fe(n,t),[2,h({name:"InvalidIdentityPoolConfigurationException",$fault:"client",$metadata:We(e)},r)]}))}))},Ie=function(e,t){return p(void 0,void 0,void 0,(function(){var n,r;return v(this,(function(i){return n=e.body,r=ze(n,t),[2,h({name:"InvalidParameterException",$fault:"client",$metadata:We(e)},r)]}))}))},ke=function(e,t){return p(void 0,void 0,void 0,(function(){var n,r;return v(this,(function(i){return n=e.body,r=qe(n,t),[2,h({name:"LimitExceededException",$fault:"client",$metadata:We(e)},r)]}))}))},Oe=function(e,t){return p(void 0,void 0,void 0,(function(){var n,r;return v(this,(function(i){return n=e.body,r=Ke(n,t),[2,h({name:"NotAuthorizedException",$fault:"client",$metadata:We(e)},r)]}))}))},xe=function(e,t){return p(void 0,void 0,void 0,(function(){var n,r;return v(this,(function(i){return n=e.body,r=He(n,t),[2,h({name:"ResourceConflictException",$fault:"client",$metadata:We(e)},r)]}))}))},Ce=function(e,t){return p(void 0,void 0,void 0,(function(){var n,r;return v(this,(function(i){return n=e.body,r=Ve(n,t),[2,h({name:"ResourceNotFoundException",$fault:"client",$metadata:We(e)},r)]}))}))},Te=function(e,t){return p(void 0,void 0,void 0,(function(){var n,r;return v(this,(function(i){return n=e.body,r=Ge(n,t),[2,h({name:"TooManyRequestsException",$fault:"client",$metadata:We(e)},r)]}))}))},Pe=function(e,t){return h(h(h({},void 0!==e.CustomRoleArn&&{CustomRoleArn:e.CustomRoleArn}),void 0!==e.IdentityId&&{IdentityId:e.IdentityId}),void 0!==e.Logins&&{Logins:Re(e.Logins,t)})},Ne=function(e,t){return h(h(h({},void 0!==e.AccountId&&{AccountId:e.AccountId}),void 0!==e.IdentityPoolId&&{IdentityPoolId:e.IdentityPoolId}),void 0!==e.Logins&&{Logins:Re(e.Logins,t)})},Re=function(e,t){return Object.entries(e).reduce((function(e,t){var n,r=g(t,2),i=r[0],o=r[1];return h(h({},e),((n={})[i]=o,n))}),{})},Le=function(e,t){return{AccessKeyId:void 0!==e.AccessKeyId&&null!==e.AccessKeyId?e.AccessKeyId:void 0,Expiration:void 0!==e.Expiration&&null!==e.Expiration?new Date(Math.round(1e3*e.Expiration)):void 0,SecretKey:void 0!==e.SecretKey&&null!==e.SecretKey?e.SecretKey:void 0,SessionToken:void 0!==e.SessionToken&&null!==e.SessionToken?e.SessionToken:void 0}},je=function(e,t){return{message:void 0!==e.message&&null!==e.message?e.message:void 0}},De=function(e,t){return{Credentials:void 0!==e.Credentials&&null!==e.Credentials?Le(e.Credentials):void 0,IdentityId:void 0!==e.IdentityId&&null!==e.IdentityId?e.IdentityId:void 0}},Ue=function(e,t){return{IdentityId:void 0!==e.IdentityId&&null!==e.IdentityId?e.IdentityId:void 0}},Be=function(e,t){return{message:void 0!==e.message&&null!==e.message?e.message:void 0}},Fe=function(e,t){return{message:void 0!==e.message&&null!==e.message?e.message:void 0}},ze=function(e,t){return{message:void 0!==e.message&&null!==e.message?e.message:void 0}},qe=function(e,t){return{message:void 0!==e.message&&null!==e.message?e.message:void 0}},Ke=function(e,t){return{message:void 0!==e.message&&null!==e.message?e.message:void 0}},He=function(e,t){return{message:void 0!==e.message&&null!==e.message?e.message:void 0}},Ve=function(e,t){return{message:void 0!==e.message&&null!==e.message?e.message:void 0}},Ge=function(e,t){return{message:void 0!==e.message&&null!==e.message?e.message:void 0}},We=function(e){return{httpStatusCode:e.statusCode,httpHeaders:e.headers,requestId:e.headers["x-amzn-requestid"]}},$e=function(e,t){return void 0===e&&(e=new Uint8Array),e instanceof Uint8Array?Promise.resolve(e):t.streamCollector(e)||Promise.resolve(new Uint8Array)},Ye=function(e,t,n,r,i){return p(void 0,void 0,void 0,(function(){var o,s,a,u,c,f;return v(this,(function(l){switch(l.label){case 0:return[4,e.endpoint()];case 1:return o=l.sent(),s=o.hostname,a=o.protocol,u=void 0===a?"https":a,c=o.port,f={protocol:u,hostname:s,port:c,method:"POST",path:n,headers:t},void 0!==r&&(f.hostname=r),void 0!==i&&(f.body=i),[2,new we.a(f)]}}))}))},Je=function(e,t){return function(e,t){return $e(e,t).then((function(e){return t.utf8Encoder(e)}))}(e,t).then((function(e){return e.length?JSON.parse(e):{}}))},Ze=n(10),Xe=n(0),Qe=function(e){function t(t){var n=e.call(this)||this;return n.input=t,n}return d(t,e),t.prototype.resolveMiddleware=function(e,t,n){this.middlewareStack.use(Object(Ze.a)(t,this.serialize,this.deserialize));var r=e.concat(this.middlewareStack),i=t.logger,o={logger:i,clientName:"CognitoIdentityClient",commandName:"GetCredentialsForIdentityCommand",inputFilterSensitiveLog:D.filterSensitiveLog,outputFilterSensitiveLog:B.filterSensitiveLog};"function"==typeof i.info&&i.info({clientName:"CognitoIdentityClient",commandName:"GetCredentialsForIdentityCommand"});var s=t.requestHandler;return r.resolve((function(e){return s.handle(e.request,n||{})}),o)},t.prototype.serialize=function(e,t){return function(e,t){return p(void 0,void 0,void 0,(function(){var n,r;return v(this,(function(i){return n={"Content-Type":"application/x-amz-json-1.1","X-Amz-Target":"AWSCognitoIdentityService.GetCredentialsForIdentity"},r=JSON.stringify(Pe(e,t)),[2,Ye(t,n,"/",void 0,r)]}))}))}(e,t)},t.prototype.deserialize=function(e,t){return function(e,t){return p(void 0,void 0,void 0,(function(){var n,r,i;return v(this,(function(o){switch(o.label){case 0:return e.statusCode>=300?[2,_e(e,t)]:[4,Je(e.body,t)];case 1:return n=o.sent(),{},r=De(n,t),i=h({$metadata:We(e)},r),[2,Promise.resolve(i)]}}))}))}(e,t)},t}(Xe.b),et=function(e){function t(t,n){void 0===n&&(n=!0);var r=e.call(this,t)||this;return r.tryNextLink=n,r}return Object(f.__extends)(t,e),t}(Error);function tt(e){return Promise.all(Object.keys(e).reduce((function(t,n){var r=e[n];return"string"==typeof r?t.push([n,r]):t.push(r().then((function(e){return[n,e]}))),t}),[])).then((function(e){return e.reduce((function(e,t){var n=Object(f.__read)(t,2),r=n[0],i=n[1];return e[r]=i,e}),{})}))}function nt(e){var t=this;return function(){return Object(f.__awaiter)(t,void 0,void 0,(function(){var t,n,r,i,o,s,a,u,c,l,d,h,p;return Object(f.__generator)(this,(function(f){switch(f.label){case 0:return l=(c=e.client).send,d=Qe.bind,p={CustomRoleArn:e.customRoleArn,IdentityId:e.identityId},e.logins?[4,tt(e.logins)]:[3,2];case 1:return h=f.sent(),[3,3];case 2:h=void 0,f.label=3;case 3:return[4,l.apply(c,[new(d.apply(Qe,[void 0,(p.Logins=h,p)]))])];case 4:return t=f.sent().Credentials,n=void 0===t?function(){throw new et("Response from Amazon Cognito contained no credentials")}():t,r=n.AccessKeyId,i=void 0===r?function(){throw new et("Response from Amazon Cognito contained no access key ID")}():r,o=n.Expiration,s=n.SecretKey,a=void 0===s?function(){throw new et("Response from Amazon Cognito contained no secret key")}():s,u=n.SessionToken,[2,{identityId:e.identityId,accessKeyId:i,secretAccessKey:a,sessionToken:u,expiration:o}]}}))}))}}var rt=function(e){function t(t){var n=e.call(this)||this;return n.input=t,n}return d(t,e),t.prototype.resolveMiddleware=function(e,t,n){this.middlewareStack.use(Object(Ze.a)(t,this.serialize,this.deserialize));var r=e.concat(this.middlewareStack),i=t.logger,o={logger:i,clientName:"CognitoIdentityClient",commandName:"GetIdCommand",inputFilterSensitiveLog:z.filterSensitiveLog,outputFilterSensitiveLog:q.filterSensitiveLog};"function"==typeof i.info&&i.info({clientName:"CognitoIdentityClient",commandName:"GetIdCommand"});var s=t.requestHandler;return r.resolve((function(e){return s.handle(e.request,n||{})}),o)},t.prototype.serialize=function(e,t){return function(e,t){return p(void 0,void 0,void 0,(function(){var n,r;return v(this,(function(i){return n={"Content-Type":"application/x-amz-json-1.1","X-Amz-Target":"AWSCognitoIdentityService.GetId"},r=JSON.stringify(Ne(e,t)),[2,Ye(t,n,"/",void 0,r)]}))}))}(e,t)},t.prototype.deserialize=function(e,t){return function(e,t){return p(void 0,void 0,void 0,(function(){var n,r,i;return v(this,(function(o){switch(o.label){case 0:return e.statusCode>=300?[2,Se(e,t)]:[4,Je(e.body,t)];case 1:return n=o.sent(),{},r=Ue(n,t),i=h({$metadata:We(e)},r),[2,Promise.resolve(i)]}}))}))}(e,t)},t}(Xe.b),it=function(){function e(e){void 0===e&&(e="aws:cognito-identity-ids"),this.dbName=e}return e.prototype.getItem=function(e){return this.withObjectStore("readonly",(function(t){var n=t.get(e);return new Promise((function(e){n.onerror=function(){return e(null)},n.onsuccess=function(){return e(n.result?n.result.value:null)}}))})).catch((function(){return null}))},e.prototype.removeItem=function(e){return this.withObjectStore("readwrite",(function(t){var n=t.delete(e);return new Promise((function(e,t){n.onerror=function(){return t(n.error)},n.onsuccess=function(){return e()}}))}))},e.prototype.setItem=function(e,t){return this.withObjectStore("readwrite",(function(n){var r=n.put({id:e,value:t});return new Promise((function(e,t){r.onerror=function(){return t(r.error)},r.onsuccess=function(){return e()}}))}))},e.prototype.getDb=function(){var e=self.indexedDB.open(this.dbName,1);return new Promise((function(t,n){e.onsuccess=function(){t(e.result)},e.onerror=function(){n(e.error)},e.onblocked=function(){n(new Error("Unable to access DB"))},e.onupgradeneeded=function(){var t=e.result;t.onerror=function(){n(new Error("Failed to create object store"))},t.createObjectStore("IdentityIds",{keyPath:"id"})}}))},e.prototype.withObjectStore=function(e,t){return this.getDb().then((function(n){var r=n.transaction("IdentityIds",e);return r.oncomplete=function(){return n.close()},new Promise((function(e,n){r.onerror=function(){return n(r.error)},e(t(r.objectStore("IdentityIds")))})).catch((function(e){throw n.close(),e}))}))},e}(),ot=new(function(){function e(e){void 0===e&&(e={}),this.store=e}return e.prototype.getItem=function(e){return e in this.store?this.store[e]:null},e.prototype.removeItem=function(e){delete this.store[e]},e.prototype.setItem=function(e,t){this.store[e]=t},e}());function st(e){var t=this,n=e.accountId,r=e.cache,i=void 0===r?"object"==typeof self&&self.indexedDB?new it:"object"==typeof window&&window.localStorage?window.localStorage:ot:r,o=e.client,s=e.customRoleArn,a=e.identityPoolId,u=e.logins,c=e.userIdentifier,l=void 0===c?u&&0!==Object.keys(u).length?void 0:"ANONYMOUS":c,d=l?"aws:cognito-identity-credentials:"+a+":"+l:void 0,h=function(){return Object(f.__awaiter)(t,void 0,void 0,(function(){var e,t,r,c,l,p,v,g,m;return Object(f.__generator)(this,(function(f){switch(f.label){case 0:return(t=d)?[4,i.getItem(d)]:[3,2];case 1:t=f.sent(),f.label=2;case 2:return(e=t)?[3,7]:(p=(l=o).send,v=rt.bind,m={AccountId:n,IdentityPoolId:a},u?[4,tt(u)]:[3,4]);case 3:return g=f.sent(),[3,5];case 4:g=void 0,f.label=5;case 5:return[4,p.apply(l,[new(v.apply(rt,[void 0,(m.Logins=g,m)]))])];case 6:r=f.sent().IdentityId,c=void 0===r?function(){throw new et("Response from Amazon Cognito contained no identity ID")}():r,e=c,d&&Promise.resolve(i.setItem(d,e)).catch((function(){})),f.label=7;case 7:return[2,(h=nt({client:o,customRoleArn:s,logins:u,identityId:e}))()]}}))}))};return function(){return h().catch((function(e){return Object(f.__awaiter)(t,void 0,void 0,(function(){return Object(f.__generator)(this,(function(t){throw d&&Promise.resolve(i.removeItem(d)).catch((function(){})),e}))}))}))}}var at=n(147),ut=n(38),ct=n(18),ft=n(24),lt=n(11),dt=n(39),ht=n(17),pt=n(40),vt=n(41),gt=n(15),mt="cognito-identity.{region}.amazonaws.com",bt=new Set(["ap-east-1","ap-northeast-1","ap-northeast-2","ap-south-1","ap-southeast-1","ap-southeast-2","ca-central-1","eu-central-1","eu-north-1","eu-west-1","eu-west-2","eu-west-3","me-south-1","sa-east-1","us-east-1","us-east-2","us-west-1","us-west-2"]),yt=new Set(["cn-north-1","cn-northwest-1"]),wt=new Set(["us-iso-east-1"]),_t=new Set(["us-isob-east-1"]),St=new Set(["us-gov-east-1","us-gov-west-1"]),Et=h(h({},{apiVersion:"2014-06-30",disableHostPrefix:!1,logger:{},regionInfoProvider:function(e,t){var n=void 0;switch(e){case"ap-northeast-1":n={hostname:"cognito-identity.ap-northeast-1.amazonaws.com",partition:"aws"};break;case"ap-northeast-2":n={hostname:"cognito-identity.ap-northeast-2.amazonaws.com",partition:"aws"};break;case"ap-south-1":n={hostname:"cognito-identity.ap-south-1.amazonaws.com",partition:"aws"};break;case"ap-southeast-1":n={hostname:"cognito-identity.ap-southeast-1.amazonaws.com",partition:"aws"};break;case"ap-southeast-2":n={hostname:"cognito-identity.ap-southeast-2.amazonaws.com",partition:"aws"};break;case"ca-central-1":n={hostname:"cognito-identity.ca-central-1.amazonaws.com",partition:"aws"};break;case"cn-north-1":n={hostname:"cognito-identity.cn-north-1.amazonaws.com.cn",partition:"aws-cn"};break;case"eu-central-1":n={hostname:"cognito-identity.eu-central-1.amazonaws.com",partition:"aws"};break;case"eu-west-1":n={hostname:"cognito-identity.eu-west-1.amazonaws.com",partition:"aws"};break;case"eu-west-2":n={hostname:"cognito-identity.eu-west-2.amazonaws.com",partition:"aws"};break;case"us-east-1":n={hostname:"cognito-identity.us-east-1.amazonaws.com",partition:"aws"};break;case"us-east-2":n={hostname:"cognito-identity.us-east-2.amazonaws.com",partition:"aws"};break;case"us-west-2":n={hostname:"cognito-identity.us-west-2.amazonaws.com",partition:"aws"};break;default:bt.has(e)&&(n={hostname:mt.replace("{region}",e),partition:"aws"}),yt.has(e)&&(n={hostname:"cognito-identity.{region}.amazonaws.com.cn".replace("{region}",e),partition:"aws-cn"}),wt.has(e)&&(n={hostname:"cognito-identity.{region}.c2s.ic.gov".replace("{region}",e),partition:"aws-iso"}),_t.has(e)&&(n={hostname:"cognito-identity.{region}.sc2s.sgov.gov".replace("{region}",e),partition:"aws-iso-b"}),St.has(e)&&(n={hostname:"cognito-identity.{region}.amazonaws.com".replace("{region}",e),partition:"aws-us-gov"}),void 0===n&&(n={hostname:mt.replace("{region}",e),partition:"aws"})}return Promise.resolve(n)},signingName:"cognito-identity"}),{runtime:"browser",base64Decoder:ht.a,base64Encoder:ht.b,bodyLengthChecker:pt.a,credentialDefaultProvider:function(){},defaultUserAgent:Object(vt.a)(at.name,at.version),maxAttempts:lt.a,region:Object(ft.a)("Region is missing"),requestHandler:new ct.a,sha256:ut.Sha256,streamCollector:ct.b,urlParser:dt.a,utf8Decoder:gt.a,utf8Encoder:gt.b}),Mt=n(22),At=n(37),It=n(21),kt=n(43),Ot=n(25),xt=n(23),Ct=function(e){function t(t){var n=this,r=h(h({},Et),t),i=Object(Mt.b)(r),o=Object(Mt.a)(i),s=Object(Ot.b)(o),a=Object(lt.c)(s),u=Object(xt.b)(a),c=Object(It.b)(u);return(n=e.call(this,c)||this).config=c,n.middlewareStack.use(Object(lt.b)(n.config)),n.middlewareStack.use(Object(xt.a)(n.config)),n.middlewareStack.use(Object(At.a)(n.config)),n.middlewareStack.use(Object(It.a)(n.config)),n.middlewareStack.use(Object(kt.a)(n.config)),n}return d(t,e),t.prototype.destroy=function(){e.prototype.destroy.call(this)},t}(Xe.a),Tt=function(){return(Tt=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1](new Date).getTime()?(Rt.debug("token not expired"),this._setCredentialsFromFederation({provider:t,token:r,user:n,identity_id:i,expires_at:o})):this._refreshHandlers[t]&&"function"==typeof this._refreshHandlers[t]?(Rt.debug("getting refreshed jwt token from federation provider"),this._providerRefreshWithRetry({refreshHandler:this._refreshHandlers[t],provider:t,user:n})):(Rt.debug("no refresh handler for provider:",t),this.clear(),Promise.reject("no refresh handler for provider"))},e.prototype._providerRefreshWithRetry=function(e){var t=this,n=e.refreshHandler,r=e.provider,i=e.user;return Object(a.b)(n,[],1e4).then((function(e){return Rt.debug("refresh federated token sucessfully",e),t._setCredentialsFromFederation({provider:r,token:e.token,user:i,identity_id:e.identity_id,expires_at:e.expires_at})})).catch((function(e){return"string"==typeof e&&0===e.toLowerCase().lastIndexOf("network error",e.length)||t.clear(),Rt.debug("refresh federated token failed",e),Promise.reject("refreshing federation token failed: "+e)}))},e.prototype._isExpired=function(e){if(!e)return Rt.debug("no credentials for expiration check"),!0;Rt.debug("are these credentials expired?",e);var t=Date.now();return e.expiration.getTime()<=t},e.prototype._isPastTTL=function(){return this._nextCredentialsRefresh<=Date.now()},e.prototype._setCredentialsForGuest=function(){return Pt(this,void 0,void 0,(function(){var e,t,n,r,i,o,s,a=this;return Nt(this,(function(c){switch(c.label){case 0:if(Rt.debug("setting credentials for guest"),e=this._config,t=e.identityPoolId,n=e.region,e.mandatorySignIn)return[2,Promise.reject("cannot get guest credentials when mandatory signin enabled")];if(!t)return Rt.debug("No Cognito Identity pool provided for unauthenticated access"),[2,Promise.reject("No Cognito Identity pool provided for unauthenticated access")];if(!n)return Rt.debug("region is not configured for getting the credentials"),[2,Promise.reject("region is not configured for getting the credentials")];r=void 0,c.label=1;case 1:return c.trys.push([1,3,,4]),[4,this._storageSync];case 2:return c.sent(),r=this._storage.getItem("CognitoIdentityId-"+t),this._identityId=r,[3,4];case 3:return i=c.sent(),Rt.debug("Failed to get the cached identityId",i),[3,4];case 4:return o=new Ct({region:n,customUserAgent:Object(u.b)()}),s=void 0,s=r?nt({identityId:r,client:o})():function(){return Pt(a,void 0,void 0,(function(){var e;return Nt(this,(function(n){switch(n.label){case 0:return[4,o.send(new rt({IdentityPoolId:t}))];case 1:return e=n.sent().IdentityId,this._identityId=e,[2,nt({client:o,identityId:e})()]}}))}))}().catch((function(e){return Pt(a,void 0,void 0,(function(){return Nt(this,(function(t){throw e}))}))})),[2,this._loadCredentials(s,"guest",!1,null).then((function(e){return e})).catch((function(e){return Pt(a,void 0,void 0,(function(){var n=this;return Nt(this,(function(i){return"ResourceNotFoundException"===e.name&&e.message==="Identity '"+r+"' not found."?(Rt.debug("Failed to load guest credentials"),this._storage.removeItem("CognitoIdentityId-"+t),s=function(){return Pt(n,void 0,void 0,(function(){var e;return Nt(this,(function(n){switch(n.label){case 0:return[4,o.send(new rt({IdentityPoolId:t}))];case 1:return e=n.sent().IdentityId,this._identityId=e,[2,nt({client:o,identityId:e})()]}}))}))}().catch((function(e){return Pt(n,void 0,void 0,(function(){return Nt(this,(function(t){throw e}))}))})),[2,this._loadCredentials(s,"guest",!1,null)]):[2,e]}))}))}))]}}))}))},e.prototype._setCredentialsFromFederation=function(e){var t=e.provider,n=e.token,r=e.identity_id,i={google:"accounts.google.com",facebook:"graph.facebook.com",amazon:"www.amazon.com",developer:"cognito-identity.amazonaws.com"}[t]||t;if(!i)return Promise.reject("You must specify a federated provider");var o={};o[i]=n;var s=this._config,a=s.identityPoolId,c=s.region;if(!a)return Rt.debug("No Cognito Federated Identity pool provided"),Promise.reject("No Cognito Federated Identity pool provided");if(!c)return Rt.debug("region is not configured for getting the credentials"),Promise.reject("region is not configured for getting the credentials");var f=new Ct({region:c,customUserAgent:Object(u.b)()}),l=void 0;r?l=nt({identityId:r,logins:o,client:f})():l=st({logins:o,identityPoolId:a,client:f})();return this._loadCredentials(l,"federated",!0,e)},e.prototype._setCredentialsFromSession=function(e){var t=this;Rt.debug("set credentials from session");var n=e.getIdToken().getJwtToken(),r=this._config,i=r.region,o=r.userPoolId,s=r.identityPoolId;if(!s)return Rt.debug("No Cognito Federated Identity pool provided"),Promise.reject("No Cognito Federated Identity pool provided");if(!i)return Rt.debug("region is not configured for getting the credentials"),Promise.reject("region is not configured for getting the credentials");var a={};a["cognito-idp."+i+".amazonaws.com/"+o]=n;var c=new Ct({region:i,customUserAgent:Object(u.b)()}),f=Pt(t,void 0,void 0,(function(){var e;return Nt(this,(function(t){switch(t.label){case 0:return[4,c.send(new rt({IdentityPoolId:s,Logins:a}))];case 1:return e=t.sent().IdentityId,this._identityId=e,[2,nt({client:c,logins:a,identityId:e})()]}}))})).catch((function(e){return Pt(t,void 0,void 0,(function(){return Nt(this,(function(t){throw e}))}))}));return this._loadCredentials(f,"userPool",!0,null)},e.prototype._loadCredentials=function(e,t,n,r){var i=this,o=this,s=this._config.identityPoolId;return new Promise((function(a,u){e.then((function(e){return Pt(i,void 0,void 0,(function(){var i,u,c,f,l,d;return Nt(this,(function(h){switch(h.label){case 0:if(Rt.debug("Load credentials successfully",e),this._identityId&&!e.identityId&&(e.identityId=this._identityId),o._credentials=e,o._credentials.authenticated=n,o._credentials_source=t,o._nextCredentialsRefresh=(new Date).getTime()+3e6,"federated"===t){i=Object.assign({id:this._credentials.identityId},r.user),u=r.provider,c=r.token,f=r.expires_at,l=r.identity_id;try{this._storage.setItem("aws-amplify-federatedInfo",JSON.stringify({provider:u,token:c,user:i,expires_at:f,identity_id:l}))}catch(e){Rt.debug("Failed to put federated info into auth storage",e)}}if("guest"!==t)return[3,4];h.label=1;case 1:return h.trys.push([1,3,,4]),[4,this._storageSync];case 2:return h.sent(),this._storage.setItem("CognitoIdentityId-"+s,e.identityId),[3,4];case 3:return d=h.sent(),Rt.debug("Failed to cache identityId",d),[3,4];case 4:return a(o._credentials),[2]}}))}))})).catch((function(t){if(t)return Rt.debug("Failed to load credentials",e),Rt.debug("Error loading credentials",t),void u(t)}))}))},e.prototype.set=function(e,t){return"session"===t?this._setCredentialsFromSession(e):"federation"===t?this._setCredentialsFromFederation(e):"guest"===t?this._setCredentialsForGuest():(Rt.debug("no source specified for setting credentials"),Promise.reject("invalid source"))},e.prototype.clear=function(){return Pt(this,void 0,void 0,(function(){return Nt(this,(function(e){return this._credentials=null,this._credentials_source=null,Rt.debug("removing aws-amplify-federatedInfo from storage"),this._storage.removeItem("aws-amplify-federatedInfo"),[2]}))}))},e.prototype.shear=function(e){return{accessKeyId:e.accessKeyId,sessionToken:e.sessionToken,secretAccessKey:e.secretAccessKey,identityId:e.identityId,authenticated:e.authenticated}},e}())(null);c.a.register(Lt)},function(e,t,n){var r,i,o;e.exports=(o=n(32),i=(r=o).lib.WordArray,r.enc.Base64={stringify:function(e){var t=e.words,n=e.sigBytes,r=this._map;e.clamp();for(var i=[],o=0;o>>2]>>>24-o%4*8&255)<<16|(t[o+1>>>2]>>>24-(o+1)%4*8&255)<<8|t[o+2>>>2]>>>24-(o+2)%4*8&255,a=0;a<4&&o+.75*a>>6*(3-a)&63));var u=r.charAt(64);if(u)for(;i.length%4;)i.push(u);return i.join("")},parse:function(e){var t=e.length,n=this._map,r=this._reverseMap;if(!r){r=this._reverseMap=[];for(var o=0;o>>6-s%4*2;r[o>>>2]|=(a|u)<<24-o%4*8,o++}return i.create(r,o)}(e,t,r)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="},o.enc.Base64)},function(e,t,n){"use strict";function r(e,t){for(var n,r=/\r\n|[\n\r]/g,i=1,o=t+1;(n=r.exec(e.body))&&n.index>>24]^f[p>>>16&255]^l[v>>>8&255]^d[255&g]^t[m++],s=c[p>>>24]^f[v>>>16&255]^l[g>>>8&255]^d[255&h]^t[m++],a=c[v>>>24]^f[g>>>16&255]^l[h>>>8&255]^d[255&p]^t[m++],u=c[g>>>24]^f[h>>>16&255]^l[p>>>8&255]^d[255&v]^t[m++],h=o,p=s,v=a,g=u;return o=(r[h>>>24]<<24|r[p>>>16&255]<<16|r[v>>>8&255]<<8|r[255&g])^t[m++],s=(r[p>>>24]<<24|r[v>>>16&255]<<16|r[g>>>8&255]<<8|r[255&h])^t[m++],a=(r[v>>>24]<<24|r[g>>>16&255]<<16|r[h>>>8&255]<<8|r[255&p])^t[m++],u=(r[g>>>24]<<24|r[h>>>16&255]<<16|r[p>>>8&255]<<8|r[255&v])^t[m++],[o>>>=0,s>>>=0,a>>>=0,u>>>=0]}var a=[0,1,2,4,8,16,32,64,128,27,54],u=function(){for(var e=new Array(256),t=0;t<256;t++)e[t]=t<128?t<<1:t<<1^283;for(var n=[],r=[],i=[[],[],[],[]],o=[[],[],[],[]],s=0,a=0,u=0;u<256;++u){var c=a^a<<1^a<<2^a<<3^a<<4;c=c>>>8^255&c^99,n[s]=c,r[c]=s;var f=e[s],l=e[f],d=e[l],h=257*e[c]^16843008*c;i[0][s]=h<<24|h>>>8,i[1][s]=h<<16|h>>>16,i[2][s]=h<<8|h>>>24,i[3][s]=h,h=16843009*d^65537*l^257*f^16843008*s,o[0][c]=h<<24|h>>>8,o[1][c]=h<<16|h>>>16,o[2][c]=h<<8|h>>>24,o[3][c]=h,0===s?s=a=1:(s=f^e[e[e[d^f]]],a^=e[e[a]])}return{SBOX:n,INV_SBOX:r,SUB_MIX:i,INV_SUB_MIX:o}}();function c(e){this._key=i(e),this._reset()}c.blockSize=16,c.keySize=32,c.prototype.blockSize=c.blockSize,c.prototype.keySize=c.keySize,c.prototype._reset=function(){for(var e=this._key,t=e.length,n=t+6,r=4*(n+1),i=[],o=0;o>>24,s=u.SBOX[s>>>24]<<24|u.SBOX[s>>>16&255]<<16|u.SBOX[s>>>8&255]<<8|u.SBOX[255&s],s^=a[o/t|0]<<24):t>6&&o%t==4&&(s=u.SBOX[s>>>24]<<24|u.SBOX[s>>>16&255]<<16|u.SBOX[s>>>8&255]<<8|u.SBOX[255&s]),i[o]=i[o-t]^s}for(var c=[],f=0;f>>24]]^u.INV_SUB_MIX[1][u.SBOX[d>>>16&255]]^u.INV_SUB_MIX[2][u.SBOX[d>>>8&255]]^u.INV_SUB_MIX[3][u.SBOX[255&d]]}this._nRounds=n,this._keySchedule=i,this._invKeySchedule=c},c.prototype.encryptBlockRaw=function(e){return s(e=i(e),this._keySchedule,u.SUB_MIX,u.SBOX,this._nRounds)},c.prototype.encryptBlock=function(e){var t=this.encryptBlockRaw(e),n=r.allocUnsafe(16);return n.writeUInt32BE(t[0],0),n.writeUInt32BE(t[1],4),n.writeUInt32BE(t[2],8),n.writeUInt32BE(t[3],12),n},c.prototype.decryptBlock=function(e){var t=(e=i(e))[1];e[1]=e[3],e[3]=t;var n=s(e,this._invKeySchedule,u.INV_SUB_MIX,u.INV_SBOX,this._nRounds),o=r.allocUnsafe(16);return o.writeUInt32BE(n[0],0),o.writeUInt32BE(n[3],4),o.writeUInt32BE(n[2],8),o.writeUInt32BE(n[1],12),o},c.prototype.scrub=function(){o(this._keySchedule),o(this._invKeySchedule),o(this._key)},e.exports.AES=c},function(e,t,n){var r=n(8).Buffer,i=n(113);e.exports=function(e,t,n,o){if(r.isBuffer(e)||(e=r.from(e,"binary")),t&&(r.isBuffer(t)||(t=r.from(t,"binary")),8!==t.length))throw new RangeError("salt should be Buffer with 8 byte length");for(var s=n/8,a=r.alloc(s),u=r.alloc(o||0),c=r.alloc(0);s>0||o>0;){var f=new i;f.update(c),f.update(e),t&&f.update(t),c=f.digest();var l=0;if(s>0){var d=a.length-s;l=Math.min(s,c.length),c.copy(a,d,0,l),s-=l}if(l0){var h=u.length-o,p=Math.min(o,c.length-l);c.copy(u,h,l,l+p),o-=p}}return c.fill(0),{key:a,iv:u}}},function(e,t,n){"use strict";var r=n(29),i=n(47),o=i.getNAF,s=i.getJSF,a=i.assert;function u(e,t){this.type=e,this.p=new r(t.p,16),this.red=t.prime?r.red(t.prime):r.mont(this.p),this.zero=new r(0).toRed(this.red),this.one=new r(1).toRed(this.red),this.two=new r(2).toRed(this.red),this.n=t.n&&new r(t.n,16),this.g=t.g&&this.pointFromJSON(t.g,t.gRed),this._wnafT1=new Array(4),this._wnafT2=new Array(4),this._wnafT3=new Array(4),this._wnafT4=new Array(4),this._bitLength=this.n?this.n.bitLength():0;var n=this.n&&this.p.div(this.n);!n||n.cmpn(100)>0?this.redN=null:(this._maxwellTrick=!0,this.redN=this.n.toRed(this.red))}function c(e,t){this.curve=e,this.type=t,this.precomputed=null}e.exports=u,u.prototype.point=function(){throw new Error("Not implemented")},u.prototype.validate=function(){throw new Error("Not implemented")},u.prototype._fixedNafMul=function(e,t){a(e.precomputed);var n=e._getDoubles(),r=o(t,1,this._bitLength),i=(1<=s;f--)u=(u<<1)+r[f];c.push(u)}for(var l=this.jpoint(null,null,null),d=this.jpoint(null,null,null),h=i;h>0;h--){for(s=0;s=0;c--){for(var f=0;c>=0&&0===s[c];c--)f++;if(c>=0&&f++,u=u.dblp(f),c<0)break;var l=s[c];a(0!==l),u="affine"===e.type?l>0?u.mixedAdd(i[l-1>>1]):u.mixedAdd(i[-l-1>>1].neg()):l>0?u.add(i[l-1>>1]):u.add(i[-l-1>>1].neg())}return"affine"===e.type?u.toP():u},u.prototype._wnafMulAdd=function(e,t,n,r,i){var a,u,c,f=this._wnafT1,l=this._wnafT2,d=this._wnafT3,h=0;for(a=0;a=1;a-=2){var v=a-1,g=a;if(1===f[v]&&1===f[g]){var m=[t[v],null,null,t[g]];0===t[v].y.cmp(t[g].y)?(m[1]=t[v].add(t[g]),m[2]=t[v].toJ().mixedAdd(t[g].neg())):0===t[v].y.cmp(t[g].y.redNeg())?(m[1]=t[v].toJ().mixedAdd(t[g]),m[2]=t[v].add(t[g].neg())):(m[1]=t[v].toJ().mixedAdd(t[g]),m[2]=t[v].toJ().mixedAdd(t[g].neg()));var b=[-3,-1,-5,-7,0,7,5,1,3],y=s(n[v],n[g]);for(h=Math.max(y[0].length,h),d[v]=new Array(h),d[g]=new Array(h),u=0;u=0;a--){for(var M=0;a>=0;){var A=!0;for(u=0;u=0&&M++,S=S.dblp(M),a<0)break;for(u=0;u0?c=l[u][I-1>>1]:I<0&&(c=l[u][-I-1>>1].neg()),S="affine"===c.type?S.mixedAdd(c):S.add(c))}}for(a=0;a=Math.ceil((e.bitLength()+1)/t.step)},c.prototype._getDoubles=function(e,t){if(this.precomputed&&this.precomputed.doubles)return this.precomputed.doubles;for(var n=[this],r=this,i=0;i))|((NAME:)?(NAME))([^>]*)>|((\\/)(NAME)\\s*>))([^<]*)".replace(/NAME/g,r.nameRegexp);!Number.parseInt&&window.parseInt&&(Number.parseInt=window.parseInt),!Number.parseFloat&&window.parseFloat&&(Number.parseFloat=window.parseFloat);const s={attributeNamePrefix:"@_",attrNodeName:!1,textNodeName:"#text",ignoreAttributes:!0,ignoreNameSpace:!1,allowBooleanAttributes:!1,parseNodeValue:!0,parseAttributeValue:!1,arrayMode:!1,trimValues:!0,cdataTagName:!1,cdataPositionChar:"\\c",tagValueProcessor:function(e,t){return e},attrValueProcessor:function(e,t){return e},stopNodes:[]};t.defaultOptions=s;const a=["attributeNamePrefix","attrNodeName","textNodeName","ignoreAttributes","ignoreNameSpace","allowBooleanAttributes","parseNodeValue","parseAttributeValue","arrayMode","trimValues","cdataTagName","cdataPositionChar","tagValueProcessor","attrValueProcessor","parseTrueNumberOnly","stopNodes"];function u(e,t,n){return t&&(n.trimValues&&(t=t.trim()),t=f(t=n.tagValueProcessor(t,e),n.parseNodeValue,n.parseTrueNumberOnly)),t}function c(e,t){if(t.ignoreNameSpace){const t=e.split(":"),n="/"===e.charAt(0)?"/":"";if("xmlns"===t[0])return"";2===t.length&&(e=n+t[1])}return e}function f(e,t,n){if(t&&"string"==typeof e){let t;return""===e.trim()||isNaN(e)?t="true"===e||"false"!==e&&e:(-1!==e.indexOf("0x")?t=Number.parseInt(e,16):-1!==e.indexOf(".")?(t=Number.parseFloat(e),e=e.replace(/\.?0+$/,"")):t=Number.parseInt(e,10),n&&(t=String(t)===e?t:e)),t}return r.isExist(e)?e:""}t.props=a;const l=new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])(.*?)\\3)?","g");function d(e,t){if(!t.ignoreAttributes&&"string"==typeof e){e=e.replace(/\r?\n/g," ");const n=r.getAllMatches(e,l),i=n.length,o={};for(let e=0;e"===t)return{data:r,index:i};"\t"===t&&(t=" ")}r+=t}}function p(e,t,n,r){const i=e.indexOf(t,n);if(-1===i)throw new Error(r);return i+t.length-1}t.getTraversalObj=function(e,t){e=e.replace(/\r\n?/g,"\n"),t=i(t,s,a);const n=new o("!xml");let c=n,f="";for(let n=0;n",n,"Closing Tag is not closed.");let o=e.substring(n+2,i).trim();if(t.ignoreNameSpace){const e=o.indexOf(":");-1!==e&&(o=o.substr(e+1))}c&&(c.val?c.val=r.getValue(c.val)+""+u(o,f,t):c.val=u(o,f,t)),t.stopNodes.length&&t.stopNodes.includes(c.tagname)&&(c.child=[],null==c.attrsMap&&(c.attrsMap={}),c.val=e.substr(c.startIndex+1,n-c.startIndex-1)),c=c.parent,f="",n=i}else if("?"===e[n+1])n=p(e,"?>",n,"Pi Tag is not closed.");else if("!--"===e.substr(n+1,3))n=p(e,"--\x3e",n,"Comment is not closed.");else if("!D"===e.substr(n+1,2)){const t=p(e,">",n,"DOCTYPE is not closed.");n=e.substring(n,t).indexOf("[")>=0?e.indexOf("]>",n)+1:t}else if("!["===e.substr(n+1,2)){const i=p(e,"]]>",n,"CDATA is not closed.")-2,s=e.substring(n+9,i);if(f&&(c.val=r.getValue(c.val)+""+u(c.tagname,f,t),f=""),t.cdataTagName){const e=new o(t.cdataTagName,c,s);c.addChild(e),c.val=r.getValue(c.val)+t.cdataPositionChar,s&&(e.val=s)}else c.val=(c.val||"")+(s||"");n=i+2}else{const i=h(e,n+1);let s=i.data;const a=i.index,l=s.indexOf(" ");let p=s;if(-1!==l&&(p=s.substr(0,l).replace(/\s\s*$/,""),s=s.substr(l+1)),t.ignoreNameSpace){const e=p.indexOf(":");-1!==e&&(p=p.substr(e+1))}if(c&&f&&"!xml"!==c.tagname&&(c.val=r.getValue(c.val)+""+u(c.tagname,f,t)),s.length>0&&s.lastIndexOf("/")===s.length-1){"/"===p[p.length-1]?(p=p.substr(0,p.length-1),s=p):s=s.substr(0,s.length-1);const e=new o(p,c,"");p!==s&&(e.attrsMap=d(s,t)),c.addChild(e)}else{const e=new o(p,c);t.stopNodes.length&&t.stopNodes.includes(e.tagname)&&(e.startIndex=a),p!==s&&(e.attrsMap=d(s,t)),c.addChild(e),c=e}f="",n=a}else f+=e[n]}return n}},function(e,t,n){"use strict";n.d(t,"a",(function(){return i})),n.d(t,"b",(function(){return o})),n.d(t,"c",(function(){return s}));var r="undefined"!=typeof Symbol&&"function"==typeof Symbol.for,i=r?Symbol.for("INTERNAL_AWS_APPSYNC_PUBSUB_PROVIDER"):"@@INTERNAL_AWS_APPSYNC_PUBSUB_PROVIDER",o=r?Symbol.for("INTERNAL_AWS_APPSYNC_REALTIME_PUBSUB_PROVIDER"):"@@INTERNAL_AWS_APPSYNC_REALTIME_PUBSUB_PROVIDER",s="x-amz-user-agent"},function(e,t,n){"use strict";n.d(t,"a",(function(){return _}));var r=n(44),i=n(148),o=n(28),s=n(16),a=n(77);function u(e){return(u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var c=function(){return(c=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]=r;if("+"!==s&&s!==a)return!1}return r===i.length})(r,e)&&n.push(t)}));var r=JSON.parse(t);"object"===h(r)&&(r[A]=e),n.forEach((function(e){e.forEach((function(e){return e.next(r)}))}))}catch(e){w.warn("Error handling message",e,t)}},t.prototype.subscribe=function(e,t){var n=this;void 0===t&&(t={});var i=[].concat(e);return w.debug("Subscribing to topic(s)",i.join(",")),new r.a((function(e){var r;i.forEach((function(t){var r=n._topicObservers.get(t);r||(r=new Set,n._topicObservers.set(t,r)),r.add(e)}));var o=t.clientId,s=void 0===o?n.clientId:o,a=n._clientIdObservers.get(s);return a||(a=new Set),a.add(e),n._clientIdObservers.set(s,a),m(n,void 0,void 0,(function(){var n,o,a,u;return b(this,(function(c){switch(c.label){case 0:return void 0!==(n=t.url)?[3,2]:[4,this.endpoint];case 1:return a=c.sent(),[3,3];case 2:a=n,c.label=3;case 3:o=a,c.label=4;case 4:return c.trys.push([4,6,,7]),[4,this.connect(s,{url:o})];case 5:return r=c.sent(),i.forEach((function(e){r.subscribe(e)})),[3,7];case 6:return u=c.sent(),e.error(u),[3,7];case 7:return[2]}}))})),function(){return w.debug("Unsubscribing from topic(s)",i.join(",")),r&&(n._clientIdObservers.get(s).delete(e),0===n._clientIdObservers.get(s).size&&(n.disconnect(s),n._clientIdObservers.delete(s)),i.forEach((function(t){var i=n._topicObservers.get(t)||new Set;i.delete(e),0===i.size&&(n._topicObservers.delete(t),r.isConnected()&&r.unsubscribe(t))}))),null}}))},t}(d),k=function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(t,n)};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),O=function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function s(e){try{u(r.next(e))}catch(e){o(e)}}function a(e){try{u(r.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}u((r=r.apply(e,t||[])).next())}))},x=function(e,t){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(i=s.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},P=function(){for(var e=[],t=0;t-1}));if(r){var i=r.client,o=r.url;e[i]||(e[i]={url:o,topics:new Set}),e[i].topics.add(t)}return e}),{})),[4,Promise.all(a.map((function(e){var t=T(e,2),n=t[0],i=t[1],o=i.url,s=i.topics;return O(u,void 0,void 0,(function(){var e,t,i=this;return x(this,(function(a){switch(a.label){case 0:e=null,a.label=1;case 1:return a.trys.push([1,3,,4]),[4,this.connect(n,{clientId:n,url:o})];case 2:return e=a.sent(),[3,4];case 3:return t=a.sent(),r.error({message:"Failed to connect",error:t}),r.complete(),[2,void 0];case 4:return s.forEach((function(t){e.isConnected()&&(e.subscribe(t),i._topicClient.set(t,e))})),[2,e]}}))}))})))];case 1:return c.sent(),[2]}}))})),function(){N.debug("Unsubscribing from topic(s)",i.join(",")),i.forEach((function(e){var t=n._topicClient.get(e);t&&t.isConnected()&&(t.unsubscribe(e),n._topicClient.delete(e),Array.from(n._topicClient.values()).some((function(e){return e===t}))||n.disconnect(t.clientId)),n._topicObservers.delete(e)}))}}));return r.a.from(i).map((function(e){var t=n.getTopicForValue(e),r=n._topicAlias.get(t);return e.data=Object.entries(e.data).reduce((function(e,t){var n=T(t,2),i=n[0],o=n[1];return e[r||i]=o,e}),{}),e}))},t}(I),L=n(91),j=n(16),D=n(6),U=n(88),B=n(5),F=n(514),z=n(89),q=n(104),K=n(26),H=n(42),V=n(34),G=function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(t,n)};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),W=function(){return(W=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},Z=new o.a("AWSAppSyncRealTimeProvider"),X="undefined"!=typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("amplify_default"):"@@amplify_default",Q=[400,401,403];!function(e){e.GQL_CONNECTION_INIT="connection_init",e.GQL_CONNECTION_ERROR="connection_error",e.GQL_CONNECTION_ACK="connection_ack",e.GQL_START="start",e.GQL_START_ACK="start_ack",e.GQL_DATA="data",e.GQL_CONNECTION_KEEP_ALIVE="ka",e.GQL_STOP="stop",e.GQL_COMPLETE="complete",e.GQL_ERROR="error"}(_||(_={})),function(e){e[e.PENDING=0]="PENDING",e[e.CONNECTED=1]="CONNECTED",e[e.FAILED=2]="FAILED"}(S||(S={})),function(e){e[e.CLOSED=0]="CLOSED",e[e.READY=1]="READY",e[e.CONNECTING=2]="CONNECTING"}(E||(E={}));var ee={accept:"application/json, text/javascript","content-encoding":"amz-1.0","content-type":"application/json; charset=UTF-8"},te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.socketStatus=E.CLOSED,t.keepAliveTimeout=3e5,t.subscriptionObserverMap=new Map,t.promiseArray=[],t}return G(t,e),t.prototype.getProviderName=function(){return"AWSAppSyncRealTimeProvider"},t.prototype.newClient=function(){throw new Error("Not used here")},t.prototype.publish=function(e,t,n){return $(this,void 0,void 0,(function(){return Y(this,(function(e){throw new Error("Operation not supported")}))}))},t.prototype.subscribe=function(e,t){var n=this,i=t.appSyncGraphqlEndpoint;return new r.a((function(e){if(i){var r=Object(c.v4)();return n._startSubscriptionWithAWSAppSyncRealTime({options:t,observer:e,subscriptionId:r}),function(){return $(n,void 0,void 0,(function(){var e,t;return Y(this,(function(n){switch(n.label){case 0:return n.trys.push([0,2,3,4]),[4,this._waitForSubscriptionToBeConnected(r)];case 1:if(n.sent(),!(e=(this.subscriptionObserverMap.get(r)||{}).subscriptionState))return[2];if(e!==S.CONNECTED)throw new Error("Subscription never connected");return this._sendUnsubscriptionMessage(r),[3,4];case 2:return t=n.sent(),Z.debug("Error while unsubscribing "+t),[3,4];case 3:return this._removeSubscriptionObserver(r),[7];case 4:return[2]}}))}))}}e.error({errors:[W({},new L.a("Subscribe only available for AWS AppSync endpoint"))]}),e.complete()}))},Object.defineProperty(t.prototype,"isSSLEnabled",{get:function(){return!this.options.aws_appsync_dangerously_connect_to_http_endpoint_for_testing},enumerable:!0,configurable:!0}),t.prototype._startSubscriptionWithAWSAppSyncRealTime=function(e){var t=e.options,n=e.observer,r=e.subscriptionId;return $(this,void 0,void 0,(function(){var e,i,o,a,u,c,f,l,d,h,p,v,g,m,b,y,w,E,M,A,I,k,O,x,C,T,P=this;return Y(this,(function(N){switch(N.label){case 0:return e=t.appSyncGraphqlEndpoint,i=t.authenticationType,o=t.query,a=t.variables,u=t.apiKey,c=t.region,f=t.graphql_headers,l=void 0===f?function(){return{}}:f,d=t.additionalHeaders,h=void 0===d?{}:d,p=S.PENDING,v={query:o,variables:a},this.subscriptionObserverMap.set(r,{observer:n,query:o,variables:a,subscriptionState:p,startAckTimeoutId:null}),g=JSON.stringify(v),b=[{}],[4,this._awsRealTimeHeaderBasedAuth({apiKey:u,appSyncGraphqlEndpoint:e,authenticationType:i,payload:g,canonicalUri:"",region:c})];case 1:return y=[W.apply(void 0,b.concat([N.sent()]))],[4,l()];case 2:m=W.apply(void 0,[W.apply(void 0,[W.apply(void 0,y.concat([N.sent()])),h]),(T={},T[s.c]=B.a.userAgent,T)]),w={id:r,payload:{data:g,extensions:{authorization:W({},m)}},type:_.GQL_START},E=JSON.stringify(w),N.label=3;case 3:return N.trys.push([3,5,,6]),[4,this._initializeWebSocketConnection({apiKey:u,appSyncGraphqlEndpoint:e,authenticationType:i,region:c})];case 4:return N.sent(),[3,6];case 5:return M=N.sent(),Z.debug({err:M}),A=M.message,I=void 0===A?"":A,n.error({errors:[W({},new L.a("Connection failed: "+I))]}),n.complete(),"function"==typeof(k=(this.subscriptionObserverMap.get(r)||{}).subscriptionFailedCallback)&&k(),[2];case 6:return O=this.subscriptionObserverMap.get(r),x=O.subscriptionFailedCallback,C=O.subscriptionReadyCallback,this.subscriptionObserverMap.set(r,{observer:n,subscriptionState:p,variables:a,query:o,subscriptionReadyCallback:C,subscriptionFailedCallback:x,startAckTimeoutId:setTimeout((function(){P._timeoutStartSubscriptionAck.call(P,r)}),15e3)}),this.awsRealTimeSocket&&this.awsRealTimeSocket.send(E),[2]}}))}))},t.prototype._waitForSubscriptionToBeConnected=function(e){return $(this,void 0,void 0,(function(){var t=this;return Y(this,(function(n){return this.subscriptionObserverMap.get(e).subscriptionState===S.PENDING?[2,new Promise((function(n,r){var i=t.subscriptionObserverMap.get(e),o=i.observer,s=i.subscriptionState,a=i.variables,u=i.query;t.subscriptionObserverMap.set(e,{observer:o,subscriptionState:s,variables:a,query:u,subscriptionReadyCallback:n,subscriptionFailedCallback:r})}))]:[2]}))}))},t.prototype._sendUnsubscriptionMessage=function(e){try{if(this.awsRealTimeSocket&&this.awsRealTimeSocket.readyState===WebSocket.OPEN&&this.socketStatus===E.READY){var t={id:e,type:_.GQL_STOP},n=JSON.stringify(t);this.awsRealTimeSocket.send(n)}}catch(e){Z.debug({err:e})}},t.prototype._removeSubscriptionObserver=function(e){this.subscriptionObserverMap.delete(e),setTimeout(this._closeSocketIfRequired.bind(this),1e3)},t.prototype._closeSocketIfRequired=function(){if(!(this.subscriptionObserverMap.size>0))if(this.awsRealTimeSocket)if(this.awsRealTimeSocket.bufferedAmount>0)setTimeout(this._closeSocketIfRequired.bind(this),1e3);else{Z.debug("closing WebSocket..."),clearTimeout(this.keepAliveTimeoutId);var e=this.awsRealTimeSocket;e.onclose=void 0,e.onerror=void 0,e.close(1e3),this.awsRealTimeSocket=null,this.socketStatus=E.CLOSED}else this.socketStatus=E.CLOSED},t.prototype._handleIncomingSubscriptionMessage=function(e){Z.debug("subscription message from AWS AppSync RealTime: "+e.data);var t=JSON.parse(e.data),n=t.id,r=void 0===n?"":n,i=t.payload,o=t.type,s=this.subscriptionObserverMap.get(r)||{},a=s.observer,u=void 0===a?null:a,c=s.query,f=void 0===c?"":c,l=s.variables,d=void 0===l?{}:l,h=s.startAckTimeoutId,p=s.subscriptionReadyCallback,v=s.subscriptionFailedCallback;if(Z.debug({id:r,observer:u,query:f,variables:d}),o===_.GQL_DATA&&i&&i.data)u?u.next(i):Z.debug("observer not found for id: "+r);else if(o!==_.GQL_START_ACK){if(o===_.GQL_CONNECTION_KEEP_ALIVE)return clearTimeout(this.keepAliveTimeoutId),void(this.keepAliveTimeoutId=setTimeout(this._errorDisconnect.bind(this,V.a.TIMEOUT_DISCONNECT),this.keepAliveTimeout));if(o===_.GQL_ERROR){g=S.FAILED;this.subscriptionObserverMap.set(r,{observer:u,query:f,variables:d,startAckTimeoutId:h,subscriptionReadyCallback:p,subscriptionFailedCallback:v,subscriptionState:g}),u.error({errors:[W({},new L.a("Connection failed: "+JSON.stringify(i)))]}),clearTimeout(h),u.complete(),"function"==typeof v&&v()}}else{Z.debug("subscription ready for "+JSON.stringify({query:f,variables:d})),"function"==typeof p&&p(),clearTimeout(h),function(e,t,n){U.a.dispatch("api",{event:e,data:t,message:n},"PubSub",X)}(V.a.SUBSCRIPTION_ACK,{query:f,variables:d},"Connection established for subscription");var g=S.CONNECTED;this.subscriptionObserverMap.set(r,{observer:u,query:f,variables:d,startAckTimeoutId:null,subscriptionState:g,subscriptionReadyCallback:p,subscriptionFailedCallback:v})}},t.prototype._errorDisconnect=function(e){Z.debug("Disconnect error: "+e),this.subscriptionObserverMap.forEach((function(t){var n=t.observer;n&&!n.closed&&n.error({errors:[W({},new L.a(e))]})})),this.subscriptionObserverMap.clear(),this.awsRealTimeSocket&&this.awsRealTimeSocket.close(),this.socketStatus=E.CLOSED},t.prototype._timeoutStartSubscriptionAck=function(e){var t=this.subscriptionObserverMap.get(e)||{},n=t.observer,r=t.query,i=t.variables;n&&(this.subscriptionObserverMap.set(e,{observer:n,query:r,variables:i,subscriptionState:S.FAILED}),n&&!n.closed&&(n.error({errors:[W({},new L.a("Subscription timeout "+JSON.stringify({query:r,variables:i})))]}),n.complete()),Z.debug("timeoutStartSubscription",JSON.stringify({query:r,variables:i})))},t.prototype._initializeWebSocketConnection=function(e){var t=this,n=e.appSyncGraphqlEndpoint,r=e.authenticationType,i=e.apiKey,o=e.region;if(this.socketStatus!==E.READY)return new Promise((function(e,s){return $(t,void 0,void 0,(function(){var t,a,u,c,f,l,d,h,p,v;return Y(this,(function(g){switch(g.label){case 0:if(this.promiseArray.push({res:e,rej:s}),this.socketStatus!==E.CLOSED)return[3,5];g.label=1;case 1:return g.trys.push([1,4,,5]),this.socketStatus=E.CONNECTING,t=this.isSSLEnabled?"wss://":"ws://",a=n.replace("https://",t).replace("http://",t).replace("appsync-api","appsync-realtime-api").replace("gogi-beta","grt-beta"),u="{}",l=(f=JSON).stringify,[4,this._awsRealTimeHeaderBasedAuth({authenticationType:r,payload:u,canonicalUri:"/connect",apiKey:i,appSyncGraphqlEndpoint:n,region:o})];case 2:return c=l.apply(f,[g.sent()]),d=D.Buffer.from(c).toString("base64"),h=D.Buffer.from(u).toString("base64"),p=a+"?header="+d+"&payload="+h,[4,this._initializeRetryableHandshake({awsRealTimeUrl:p})];case 3:return g.sent(),this.promiseArray.forEach((function(e){var t=e.res;Z.debug("Notifying connection successful"),t()})),this.socketStatus=E.READY,this.promiseArray=[],[3,5];case 4:return v=g.sent(),this.promiseArray.forEach((function(e){return(0,e.rej)(v)})),this.promiseArray=[],this.awsRealTimeSocket&&this.awsRealTimeSocket.readyState===WebSocket.OPEN&&this.awsRealTimeSocket.close(3001),this.awsRealTimeSocket=null,this.socketStatus=E.CLOSED,[3,5];case 5:return[2]}}))}))}))},t.prototype._initializeRetryableHandshake=function(e){var t=e.awsRealTimeUrl;return $(this,void 0,void 0,(function(){return Y(this,(function(e){switch(e.label){case 0:return Z.debug("Initializaling retryable Handshake"),[4,Object(F.b)(this._initializeHandshake.bind(this),[{awsRealTimeUrl:t}],5e3)];case 1:return e.sent(),[2]}}))}))},t.prototype._initializeHandshake=function(e){var t=e.awsRealTimeUrl;return $(this,void 0,void 0,(function(){var e,n,r,i=this;return Y(this,(function(o){switch(o.label){case 0:Z.debug("Initializing handshake "+t),o.label=1;case 1:return o.trys.push([1,4,,5]),[4,new Promise((function(e,n){var r=new WebSocket(t,"graphql-ws");r.onerror=function(){Z.debug("WebSocket connection error")},r.onclose=function(){n(new Error("Connection handshake error"))},r.onopen=function(){return i.awsRealTimeSocket=r,e()}}))];case 2:return o.sent(),[4,new Promise((function(e,t){var n=!1;i.awsRealTimeSocket.onerror=function(e){Z.debug("WebSocket error "+JSON.stringify(e))},i.awsRealTimeSocket.onclose=function(e){Z.debug("WebSocket closed "+e.reason),t(new Error(JSON.stringify(e)))},i.awsRealTimeSocket.onmessage=function(r){Z.debug("subscription message from AWS AppSyncRealTime: "+r.data+" ");var o=JSON.parse(r.data),s=o.type,a=o.payload,u=(void 0===a?{}:a).connectionTimeoutMs,c=void 0===u?3e5:u;if(s===_.GQL_CONNECTION_ACK)return n=!0,i.keepAliveTimeout=c,i.awsRealTimeSocket.onmessage=i._handleIncomingSubscriptionMessage.bind(i),i.awsRealTimeSocket.onerror=function(e){Z.debug(e),i._errorDisconnect(V.a.CONNECTION_CLOSED)},i.awsRealTimeSocket.onclose=function(e){Z.debug("WebSocket closed "+e.reason),i._errorDisconnect(V.a.CONNECTION_CLOSED)},void e("Cool, connected to AWS AppSyncRealTime");if(s===_.GQL_CONNECTION_ERROR){var f=o.payload,l=(void 0===f?{}:f).errors,d=J(void 0===l?[]:l,1)[0],h=void 0===d?{}:d,p=h.errorType,v=void 0===p?"":p,g=h.errorCode;t({errorType:v,errorCode:void 0===g?0:g})}};var r={type:_.GQL_CONNECTION_INIT};i.awsRealTimeSocket.send(JSON.stringify(r)),setTimeout(function(){n||t(new Error("Connection timeout: ack from AWSRealTime was not received on 15000 ms"))}.bind(i),15e3)}))];case 3:return o.sent(),[3,5];case 4:throw e=o.sent(),n=e.errorType,r=e.errorCode,Q.includes(r)?new F.a(n):n?new Error(n):e;case 5:return[2]}}))}))},t.prototype._awsRealTimeHeaderBasedAuth=function(e){var t=e.authenticationType,n=e.payload,r=e.canonicalUri,i=e.appSyncGraphqlEndpoint,o=e.apiKey,s=e.region;return $(this,void 0,void 0,(function(){var e,a,u;return Y(this,(function(c){switch(c.label){case 0:return e={API_KEY:this._awsRealTimeApiKeyHeader.bind(this),AWS_IAM:this._awsRealTimeIAMHeader.bind(this),OPENID_CONNECT:this._awsRealTimeOPENIDHeader.bind(this),AMAZON_COGNITO_USER_POOLS:this._awsRealTimeCUPHeader.bind(this)},"function"!=typeof(a=e[t])?(Z.debug("Authentication type "+t+" not supported"),[2,""]):(u=j.parse(i).host,[4,a({payload:n,canonicalUri:r,appSyncGraphqlEndpoint:i,apiKey:o,region:s,host:u})]);case 1:return[2,c.sent()]}}))}))},t.prototype._awsRealTimeCUPHeader=function(e){var t=e.host;return $(this,void 0,void 0,(function(){return Y(this,(function(e){switch(e.label){case 0:return[4,H.a.currentSession()];case 1:return[2,{Authorization:e.sent().getAccessToken().getJwtToken(),host:t}]}}))}))},t.prototype._awsRealTimeOPENIDHeader=function(e){var t=e.host;return $(this,void 0,void 0,(function(){var e,n,r;return Y(this,(function(i){switch(i.label){case 0:return[4,K.a.getItem("federatedInfo")];case 1:return(n=i.sent())?(e=n.token,[3,4]):[3,2];case 2:return[4,H.a.currentAuthenticatedUser()];case 3:(r=i.sent())&&(e=r.token),i.label=4;case 4:if(!e)throw new Error("No federated jwt");return[2,{Authorization:e,host:t}]}}))}))},t.prototype._awsRealTimeApiKeyHeader=function(e){var t=e.apiKey,n=e.host;return $(this,void 0,void 0,(function(){var e,r;return Y(this,(function(i){return e=new Date,r=e.toISOString().replace(/[:\-]|\.\d{3}/g,""),[2,{host:n,"x-amz-date":r,"x-api-key":t}]}))}))},t.prototype._awsRealTimeIAMHeader=function(e){var t=e.payload,n=e.canonicalUri,r=e.appSyncGraphqlEndpoint,i=e.region;return $(this,void 0,void 0,(function(){var e,o,s;return Y(this,(function(a){switch(a.label){case 0:return e={region:i,service:"appsync"},[4,this._ensureCredentials()];case 1:if(!a.sent())throw new Error("No credentials");return[4,z.a.get().then((function(e){return{secret_key:e.secretAccessKey,access_key:e.accessKeyId,session_token:e.sessionToken}}))];case 2:return o=a.sent(),s={url:""+r+n,data:t,method:"POST",headers:W({},ee)},[2,q.a.sign(s,o,e).headers]}}))}))},t.prototype._ensureCredentials=function(){return z.a.get().then((function(e){if(!e)return!1;var t=z.a.shear(e);return Z.debug("set credentials for AWSAppSyncRealTimeProvider",t),!0})).catch((function(e){return Z.warn("ensure credentials error",e),!1}))},t}(d),ne=function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function s(e){try{u(r.next(e))}catch(e){o(e)}}function a(e){try{u(r.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}u((r=r.apply(e,t||[])).next())}))},re=function(e,t){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(i=s.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]>>8^o[255&(this.checksum^a)]}}catch(e){t={error:e}}finally{try{s&&!s.done&&(n=i.return)&&n.call(i)}finally{if(t)throw t.error}}return this},e.prototype.digest=function(){return(4294967295^this.checksum)>>>0},e}();t.Crc32=i;var o=Uint32Array.from([0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117])},function(e,t,n){var r=n(431);e.exports=function(e,t){return r(e,t)}},function(e,t,n){var r=n(483),i=n(484),o=i;o.v1=r,o.v4=i,e.exports=o},function(e,t,n){"use strict";n.d(t,"a",(function(){return M}));var r=n(107),i=n(1),o=n(28),s=function(){function e(e){if(this.bytes=e,8!==e.byteLength)throw new Error("Int64 buffers must be exactly 8 bytes")}return e.fromNumber=function(t){if(t>0x8000000000000000||t<-0x8000000000000000)throw new Error(t+" is too large (or, if negative, too small) to represent as an Int64");for(var n=new Uint8Array(8),r=7,i=Math.abs(Math.round(t));r>-1&&i>0;r--,i/=256)n[r]=i;return t<0&&a(n),new e(n)},e.prototype.valueOf=function(){var e=this.bytes.slice(0),t=128&e[0];return t&&a(e),parseInt(Object(o.b)(e),16)*(t?-1:1)},e.prototype.toString=function(){return String(this.valueOf())},e}();function a(e){for(var t=0;t<8;t++)e[t]^=255;for(t=7;t>-1&&(e[t]++,0===e[t]);t--);}var u,c=function(){function e(e,t){this.toUtf8=e,this.fromUtf8=t}return e.prototype.format=function(e){var t,n,r,o,s=[];try{for(var a=Object(i.__values)(Object.keys(e)),u=a.next();!u.done;u=a.next()){var c=u.value,f=this.fromUtf8(c);s.push(Uint8Array.from([f.byteLength]),f,this.formatHeaderValue(e[c]))}}catch(e){t={error:e}}finally{try{u&&!u.done&&(n=a.return)&&n.call(a)}finally{if(t)throw t.error}}var l=new Uint8Array(s.reduce((function(e,t){return e+t.byteLength}),0)),d=0;try{for(var h=Object(i.__values)(s),p=h.next();!p.done;p=h.next()){var v=p.value;l.set(v,d),d+=v.byteLength}}catch(e){r={error:e}}finally{try{p&&!p.done&&(o=h.return)&&o.call(h)}finally{if(r)throw r.error}}return l},e.prototype.formatHeaderValue=function(e){switch(e.type){case"boolean":return Uint8Array.from([e.value?0:1]);case"byte":return Uint8Array.from([2,e.value]);case"short":var t=new DataView(new ArrayBuffer(3));return t.setUint8(0,3),t.setInt16(1,e.value,!1),new Uint8Array(t.buffer);case"integer":var n=new DataView(new ArrayBuffer(5));return n.setUint8(0,4),n.setInt32(1,e.value,!1),new Uint8Array(n.buffer);case"long":var r=new Uint8Array(9);return r[0]=5,r.set(e.value.bytes,1),r;case"binary":var i=new DataView(new ArrayBuffer(3+e.value.byteLength));i.setUint8(0,6),i.setUint16(1,e.value.byteLength,!1);var a=new Uint8Array(i.buffer);return a.set(e.value,3),a;case"string":var u=this.fromUtf8(e.value),c=new DataView(new ArrayBuffer(3+u.byteLength));c.setUint8(0,7),c.setUint16(1,u.byteLength,!1);var f=new Uint8Array(c.buffer);return f.set(u,3),f;case"timestamp":var l=new Uint8Array(9);return l[0]=8,l.set(s.fromNumber(e.value.valueOf()).bytes,1),l;case"uuid":if(!y.test(e.value))throw new Error("Invalid UUID received: "+e.value);var d=new Uint8Array(17);return d[0]=9,d.set(Object(o.a)(e.value.replace(/\-/g,"")),1),d}},e.prototype.parse=function(e){for(var t={},n=0;n-1&&delete e.headers[a]}}catch(e){t={error:e}}finally{try{s&&!s.done&&(n=i.return)&&n.call(i)}finally{if(t)throw t.error}}return e}function E(e){return function(e){if("number"==typeof e)return new Date(1e3*e);if("string"==typeof e)return Number(e)?new Date(1e3*Number(e)):new Date(e);return e}(e).toISOString().replace(/\.\d{3}Z$/,"Z")}var M=function(){function e(e){var t=e.applyChecksum,n=e.credentials,r=e.region,i=e.service,o=e.sha256,s=e.uriEscapePath,a=void 0===s||s;this.service=i,this.sha256=o,this.uriEscapePath=a,this.applyChecksum="boolean"!=typeof t||t,this.regionProvider=k(r),this.credentialProvider=O(n)}return e.prototype.presign=function(e,t){return void 0===t&&(t={}),Object(r.__awaiter)(this,void 0,void 0,(function(){var n,i,o,s,a,u,c,f,l,d,h,v,m,b,_,E,M,k,O,x,C,T,P;return Object(r.__generator)(this,(function(N){switch(N.label){case 0:return n=t.signingDate,i=void 0===n?new Date:n,o=t.expiresIn,s=void 0===o?3600:o,a=t.unsignableHeaders,u=t.signableHeaders,c=t.signingRegion,f=t.signingService,[4,this.credentialProvider()];case 1:return l=N.sent(),null==c?[3,2]:(h=c,[3,4]);case 2:return[4,this.regionProvider()];case 3:h=N.sent(),N.label=4;case 4:return d=h,v=A(i),m=v.longDate,b=v.shortDate,s>604800?[2,Promise.reject("Signature version 4 presigned URLs must have an expiration date less than one week in the future")]:(_=p(b,d,null!=f?f:this.service),E=function(e){var t,n,i="function"==typeof e.clone?e.clone():w(e),o=i.headers,s=i.query,a=void 0===s?{}:s;try{for(var u=Object(r.__values)(Object.keys(o)),c=u.next();!c.done;c=u.next()){var f=c.value;"x-amz-"===f.toLowerCase().substr(0,6)&&(a[f]=o[f],delete o[f])}}catch(e){t={error:e}}finally{try{c&&!c.done&&(n=u.return)&&n.call(u)}finally{if(t)throw t.error}}return Object(r.__assign)(Object(r.__assign)({},e),{headers:o,query:a})}(S(e)),l.sessionToken&&(E.query["X-Amz-Security-Token"]=l.sessionToken),E.query["X-Amz-Algorithm"]="AWS4-HMAC-SHA256",E.query["X-Amz-Credential"]=l.accessKeyId+"/"+_,E.query["X-Amz-Date"]=m,E.query["X-Amz-Expires"]=s.toString(10),M=g(E,a,u),E.query["X-Amz-SignedHeaders"]=I(M),k=E.query,O="X-Amz-Signature",x=this.getSignature,C=[m,_,this.getSigningKey(l,d,b,f)],T=this.createCanonicalRequest,P=[E,M],[4,y(e,this.sha256)]);case 5:return[4,x.apply(this,C.concat([T.apply(this,P.concat([N.sent()]))]))];case 6:return k[O]=N.sent(),[2,E]}}))}))},e.prototype.sign=function(e,t){return Object(r.__awaiter)(this,void 0,void 0,(function(){return Object(r.__generator)(this,(function(n){return"string"==typeof e?[2,this.signString(e,t)]:e.headers&&e.payload?[2,this.signEvent(e,t)]:[2,this.signRequest(e,t)]}))}))},e.prototype.signEvent=function(e,t){var n=e.headers,i=e.payload,o=t.signingDate,s=void 0===o?new Date:o,a=t.priorSignature,u=t.signingRegion,c=t.signingService;return Object(r.__awaiter)(this,void 0,void 0,(function(){var e,t,o,f,d,h,g,m,b,w,_;return Object(r.__generator)(this,(function(r){switch(r.label){case 0:return null==u?[3,1]:(t=u,[3,3]);case 1:return[4,this.regionProvider()];case 2:t=r.sent(),r.label=3;case 3:return e=t,o=A(s),f=o.shortDate,d=o.longDate,h=p(f,e,null!=c?c:this.service),[4,y({headers:{},body:i},this.sha256)];case 4:return g=r.sent(),(m=new this.sha256).update(n),w=v.b,[4,m.digest()];case 5:return b=w.apply(void 0,[r.sent()]),_=[l,d,h,a,b,g].join("\n"),[2,this.signString(_,{signingDate:s,signingRegion:e,signingService:c})]}}))}))},e.prototype.signString=function(e,t){var n=void 0===t?{}:t,i=n.signingDate,o=void 0===i?new Date:i,s=n.signingRegion,a=n.signingService;return Object(r.__awaiter)(this,void 0,void 0,(function(){var t,n,i,u,c,f,l,d;return Object(r.__generator)(this,(function(r){switch(r.label){case 0:return[4,this.credentialProvider()];case 1:return t=r.sent(),null==s?[3,2]:(i=s,[3,4]);case 2:return[4,this.regionProvider()];case 3:i=r.sent(),r.label=4;case 4:return n=i,u=A(o).shortDate,l=(f=this.sha256).bind,[4,this.getSigningKey(t,n,u,a)];case 5:return(c=new(l.apply(f,[void 0,r.sent()]))).update(e),d=v.b,[4,c.digest()];case 6:return[2,d.apply(void 0,[r.sent()])]}}))}))},e.prototype.signRequest=function(e,t){var n=void 0===t?{}:t,o=n.signingDate,s=void 0===o?new Date:o,u=n.signableHeaders,c=n.unsignableHeaders,f=n.signingRegion,l=n.signingService;return Object(r.__awaiter)(this,void 0,void 0,(function(){var t,n,o,d,h,v,m,b,w,_,E;return Object(r.__generator)(this,(function(M){switch(M.label){case 0:return[4,this.credentialProvider()];case 1:return t=M.sent(),null==f?[3,2]:(o=f,[3,4]);case 2:return[4,this.regionProvider()];case 3:o=M.sent(),M.label=4;case 4:return n=o,d=S(e),h=A(s),v=h.longDate,m=h.shortDate,b=p(m,n,null!=l?l:this.service),d.headers[i]=v,t.sessionToken&&(d.headers[a]=t.sessionToken),[4,y(d,this.sha256)];case 5:return w=M.sent(),!function(e,t){var n,i;e=e.toLowerCase();try{for(var o=Object(r.__values)(Object.keys(t)),s=o.next();!s.done;s=o.next()){if(e===s.value.toLowerCase())return!0}}catch(e){n={error:e}}finally{try{s&&!s.done&&(i=o.return)&&i.call(o)}finally{if(n)throw n.error}}return!1}("x-amz-content-sha256",d.headers)&&this.applyChecksum&&(d.headers["x-amz-content-sha256"]=w),_=g(d,c,u),[4,this.getSignature(v,b,this.getSigningKey(t,n,m,l),this.createCanonicalRequest(d,_,w))];case 6:return E=M.sent(),d.headers.authorization="AWS4-HMAC-SHA256 Credential="+t.accessKeyId+"/"+b+", SignedHeaders="+I(_)+", Signature="+E,[2,d]}}))}))},e.prototype.createCanonicalRequest=function(e,t,n){var i=Object.keys(t).sort();return e.method+"\n"+this.getCanonicalPath(e)+"\n"+function(e){var t,n,i=e.query,o=void 0===i?{}:i,a=[],u={},c=function(e){if(e.toLowerCase()===s)return"continue";a.push(e);var t=o[e];"string"==typeof t?u[e]=Object(m.a)(e)+"="+Object(m.a)(t):Array.isArray(t)&&(u[e]=t.slice(0).sort().reduce((function(t,n){return t.concat([Object(m.a)(e)+"="+Object(m.a)(n)])}),[]).join("&"))};try{for(var f=Object(r.__values)(Object.keys(o).sort()),l=f.next();!l.done;l=f.next()){c(l.value)}}catch(e){t={error:e}}finally{try{l&&!l.done&&(n=f.return)&&n.call(f)}finally{if(t)throw t.error}}return a.map((function(e){return u[e]})).filter((function(e){return e})).join("&")}(e)+"\n"+i.map((function(e){return e+":"+t[e]})).join("\n")+"\n\n"+i.join(";")+"\n"+n},e.prototype.createStringToSign=function(e,t,n){return Object(r.__awaiter)(this,void 0,void 0,(function(){var i,o;return Object(r.__generator)(this,(function(r){switch(r.label){case 0:return(i=new this.sha256).update(n),[4,i.digest()];case 1:return o=r.sent(),[2,"AWS4-HMAC-SHA256\n"+e+"\n"+t+"\n"+Object(v.b)(o)]}}))}))},e.prototype.getCanonicalPath=function(e){var t=e.path;return this.uriEscapePath?"/"+encodeURIComponent(t.replace(/^\//,"")).replace(/%2F/g,"/"):t},e.prototype.getSignature=function(e,t,n,i){return Object(r.__awaiter)(this,void 0,void 0,(function(){var o,s,a,u,c;return Object(r.__generator)(this,(function(r){switch(r.label){case 0:return[4,this.createStringToSign(e,t,i)];case 1:return o=r.sent(),u=(a=this.sha256).bind,[4,n];case 2:return(s=new(u.apply(a,[void 0,r.sent()]))).update(o),c=v.b,[4,s.digest()];case 3:return[2,c.apply(void 0,[r.sent()])]}}))}))},e.prototype.getSigningKey=function(e,t,n,i){return function(e,t,n,i,o){var s=n+":"+i+":"+o+":"+t.accessKeyId+":"+t.sessionToken;if(s in d)return d[s];for(h.push(s);h.length>50;)delete d[h.shift()];return d[s]=new Promise((function(a,u){var c,f,l=Promise.resolve("AWS4"+t.secretAccessKey),h=function(t){(l=l.then((function(n){return r=t,(i=new e(n)).update(r),i.digest();var r,i}))).catch((function(){}))};try{for(var p=Object(r.__values)([n,i,o,"aws4_request"]),v=p.next();!v.done;v=p.next()){h(v.value)}}catch(e){c={error:e}}finally{try{v&&!v.done&&(f=p.return)&&f.call(p)}finally{if(c)throw c.error}}l.then(a,(function(e){delete d[s],u(e)}))}))}(this.sha256,e,n,t,i||this.service)},e}(),A=function(e){var t=E(e).replace(/[\-:]/g,"");return{longDate:t,shortDate:t.substr(0,8)}},I=function(e){return Object.keys(e).sort().join(";")},k=function(e){if("string"==typeof e){var t=Promise.resolve(e);return function(){return t}}return e},O=function(e){if("object"==typeof e){var t=Promise.resolve(e);return function(){return t}}return e}},function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var r=n(1),i=function(e){return Object(r.__assign)(Object(r.__assign)({},e),{eventStreamMarshaller:e.eventStreamSerdeProvider(e)})}},function(e,t,n){"use strict";var r=n(7),i=n(162),o=n(8).Buffer,s=new Array(16);function a(){i.call(this,64),this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878}function u(e,t){return e<>>32-t}function c(e,t,n,r,i,o,s){return u(e+(t&n|~t&r)+i+o|0,s)+t|0}function f(e,t,n,r,i,o,s){return u(e+(t&r|n&~r)+i+o|0,s)+t|0}function l(e,t,n,r,i,o,s){return u(e+(t^n^r)+i+o|0,s)+t|0}function d(e,t,n,r,i,o,s){return u(e+(n^(t|~r))+i+o|0,s)+t|0}r(a,i),a.prototype._update=function(){for(var e=s,t=0;t<16;++t)e[t]=this._block.readInt32LE(4*t);var n=this._a,r=this._b,i=this._c,o=this._d;n=c(n,r,i,o,e[0],3614090360,7),o=c(o,n,r,i,e[1],3905402710,12),i=c(i,o,n,r,e[2],606105819,17),r=c(r,i,o,n,e[3],3250441966,22),n=c(n,r,i,o,e[4],4118548399,7),o=c(o,n,r,i,e[5],1200080426,12),i=c(i,o,n,r,e[6],2821735955,17),r=c(r,i,o,n,e[7],4249261313,22),n=c(n,r,i,o,e[8],1770035416,7),o=c(o,n,r,i,e[9],2336552879,12),i=c(i,o,n,r,e[10],4294925233,17),r=c(r,i,o,n,e[11],2304563134,22),n=c(n,r,i,o,e[12],1804603682,7),o=c(o,n,r,i,e[13],4254626195,12),i=c(i,o,n,r,e[14],2792965006,17),n=f(n,r=c(r,i,o,n,e[15],1236535329,22),i,o,e[1],4129170786,5),o=f(o,n,r,i,e[6],3225465664,9),i=f(i,o,n,r,e[11],643717713,14),r=f(r,i,o,n,e[0],3921069994,20),n=f(n,r,i,o,e[5],3593408605,5),o=f(o,n,r,i,e[10],38016083,9),i=f(i,o,n,r,e[15],3634488961,14),r=f(r,i,o,n,e[4],3889429448,20),n=f(n,r,i,o,e[9],568446438,5),o=f(o,n,r,i,e[14],3275163606,9),i=f(i,o,n,r,e[3],4107603335,14),r=f(r,i,o,n,e[8],1163531501,20),n=f(n,r,i,o,e[13],2850285829,5),o=f(o,n,r,i,e[2],4243563512,9),i=f(i,o,n,r,e[7],1735328473,14),n=l(n,r=f(r,i,o,n,e[12],2368359562,20),i,o,e[5],4294588738,4),o=l(o,n,r,i,e[8],2272392833,11),i=l(i,o,n,r,e[11],1839030562,16),r=l(r,i,o,n,e[14],4259657740,23),n=l(n,r,i,o,e[1],2763975236,4),o=l(o,n,r,i,e[4],1272893353,11),i=l(i,o,n,r,e[7],4139469664,16),r=l(r,i,o,n,e[10],3200236656,23),n=l(n,r,i,o,e[13],681279174,4),o=l(o,n,r,i,e[0],3936430074,11),i=l(i,o,n,r,e[3],3572445317,16),r=l(r,i,o,n,e[6],76029189,23),n=l(n,r,i,o,e[9],3654602809,4),o=l(o,n,r,i,e[12],3873151461,11),i=l(i,o,n,r,e[15],530742520,16),n=d(n,r=l(r,i,o,n,e[2],3299628645,23),i,o,e[0],4096336452,6),o=d(o,n,r,i,e[7],1126891415,10),i=d(i,o,n,r,e[14],2878612391,15),r=d(r,i,o,n,e[5],4237533241,21),n=d(n,r,i,o,e[12],1700485571,6),o=d(o,n,r,i,e[3],2399980690,10),i=d(i,o,n,r,e[10],4293915773,15),r=d(r,i,o,n,e[1],2240044497,21),n=d(n,r,i,o,e[8],1873313359,6),o=d(o,n,r,i,e[15],4264355552,10),i=d(i,o,n,r,e[6],2734768916,15),r=d(r,i,o,n,e[13],1309151649,21),n=d(n,r,i,o,e[4],4149444226,6),o=d(o,n,r,i,e[11],3174756917,10),i=d(i,o,n,r,e[2],718787259,15),r=d(r,i,o,n,e[9],3951481745,21),this._a=this._a+n|0,this._b=this._b+r|0,this._c=this._c+i|0,this._d=this._d+o|0},a.prototype._digest=function(){this._block[this._blockOffset++]=128,this._blockOffset>56&&(this._block.fill(0,this._blockOffset,64),this._update(),this._blockOffset=0),this._block.fill(0,this._blockOffset,56),this._block.writeUInt32LE(this._length[0],56),this._block.writeUInt32LE(this._length[1],60),this._update();var e=o.allocUnsafe(16);return e.writeInt32LE(this._a,0),e.writeInt32LE(this._b,4),e.writeInt32LE(this._c,8),e.writeInt32LE(this._d,12),e},e.exports=a},function(e,t,n){(function(t){function n(e){try{if(!t.localStorage)return!1}catch(e){return!1}var n=t.localStorage[e];return null!=n&&"true"===String(n).toLowerCase()}e.exports=function(e,t){if(n("noDeprecation"))return e;var r=!1;return function(){if(!r){if(n("throwDeprecation"))throw new Error(t);n("traceDeprecation")?console.trace(t):console.warn(t),r=!0}return e.apply(this,arguments)}}}).call(this,n(31))},function(e,t,n){"use strict";var r=n(67).codes.ERR_STREAM_PREMATURE_CLOSE;function i(){}e.exports=function e(t,n,o){if("function"==typeof n)return e(t,null,n);n||(n={}),o=function(e){var t=!1;return function(){if(!t){t=!0;for(var n=arguments.length,r=new Array(n),i=0;i>>32-t}function v(e,t,n,r,i,o,s,a){return p(e+(t^n^r)+o+s|0,a)+i|0}function g(e,t,n,r,i,o,s,a){return p(e+(t&n|~t&r)+o+s|0,a)+i|0}function m(e,t,n,r,i,o,s,a){return p(e+((t|~n)^r)+o+s|0,a)+i|0}function b(e,t,n,r,i,o,s,a){return p(e+(t&r|n&~r)+o+s|0,a)+i|0}function y(e,t,n,r,i,o,s,a){return p(e+(t^(n|~r))+o+s|0,a)+i|0}i(h,o),h.prototype._update=function(){for(var e=s,t=0;t<16;++t)e[t]=this._block.readInt32LE(4*t);for(var n=0|this._a,r=0|this._b,i=0|this._c,o=0|this._d,h=0|this._e,w=0|this._a,_=0|this._b,S=0|this._c,E=0|this._d,M=0|this._e,A=0;A<80;A+=1){var I,k;A<16?(I=v(n,r,i,o,h,e[a[A]],l[0],c[A]),k=y(w,_,S,E,M,e[u[A]],d[0],f[A])):A<32?(I=g(n,r,i,o,h,e[a[A]],l[1],c[A]),k=b(w,_,S,E,M,e[u[A]],d[1],f[A])):A<48?(I=m(n,r,i,o,h,e[a[A]],l[2],c[A]),k=m(w,_,S,E,M,e[u[A]],d[2],f[A])):A<64?(I=b(n,r,i,o,h,e[a[A]],l[3],c[A]),k=g(w,_,S,E,M,e[u[A]],d[3],f[A])):(I=y(n,r,i,o,h,e[a[A]],l[4],c[A]),k=v(w,_,S,E,M,e[u[A]],d[4],f[A])),n=h,h=o,o=p(i,10),i=r,r=I,w=M,M=E,E=p(S,10),S=_,_=k}var O=this._b+i+E|0;this._b=this._c+o+M|0,this._c=this._d+h+w|0,this._d=this._e+n+_|0,this._e=this._a+r+S|0,this._a=O},h.prototype._digest=function(){this._block[this._blockOffset++]=128,this._blockOffset>56&&(this._block.fill(0,this._blockOffset,64),this._update(),this._blockOffset=0),this._block.fill(0,this._blockOffset,56),this._block.writeUInt32LE(this._length[0],56),this._block.writeUInt32LE(this._length[1],60),this._update();var e=r.alloc?r.alloc(20):new r(20);return e.writeInt32LE(this._a,0),e.writeInt32LE(this._b,4),e.writeInt32LE(this._c,8),e.writeInt32LE(this._d,12),e.writeInt32LE(this._e,16),e},e.exports=h},function(e,t,n){(t=e.exports=function(e){e=e.toLowerCase();var n=t[e];if(!n)throw new Error(e+" is not supported (we accept pull requests)");return new n}).sha=n(281),t.sha1=n(282),t.sha224=n(283),t.sha256=n(169),t.sha384=n(284),t.sha512=n(170)},function(e,t,n){(t=e.exports=n(171)).Stream=t,t.Readable=t,t.Writable=n(120),t.Duplex=n(60),t.Transform=n(174),t.PassThrough=n(291)},function(e,t,n){var r=n(6),i=r.Buffer;function o(e,t){for(var n in e)t[n]=e[n]}function s(e,t,n){return i(e,t,n)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?e.exports=r:(o(r,t),t.Buffer=s),o(i,s),s.from=function(e,t,n){if("number"==typeof e)throw new TypeError("Argument must not be a number");return i(e,t,n)},s.alloc=function(e,t,n){if("number"!=typeof e)throw new TypeError("Argument must be a number");var r=i(e);return void 0!==t?"string"==typeof n?r.fill(t,n):r.fill(t):r.fill(0),r},s.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return i(e)},s.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return r.SlowBuffer(e)}},function(e,t,n){"use strict";(function(t,r,i){var o=n(92);function s(e){var t=this;this.next=null,this.entry=null,this.finish=function(){!function(e,t,n){var r=e.entry;e.entry=null;for(;r;){var i=r.callback;t.pendingcb--,i(n),r=r.next}t.corkedRequestsFree?t.corkedRequestsFree.next=e:t.corkedRequestsFree=e}(t,e)}}e.exports=b;var a,u=!t.browser&&["v0.10","v0.9."].indexOf(t.version.slice(0,5))>-1?r:o.nextTick;b.WritableState=m;var c=Object.create(n(80));c.inherits=n(7);var f={deprecate:n(114)},l=n(172),d=n(119).Buffer,h=i.Uint8Array||function(){};var p,v=n(173);function g(){}function m(e,t){a=a||n(60),e=e||{};var r=t instanceof a;this.objectMode=!!e.objectMode,r&&(this.objectMode=this.objectMode||!!e.writableObjectMode);var i=e.highWaterMark,c=e.writableHighWaterMark,f=this.objectMode?16:16384;this.highWaterMark=i||0===i?i:r&&(c||0===c)?c:f,this.highWaterMark=Math.floor(this.highWaterMark),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var l=!1===e.decodeStrings;this.decodeStrings=!l,this.defaultEncoding=e.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(e){!function(e,t){var n=e._writableState,r=n.sync,i=n.writecb;if(function(e){e.writing=!1,e.writecb=null,e.length-=e.writelen,e.writelen=0}(n),t)!function(e,t,n,r,i){--t.pendingcb,n?(o.nextTick(i,r),o.nextTick(M,e,t),e._writableState.errorEmitted=!0,e.emit("error",r)):(i(r),e._writableState.errorEmitted=!0,e.emit("error",r),M(e,t))}(e,n,r,t,i);else{var s=S(n);s||n.corked||n.bufferProcessing||!n.bufferedRequest||_(e,n),r?u(w,e,n,s,i):w(e,n,s,i)}}(t,e)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new s(this)}function b(e){if(a=a||n(60),!(p.call(b,this)||this instanceof a))return new b(e);this._writableState=new m(e,this),this.writable=!0,e&&("function"==typeof e.write&&(this._write=e.write),"function"==typeof e.writev&&(this._writev=e.writev),"function"==typeof e.destroy&&(this._destroy=e.destroy),"function"==typeof e.final&&(this._final=e.final)),l.call(this)}function y(e,t,n,r,i,o,s){t.writelen=r,t.writecb=s,t.writing=!0,t.sync=!0,n?e._writev(i,t.onwrite):e._write(i,o,t.onwrite),t.sync=!1}function w(e,t,n,r){n||function(e,t){0===t.length&&t.needDrain&&(t.needDrain=!1,e.emit("drain"))}(e,t),t.pendingcb--,r(),M(e,t)}function _(e,t){t.bufferProcessing=!0;var n=t.bufferedRequest;if(e._writev&&n&&n.next){var r=t.bufferedRequestCount,i=new Array(r),o=t.corkedRequestsFree;o.entry=n;for(var a=0,u=!0;n;)i[a]=n,n.isBuf||(u=!1),n=n.next,a+=1;i.allBuffers=u,y(e,t,!0,t.length,i,"",o.finish),t.pendingcb++,t.lastBufferedRequest=null,o.next?(t.corkedRequestsFree=o.next,o.next=null):t.corkedRequestsFree=new s(t),t.bufferedRequestCount=0}else{for(;n;){var c=n.chunk,f=n.encoding,l=n.callback;if(y(e,t,!1,t.objectMode?1:c.length,c,f,l),n=n.next,t.bufferedRequestCount--,t.writing)break}null===n&&(t.lastBufferedRequest=null)}t.bufferedRequest=n,t.bufferProcessing=!1}function S(e){return e.ending&&0===e.length&&null===e.bufferedRequest&&!e.finished&&!e.writing}function E(e,t){e._final((function(n){t.pendingcb--,n&&e.emit("error",n),t.prefinished=!0,e.emit("prefinish"),M(e,t)}))}function M(e,t){var n=S(t);return n&&(!function(e,t){t.prefinished||t.finalCalled||("function"==typeof e._final?(t.pendingcb++,t.finalCalled=!0,o.nextTick(E,e,t)):(t.prefinished=!0,e.emit("prefinish")))}(e,t),0===t.pendingcb&&(t.finished=!0,e.emit("finish"))),n}c.inherits(b,l),m.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},function(){try{Object.defineProperty(m.prototype,"buffer",{get:f.deprecate((function(){return this.getBuffer()}),"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(e){}}(),"function"==typeof Symbol&&Symbol.hasInstance&&"function"==typeof Function.prototype[Symbol.hasInstance]?(p=Function.prototype[Symbol.hasInstance],Object.defineProperty(b,Symbol.hasInstance,{value:function(e){return!!p.call(this,e)||this===b&&(e&&e._writableState instanceof m)}})):p=function(e){return e instanceof this},b.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},b.prototype.write=function(e,t,n){var r,i=this._writableState,s=!1,a=!i.objectMode&&(r=e,d.isBuffer(r)||r instanceof h);return a&&!d.isBuffer(e)&&(e=function(e){return d.from(e)}(e)),"function"==typeof t&&(n=t,t=null),a?t="buffer":t||(t=i.defaultEncoding),"function"!=typeof n&&(n=g),i.ended?function(e,t){var n=new Error("write after end");e.emit("error",n),o.nextTick(t,n)}(this,n):(a||function(e,t,n,r){var i=!0,s=!1;return null===n?s=new TypeError("May not write null values to stream"):"string"==typeof n||void 0===n||t.objectMode||(s=new TypeError("Invalid non-string/buffer chunk")),s&&(e.emit("error",s),o.nextTick(r,s),i=!1),i}(this,i,e,n))&&(i.pendingcb++,s=function(e,t,n,r,i,o){if(!n){var s=function(e,t,n){e.objectMode||!1===e.decodeStrings||"string"!=typeof t||(t=d.from(t,n));return t}(t,r,i);r!==s&&(n=!0,i="buffer",r=s)}var a=t.objectMode?1:r.length;t.length+=a;var u=t.length-1))throw new TypeError("Unknown encoding: "+e);return this._writableState.defaultEncoding=e,this},Object.defineProperty(b.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),b.prototype._write=function(e,t,n){n(new Error("_write() is not implemented"))},b.prototype._writev=null,b.prototype.end=function(e,t,n){var r=this._writableState;"function"==typeof e?(n=e,e=null,t=null):"function"==typeof t&&(n=t,t=null),null!=e&&this.write(e,t),r.corked&&(r.corked=1,this.uncork()),r.ending||r.finished||function(e,t,n){t.ending=!0,M(e,t),n&&(t.finished?o.nextTick(n):e.once("finish",n));t.ended=!0,e.writable=!1}(this,r,n)},Object.defineProperty(b.prototype,"destroyed",{get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}}),b.prototype.destroy=v.destroy,b.prototype._undestroy=v.undestroy,b.prototype._destroy=function(e,t){this.end(),t(e)}}).call(this,n(20),n(289).setImmediate,n(31))},function(e,t,n){"use strict";var r=n(46);function i(e){this.options=e,this.type=this.options.type,this.blockSize=8,this._init(),this.buffer=new Array(this.blockSize),this.bufferOff=0}e.exports=i,i.prototype._init=function(){},i.prototype.update=function(e){return 0===e.length?[]:"decrypt"===this.type?this._updateDecrypt(e):this._updateEncrypt(e)},i.prototype._buffer=function(e,t){for(var n=Math.min(this.buffer.length-this.bufferOff,e.length-t),r=0;r0;r--)t+=this._buffer(e,t),n+=this._flushBuffer(i,n);return t+=this._buffer(e,t),i},i.prototype.final=function(e){var t,n;return e&&(t=this.update(e)),n="encrypt"===this.type?this._finalEncrypt():this._finalDecrypt(),t?t.concat(n):n},i.prototype._pad=function(e,t){if(0===t)return!1;for(;t=0||!t.umod(e.prime1)||!t.umod(e.prime2));return t}function s(e,n){var i=function(e){var t=o(e);return{blinder:t.toRed(r.mont(e.modulus)).redPow(new r(e.publicExponent)).fromRed(),unblinder:t.invm(e.modulus)}}(n),s=n.modulus.byteLength(),a=new r(e).mul(i.blinder).umod(n.modulus),u=a.toRed(r.mont(n.prime1)),c=a.toRed(r.mont(n.prime2)),f=n.coefficient,l=n.prime1,d=n.prime2,h=u.redPow(n.exponent1).fromRed(),p=c.redPow(n.exponent2).fromRed(),v=h.isub(p).imul(f).umod(l).imul(d);return p.iadd(v).imul(i.unblinder).umod(n.modulus).toArrayLike(t,"be",s)}s.getr=o,e.exports=s}).call(this,n(6).Buffer)},function(e,t,n){"use strict";var r=t;r.version=n(331).version,r.utils=n(47),r.rand=n(124),r.curve=n(199),r.curves=n(128),r.ec=n(342),r.eddsa=n(346)},function(e,t,n){"use strict";var r,i=t,o=n(129),s=n(199),a=n(47).assert;function u(e){"short"===e.type?this.curve=new s.short(e):"edwards"===e.type?this.curve=new s.edwards(e):this.curve=new s.mont(e),this.g=this.curve.g,this.n=this.curve.n,this.hash=e.hash,a(this.g.validate(),"Invalid curve"),a(this.g.mul(this.n).isInfinity(),"Invalid curve, G*N != O")}function c(e,t){Object.defineProperty(i,e,{configurable:!0,enumerable:!0,get:function(){var n=new u(t);return Object.defineProperty(i,e,{configurable:!0,enumerable:!0,value:n}),n}})}i.PresetCurve=u,c("p192",{type:"short",prime:"p192",p:"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff",a:"ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc",b:"64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1",n:"ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831",hash:o.sha256,gRed:!1,g:["188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012","07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811"]}),c("p224",{type:"short",prime:"p224",p:"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001",a:"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe",b:"b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4",n:"ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d",hash:o.sha256,gRed:!1,g:["b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21","bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34"]}),c("p256",{type:"short",prime:null,p:"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff",a:"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc",b:"5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b",n:"ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551",hash:o.sha256,gRed:!1,g:["6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296","4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5"]}),c("p384",{type:"short",prime:null,p:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 ffffffff",a:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 fffffffc",b:"b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f 5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef",n:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 f4372ddf 581a0db2 48b0a77a ecec196a ccc52973",hash:o.sha384,gRed:!1,g:["aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 5502f25d bf55296c 3a545e38 72760ab7","3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 0a60b1ce 1d7e819d 7a431d7c 90ea0e5f"]}),c("p521",{type:"short",prime:null,p:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff",a:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffc",b:"00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b 99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd 3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00",n:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409",hash:o.sha512,gRed:!1,g:["000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66","00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 3fad0761 353c7086 a272c240 88be9476 9fd16650"]}),c("curve25519",{type:"mont",prime:"p25519",p:"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",a:"76d06",b:"1",n:"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",hash:o.sha256,gRed:!1,g:["9"]}),c("ed25519",{type:"edwards",prime:"p25519",p:"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",a:"-1",c:"1",d:"52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3",n:"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",hash:o.sha256,gRed:!1,g:["216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a","6666666666666666666666666666666666666666666666666666666666666658"]});try{r=n(341)}catch(e){r=void 0}c("secp256k1",{type:"short",prime:"k256",p:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f",a:"0",b:"7",n:"ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141",h:"1",hash:o.sha256,beta:"7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee",lambda:"5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72",basis:[{a:"3086d221a7d46bcde86c90e49284eb15",b:"-e4437ed6010e88286f547fa90abfe4c3"},{a:"114ca50f7a8e2f3f657c1108d9d44cfd8",b:"3086d221a7d46bcde86c90e49284eb15"}],gRed:!1,g:["79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798","483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",r]})},function(e,t,n){var r=t;r.utils=n(51),r.common=n(82),r.sha=n(335),r.ripemd=n(339),r.hmac=n(340),r.sha1=r.sha.sha1,r.sha256=r.sha.sha256,r.sha224=r.sha.sha224,r.sha384=r.sha.sha384,r.sha512=r.sha.sha512,r.ripemd160=r.ripemd.ripemd160},function(e,t,n){"use strict";(function(t){var r,i=n(6),o=i.Buffer,s={};for(r in i)i.hasOwnProperty(r)&&"SlowBuffer"!==r&&"Buffer"!==r&&(s[r]=i[r]);var a=s.Buffer={};for(r in o)o.hasOwnProperty(r)&&"allocUnsafe"!==r&&"allocUnsafeSlow"!==r&&(a[r]=o[r]);if(s.Buffer.prototype=o.prototype,a.from&&a.from!==Uint8Array.from||(a.from=function(e,t,n){if("number"==typeof e)throw new TypeError('The "value" argument must not be of type number. Received type '+typeof e);if(e&&void 0===e.length)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e);return o(e,t,n)}),a.alloc||(a.alloc=function(e,t,n){if("number"!=typeof e)throw new TypeError('The "size" argument must be of type number. Received type '+typeof e);if(e<0||e>=2*(1<<30))throw new RangeError('The value "'+e+'" is invalid for option "size"');var r=o(e);return t&&0!==t.length?"string"==typeof n?r.fill(t,n):r.fill(t):r.fill(0),r}),!s.kStringMaxLength)try{s.kStringMaxLength=t.binding("buffer").kStringMaxLength}catch(e){}s.constants||(s.constants={MAX_LENGTH:s.kMaxLength},s.kStringMaxLength&&(s.constants.MAX_STRING_LENGTH=s.kStringMaxLength)),e.exports=s}).call(this,n(20))},function(e,t,n){"use strict";const r=n(132).Reporter,i=n(83).EncoderBuffer,o=n(83).DecoderBuffer,s=n(46),a=["seq","seqof","set","setof","objid","bool","gentime","utctime","null_","enum","int","objDesc","bitstr","bmpstr","charstr","genstr","graphstr","ia5str","iso646str","numstr","octstr","printstr","t61str","unistr","utf8str","videostr"],u=["key","obj","use","optional","explicit","implicit","def","choice","any","contains"].concat(a);function c(e,t,n){const r={};this._baseState=r,r.name=n,r.enc=e,r.parent=t||null,r.children=null,r.tag=null,r.args=null,r.reverseArgs=null,r.choice=null,r.optional=!1,r.any=!1,r.obj=!1,r.use=null,r.useDecoder=null,r.key=null,r.default=null,r.explicit=null,r.implicit=null,r.contains=null,r.parent||(r.children=[],this._wrap())}e.exports=c;const f=["enc","parent","children","tag","args","reverseArgs","choice","optional","any","obj","use","alteredUse","key","default","explicit","implicit","contains"];c.prototype.clone=function(){const e=this._baseState,t={};f.forEach((function(n){t[n]=e[n]}));const n=new this.constructor(t.parent);return n._baseState=t,n},c.prototype._wrap=function(){const e=this._baseState;u.forEach((function(t){this[t]=function(){const n=new this.constructor(this);return e.children.push(n),n[t].apply(n,arguments)}}),this)},c.prototype._init=function(e){const t=this._baseState;s(null===t.parent),e.call(this),t.children=t.children.filter((function(e){return e._baseState.parent===this}),this),s.equal(t.children.length,1,"Root node can have only one child")},c.prototype._useArgs=function(e){const t=this._baseState,n=e.filter((function(e){return e instanceof this.constructor}),this);e=e.filter((function(e){return!(e instanceof this.constructor)}),this),0!==n.length&&(s(null===t.children),t.children=n,n.forEach((function(e){e._baseState.parent=this}),this)),0!==e.length&&(s(null===t.args),t.args=e,t.reverseArgs=e.map((function(e){if("object"!=typeof e||e.constructor!==Object)return e;const t={};return Object.keys(e).forEach((function(n){n==(0|n)&&(n|=0);const r=e[n];t[r]=n})),t})))},["_peekTag","_decodeTag","_use","_decodeStr","_decodeObjid","_decodeTime","_decodeNull","_decodeInt","_decodeBool","_decodeList","_encodeComposite","_encodeStr","_encodeObjid","_encodeTime","_encodeNull","_encodeInt","_encodeBool"].forEach((function(e){c.prototype[e]=function(){const t=this._baseState;throw new Error(e+" not implemented for encoding: "+t.enc)}})),a.forEach((function(e){c.prototype[e]=function(){const t=this._baseState,n=Array.prototype.slice.call(arguments);return s(null===t.tag),t.tag=e,this._useArgs(n),this}})),c.prototype.use=function(e){s(e);const t=this._baseState;return s(null===t.use),t.use=e,this},c.prototype.optional=function(){return this._baseState.optional=!0,this},c.prototype.def=function(e){const t=this._baseState;return s(null===t.default),t.default=e,t.optional=!0,this},c.prototype.explicit=function(e){const t=this._baseState;return s(null===t.explicit&&null===t.implicit),t.explicit=e,this},c.prototype.implicit=function(e){const t=this._baseState;return s(null===t.explicit&&null===t.implicit),t.implicit=e,this},c.prototype.obj=function(){const e=this._baseState,t=Array.prototype.slice.call(arguments);return e.obj=!0,0!==t.length&&this._useArgs(t),this},c.prototype.key=function(e){const t=this._baseState;return s(null===t.key),t.key=e,this},c.prototype.any=function(){return this._baseState.any=!0,this},c.prototype.choice=function(e){const t=this._baseState;return s(null===t.choice),t.choice=e,this._useArgs(Object.keys(e).map((function(t){return e[t]}))),this},c.prototype.contains=function(e){const t=this._baseState;return s(null===t.use),t.contains=e,this},c.prototype._decode=function(e,t){const n=this._baseState;if(null===n.parent)return e.wrapResult(n.children[0]._decode(e,t));let r,i=n.default,s=!0,a=null;if(null!==n.key&&(a=e.enterKey(n.key)),n.optional){let r=null;if(null!==n.explicit?r=n.explicit:null!==n.implicit?r=n.implicit:null!==n.tag&&(r=n.tag),null!==r||n.any){if(s=this._peekTag(e,r,n.any),e.isError(s))return s}else{const r=e.save();try{null===n.choice?this._decodeGeneric(n.tag,e,t):this._decodeChoice(e,t),s=!0}catch(e){s=!1}e.restore(r)}}if(n.obj&&s&&(r=e.enterObject()),s){if(null!==n.explicit){const t=this._decodeTag(e,n.explicit);if(e.isError(t))return t;e=t}const r=e.offset;if(null===n.use&&null===n.choice){let t;n.any&&(t=e.save());const r=this._decodeTag(e,null!==n.implicit?n.implicit:n.tag,n.any);if(e.isError(r))return r;n.any?i=e.raw(t):e=r}if(t&&t.track&&null!==n.tag&&t.track(e.path(),r,e.length,"tagged"),t&&t.track&&null!==n.tag&&t.track(e.path(),e.offset,e.length,"content"),n.any||(i=null===n.choice?this._decodeGeneric(n.tag,e,t):this._decodeChoice(e,t)),e.isError(i))return i;if(n.any||null!==n.choice||null===n.children||n.children.forEach((function(n){n._decode(e,t)})),n.contains&&("octstr"===n.tag||"bitstr"===n.tag)){const r=new o(i);i=this._getUse(n.contains,e._reporterState.obj)._decode(r,t)}}return n.obj&&s&&(i=e.leaveObject(r)),null===n.key||null===i&&!0!==s?null!==a&&e.exitKey(a):e.leaveKey(a,n.key,i),i},c.prototype._decodeGeneric=function(e,t,n){const r=this._baseState;return"seq"===e||"set"===e?null:"seqof"===e||"setof"===e?this._decodeList(t,e,r.args[0],n):/str$/.test(e)?this._decodeStr(t,e,n):"objid"===e&&r.args?this._decodeObjid(t,r.args[0],r.args[1],n):"objid"===e?this._decodeObjid(t,null,null,n):"gentime"===e||"utctime"===e?this._decodeTime(t,e,n):"null_"===e?this._decodeNull(t,n):"bool"===e?this._decodeBool(t,n):"objDesc"===e?this._decodeStr(t,e,n):"int"===e||"enum"===e?this._decodeInt(t,r.args&&r.args[0],n):null!==r.use?this._getUse(r.use,t._reporterState.obj)._decode(t,n):t.error("unknown tag: "+e)},c.prototype._getUse=function(e,t){const n=this._baseState;return n.useDecoder=this._use(e,t),s(null===n.useDecoder._baseState.parent),n.useDecoder=n.useDecoder._baseState.children[0],n.implicit!==n.useDecoder._baseState.implicit&&(n.useDecoder=n.useDecoder.clone(),n.useDecoder._baseState.implicit=n.implicit),n.useDecoder},c.prototype._decodeChoice=function(e,t){const n=this._baseState;let r=null,i=!1;return Object.keys(n.choice).some((function(o){const s=e.save(),a=n.choice[o];try{const n=a._decode(e,t);if(e.isError(n))return!1;r={type:o,value:n},i=!0}catch(t){return e.restore(s),!1}return!0}),this),i?r:e.error("Choice not matched")},c.prototype._createEncoderBuffer=function(e){return new i(e,this.reporter)},c.prototype._encode=function(e,t,n){const r=this._baseState;if(null!==r.default&&r.default===e)return;const i=this._encodeValue(e,t,n);return void 0===i||this._skipDefault(i,t,n)?void 0:i},c.prototype._encodeValue=function(e,t,n){const i=this._baseState;if(null===i.parent)return i.children[0]._encode(e,t||new r);let o=null;if(this.reporter=t,i.optional&&void 0===e){if(null===i.default)return;e=i.default}let s=null,a=!1;if(i.any)o=this._createEncoderBuffer(e);else if(i.choice)o=this._encodeChoice(e,t);else if(i.contains)s=this._getUse(i.contains,n)._encode(e,t),a=!0;else if(i.children)s=i.children.map((function(n){if("null_"===n._baseState.tag)return n._encode(null,t,e);if(null===n._baseState.key)return t.error("Child should have a key");const r=t.enterKey(n._baseState.key);if("object"!=typeof e)return t.error("Child expected, but input is not object");const i=n._encode(e[n._baseState.key],t,e);return t.leaveKey(r),i}),this).filter((function(e){return e})),s=this._createEncoderBuffer(s);else if("seqof"===i.tag||"setof"===i.tag){if(!i.args||1!==i.args.length)return t.error("Too many args for : "+i.tag);if(!Array.isArray(e))return t.error("seqof/setof, but data is not Array");const n=this.clone();n._baseState.implicit=null,s=this._createEncoderBuffer(e.map((function(n){const r=this._baseState;return this._getUse(r.args[0],e)._encode(n,t)}),n))}else null!==i.use?o=this._getUse(i.use,n)._encode(e,t):(s=this._encodePrimitive(i.tag,e),a=!0);if(!i.any&&null===i.choice){const e=null!==i.implicit?i.implicit:i.tag,n=null===i.implicit?"universal":"context";null===e?null===i.use&&t.error("Tag could be omitted only for .use()"):null===i.use&&(o=this._encodeComposite(e,a,n,s))}return null!==i.explicit&&(o=this._encodeComposite(i.explicit,!1,"context",o)),o},c.prototype._encodeChoice=function(e,t){const n=this._baseState,r=n.choice[e.type];return r||s(!1,e.type+" not found in "+JSON.stringify(Object.keys(n.choice))),r._encode(e.value,t)},c.prototype._encodePrimitive=function(e,t){const n=this._baseState;if(/str$/.test(e))return this._encodeStr(t,e);if("objid"===e&&n.args)return this._encodeObjid(t,n.reverseArgs[0],n.args[1]);if("objid"===e)return this._encodeObjid(t,null,null);if("gentime"===e||"utctime"===e)return this._encodeTime(t,e);if("null_"===e)return this._encodeNull();if("int"===e||"enum"===e)return this._encodeInt(t,n.args&&n.reverseArgs[0]);if("bool"===e)return this._encodeBool(t);if("objDesc"===e)return this._encodeStr(t,e);throw new Error("Unsupported tag: "+e)},c.prototype._isNumstr=function(e){return/^[0-9 ]*$/.test(e)},c.prototype._isPrintstr=function(e){return/^[A-Za-z0-9 '()+,-./:=?]*$/.test(e)}},function(e,t,n){"use strict";const r=n(7);function i(e){this._reporterState={obj:null,path:[],options:e||{},errors:[]}}function o(e,t){this.path=e,this.rethrow(t)}t.Reporter=i,i.prototype.isError=function(e){return e instanceof o},i.prototype.save=function(){const e=this._reporterState;return{obj:e.obj,pathLen:e.path.length}},i.prototype.restore=function(e){const t=this._reporterState;t.obj=e.obj,t.path=t.path.slice(0,e.pathLen)},i.prototype.enterKey=function(e){return this._reporterState.path.push(e)},i.prototype.exitKey=function(e){const t=this._reporterState;t.path=t.path.slice(0,e-1)},i.prototype.leaveKey=function(e,t,n){const r=this._reporterState;this.exitKey(e),null!==r.obj&&(r.obj[t]=n)},i.prototype.path=function(){return this._reporterState.path.join("/")},i.prototype.enterObject=function(){const e=this._reporterState,t=e.obj;return e.obj={},t},i.prototype.leaveObject=function(e){const t=this._reporterState,n=t.obj;return t.obj=e,n},i.prototype.error=function(e){let t;const n=this._reporterState,r=e instanceof o;if(t=r?e:new o(n.path.map((function(e){return"["+JSON.stringify(e)+"]"})).join(""),e.message||e,e.stack),!n.options.partial)throw t;return r||n.errors.push(t),t},i.prototype.wrapResult=function(e){const t=this._reporterState;return t.options.partial?{result:this.isError(e)?null:e,errors:t.errors}:e},r(o,Error),o.prototype.rethrow=function(e){if(this.message=e+" at: "+(this.path||"(shallow)"),Error.captureStackTrace&&Error.captureStackTrace(this,o),!this.stack)try{throw new Error(this.message)}catch(e){this.stack=e.stack}return this}},function(e,t,n){"use strict";function r(e){const t={};return Object.keys(e).forEach((function(n){(0|n)==n&&(n|=0);const r=e[n];t[r]=n})),t}t.tagClass={0:"universal",1:"application",2:"context",3:"private"},t.tagClassByName=r(t.tagClass),t.tag={0:"end",1:"bool",2:"int",3:"bitstr",4:"octstr",5:"null_",6:"objid",7:"objDesc",8:"external",9:"real",10:"enum",11:"embed",12:"utf8str",13:"relativeOid",16:"seq",17:"set",18:"numstr",19:"printstr",20:"t61str",21:"videostr",22:"ia5str",23:"utctime",24:"gentime",25:"graphstr",26:"iso646str",27:"genstr",28:"unistr",29:"charstr",30:"bmpstr"},t.tagByName=r(t.tag)},function(e,t,n){"use strict";n.r(t),n.d(t,"locateWindow",(function(){return i}));var r={};function i(){return"undefined"!=typeof window?window:"undefined"!=typeof self?self:r}},function(e,t,n){var r=n(84),i=n(85);e.exports=function(e){return"symbol"==typeof e||i(e)&&"[object Symbol]"==r(e)}},function(e,t,n){var r=n(395),i=n(411),o=n(413),s=n(414),a=n(415);function u(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]/g,">").replace(/"/g,""")+'"')}}catch(t){e={error:t}}finally{try{s&&!s.done&&(t=o.return)&&t.call(o)}finally{if(e)throw e.error}}return r+(n?">"+this.children.map((function(e){return e.toString()})).join("")+"":"/>")},e}();var ti=function(){function e(e){this.value=e}return e.prototype.toString=function(){return(""+this.value).replace(/&/g,"&").replace(//g,">")},e}(),ni=n(253),ri=function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c;return d(this,(function(l){switch(l.label){case 0:return r=[f({},e)],c={},[4,Ai(e.body,t)];case 1:switch(n=f.apply(void 0,r.concat([(c.body=l.sent(),c)])),o="UnknownError",o=Ii(e,n.body),o){case"NoSuchUpload":case"com.amazonaws.s3#NoSuchUpload":return[3,2]}return[3,4];case 2:return s=[{}],[4,pi(n,t)];case 3:return i=f.apply(void 0,[f.apply(void 0,s.concat([l.sent()])),{name:o,$metadata:Si(e)}]),[3,5];case 4:a=n.body,o=a.code||a.Code||o,i=f(f({},a),{name:""+o,message:a.message||a.Message||o,$fault:"client",$metadata:Si(e)}),l.label=5;case 5:return u=i.message||i.Message||o,i.message=u,delete i.Message,[2,Promise.reject(Object.assign(new Error(u),i))]}}))}))},ii=function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u;return d(this,(function(c){switch(c.label){case 0:return r=[f({},e)],u={},[4,Ai(e.body,t)];case 1:return n=f.apply(void 0,r.concat([(u.body=c.sent(),u)])),o="UnknownError",o=Ii(e,n.body),s=n.body,o=s.code||s.Code||o,i=f(f({},s),{name:""+o,message:s.message||s.Message||o,$fault:"client",$metadata:Si(e)}),a=i.message||i.Message||o,i.message=a,delete i.Message,[2,Promise.reject(Object.assign(new Error(a),i))]}}))}))},oi=function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u;return d(this,(function(c){switch(c.label){case 0:return r=[f({},e)],u={},[4,Ai(e.body,t)];case 1:return n=f.apply(void 0,r.concat([(u.body=c.sent(),u)])),o="UnknownError",o=Ii(e,n.body),s=n.body,o=s.code||s.Code||o,i=f(f({},s),{name:""+o,message:s.message||s.Message||o,$fault:"client",$metadata:Si(e)}),a=i.message||i.Message||o,i.message=a,delete i.Message,[2,Promise.reject(Object.assign(new Error(a),i))]}}))}))},si=function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u;return d(this,(function(c){switch(c.label){case 0:return r=[f({},e)],u={},[4,Ai(e.body,t)];case 1:return n=f.apply(void 0,r.concat([(u.body=c.sent(),u)])),o="UnknownError",o=Ii(e,n.body),s=n.body,o=s.code||s.Code||o,i=f(f({},s),{name:""+o,message:s.message||s.Message||o,$fault:"client",$metadata:Si(e)}),a=i.message||i.Message||o,i.message=a,delete i.Message,[2,Promise.reject(Object.assign(new Error(a),i))]}}))}))},ai=function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c;return d(this,(function(l){switch(l.label){case 0:return r=[f({},e)],c={},[4,Ai(e.body,t)];case 1:switch(n=f.apply(void 0,r.concat([(c.body=l.sent(),c)])),o="UnknownError",o=Ii(e,n.body),o){case"NoSuchKey":case"com.amazonaws.s3#NoSuchKey":return[3,2]}return[3,4];case 2:return s=[{}],[4,hi(n,t)];case 3:return i=f.apply(void 0,[f.apply(void 0,s.concat([l.sent()])),{name:o,$metadata:Si(e)}]),[3,5];case 4:a=n.body,o=a.code||a.Code||o,i=f(f({},a),{name:""+o,message:a.message||a.Message||o,$fault:"client",$metadata:Si(e)}),l.label=5;case 5:return u=i.message||i.Message||o,i.message=u,delete i.Message,[2,Promise.reject(Object.assign(new Error(u),i))]}}))}))},ui=function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c;return d(this,(function(l){switch(l.label){case 0:return r=[f({},e)],c={},[4,Ai(e.body,t)];case 1:switch(n=f.apply(void 0,r.concat([(c.body=l.sent(),c)])),o="UnknownError",o=Ii(e,n.body),o){case"NoSuchBucket":case"com.amazonaws.s3#NoSuchBucket":return[3,2]}return[3,4];case 2:return s=[{}],[4,di(n,t)];case 3:return i=f.apply(void 0,[f.apply(void 0,s.concat([l.sent()])),{name:o,$metadata:Si(e)}]),[3,5];case 4:a=n.body,o=a.code||a.Code||o,i=f(f({},a),{name:""+o,message:a.message||a.Message||o,$fault:"client",$metadata:Si(e)}),l.label=5;case 5:return u=i.message||i.Message||o,i.message=u,delete i.Message,[2,Promise.reject(Object.assign(new Error(u),i))]}}))}))},ci=function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u;return d(this,(function(c){switch(c.label){case 0:return r=[f({},e)],u={},[4,Ai(e.body,t)];case 1:return n=f.apply(void 0,r.concat([(u.body=c.sent(),u)])),o="UnknownError",o=Ii(e,n.body),s=n.body,o=s.code||s.Code||o,i=f(f({},s),{name:""+o,message:s.message||s.Message||o,$fault:"client",$metadata:Si(e)}),a=i.message||i.Message||o,i.message=a,delete i.Message,[2,Promise.reject(Object.assign(new Error(a),i))]}}))}))},fi=function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u;return d(this,(function(c){switch(c.label){case 0:return r=[f({},e)],u={},[4,Ai(e.body,t)];case 1:return n=f.apply(void 0,r.concat([(u.body=c.sent(),u)])),o="UnknownError",o=Ii(e,n.body),s=n.body,o=s.code||s.Code||o,i=f(f({},s),{name:""+o,message:s.message||s.Message||o,$fault:"client",$metadata:Si(e)}),a=i.message||i.Message||o,i.message=a,delete i.Message,[2,Promise.reject(Object.assign(new Error(a),i))]}}))}))},li=function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u;return d(this,(function(c){switch(c.label){case 0:return r=[f({},e)],u={},[4,Ai(e.body,t)];case 1:return n=f.apply(void 0,r.concat([(u.body=c.sent(),u)])),o="UnknownError",o=Ii(e,n.body),s=n.body,o=s.code||s.Code||o,i=f(f({},s),{name:""+o,message:s.message||s.Message||o,$fault:"client",$metadata:Si(e)}),a=i.message||i.Message||o,i.message=a,delete i.Message,[2,Promise.reject(Object.assign(new Error(a),i))]}}))}))},di=function(e,t){return l(void 0,void 0,void 0,(function(){var t;return d(this,(function(n){return t={name:"NoSuchBucket",$fault:"client",$metadata:Si(e)},e.body,[2,t]}))}))},hi=function(e,t){return l(void 0,void 0,void 0,(function(){var t;return d(this,(function(n){return t={name:"NoSuchKey",$fault:"client",$metadata:Si(e)},e.body,[2,t]}))}))},pi=function(e,t){return l(void 0,void 0,void 0,(function(){var t;return d(this,(function(n){return t={name:"NoSuchUpload",$fault:"client",$metadata:Si(e)},e.body,[2,t]}))}))},vi=function(e,t){var n=new ei("CompletedMultipartUpload");void 0!==e.Parts&&gi(e.Parts,t).map((function(e){e=e.withName("Part"),n.addChildNode(e)}));return n},gi=function(e,t){return e.map((function(e){return function(e,t){var n=new ei("CompletedPart");if(void 0!==e.ETag){var r=new ei("ETag").addChildNode(new ti(e.ETag)).withName("ETag");n.addChildNode(r)}if(void 0!==e.PartNumber){r=new ei("PartNumber").addChildNode(new ti(String(e.PartNumber))).withName("PartNumber");n.addChildNode(r)}return n}(e).withName("member")}))},mi=function(e,t){return(e||[]).map((function(e){return function(e,t){var n={Prefix:void 0};return void 0!==e.Prefix&&(n.Prefix=e.Prefix),n}(e)}))},bi=function(e,t){var n={ID:void 0,DisplayName:void 0};return void 0!==e.ID&&(n.ID=e.ID),void 0!==e.DisplayName&&(n.DisplayName=e.DisplayName),n},yi=function(e,t){return(e||[]).map((function(e){return function(e,t){var n={Size:void 0,ETag:void 0,Owner:void 0,StorageClass:void 0,Key:void 0,LastModified:void 0};return void 0!==e.Size&&(n.Size=parseInt(e.Size)),void 0!==e.ETag&&(n.ETag=e.ETag),void 0!==e.Owner&&(n.Owner=wi(e.Owner,t)),void 0!==e.StorageClass&&(n.StorageClass=e.StorageClass),void 0!==e.Key&&(n.Key=e.Key),void 0!==e.LastModified&&(n.LastModified=new Date(e.LastModified)),n}(e,t)}))},wi=function(e,t){var n={DisplayName:void 0,ID:void 0};return void 0!==e.DisplayName&&(n.DisplayName=e.DisplayName),void 0!==e.ID&&(n.ID=e.ID),n},_i=function(e,t){return(e||[]).map((function(e){return function(e,t){var n={Size:void 0,LastModified:void 0,PartNumber:void 0,ETag:void 0};return void 0!==e.Size&&(n.Size=parseInt(e.Size)),void 0!==e.LastModified&&(n.LastModified=new Date(e.LastModified)),void 0!==e.PartNumber&&(n.PartNumber=parseInt(e.PartNumber)),void 0!==e.ETag&&(n.ETag=e.ETag),n}(e)}))},Si=function(e){return{httpStatusCode:e.statusCode,httpHeaders:e.headers,requestId:e.headers["x-amzn-requestid"]}},Ei=function(e,t){return void 0===e&&(e=new Uint8Array),e instanceof Uint8Array?Promise.resolve(e):t.streamCollector(e)||Promise.resolve(new Uint8Array)},Mi=function(e){return!(void 0===e||""===e||Object.getOwnPropertyNames(e).includes("length")&&0==e.length||Object.getOwnPropertyNames(e).includes("size")&&0==e.size)},Ai=function(e,t){return function(e,t){return Ei(e,t).then((function(e){return t.utf8Encoder(e)}))}(e,t).then((function(e){if(e.length){var t=Object(ni.parse)(e,{attributeNamePrefix:"",ignoreAttributes:!1,parseNodeValue:!1,tagValueProcessor:function(e,t){return e.replace(/&/g,"&").replace(/'/g,"'").replace(/"/g,'"').replace(/>/g,">").replace(/</g,"<")}}),n=Object.keys(t)[0],r=t[n];return r["#text"]&&(r[n]=r["#text"],delete r["#text"]),Object(Zr.h)(r)}return{}}))},Ii=function(e,t){return void 0!==t.Code?t.Code:404==e.statusCode?"NotFound":""},ki=function(e){return"string"==typeof e&&0===e.indexOf("arn:")&&e.split(":").length>=6},Oi=/^[a-z0-9][a-z0-9\.\-]{1,61}[a-z0-9]$/,xi=/(\d+\.){3}\d+/,Ci=/\.\./,Ti=/\./,Pi=/^(.+\.)?s3[.-]([a-z0-9-]+)\./,Ni=/^s3(-external-1)?\.amazonaws\.com$/,Ri=function(e){return ji(e)?e.replace(/fips-|-fips/,""):e},Li=function(e){var t=e.match(Pi);return[t[2],e.replace(new RegExp("^"+t[0]),"")]},ji=function(e){return e.startsWith("fips-")||e.endsWith("-fips")},Di=function(e,t){return e===t||Ri(e)===t||e===Ri(t)},Ui=function(e,t){if(void 0===t&&(t={tlsCompatible:!0}),e.length>=64||!/^[a-z0-9][a-z0-9.-]+[a-z0-9]$/.test(e)||/(\d+\.){3}\d+/.test(e)||/[.-]{2}/.test(e)||(null==t?void 0:t.tlsCompatible)&&Ti.test(e))throw new Error("Invalid DNS label "+e)},Bi=function(e){var t=e.baseHostname;return Pi.test(t)?function(e){return"string"==typeof e.bucketName}(e)?zi(e):Fi(e):{bucketEndpoint:!1,hostname:t}},Fi=function(e){var t,n=Object(Qr.__read)((t=e.baseHostname,Ni.test(t)?[t.replace(".amazonaws.com",""),"amazonaws.com"]:Li(t)),2),r=n[0],i=n[1],o=e.pathStyleEndpoint,s=e.dualstackEndpoint,a=void 0!==s&&s,u=e.accelerateEndpoint,c=void 0!==u&&u,f=e.tlsCompatible,l=void 0===f||f,d=e.useArnRegion,h=e.bucketName,p=e.clientPartition,v=void 0===p?"aws":p,g=e.clientSigningRegion,m=void 0===g?r:g;!function(e){if(e.pathStyleEndpoint)throw new Error("Path-style S3 endpoint is not supported when bucket is an ARN");if(e.accelerateEndpoint)throw new Error("Accelerate endpoint is not supported when bucket is an ARN");if(!e.tlsCompatible)throw new Error("HTTPS is required when bucket is an ARN")}({pathStyleEndpoint:o,accelerateEndpoint:c,tlsCompatible:l});var b=h.service,y=h.partition,w=h.accountId,_=h.region,S=h.resource;!function(e){if("s3"!==e&&"s3-outposts"!==e)throw new Error("Expect 's3' or 's3-outposts' in ARN service component")}(b),function(e,t){if(e!==t.clientPartition)throw new Error('Partition in ARN is incompatible, got "'+e+'" but expected "'+t.clientPartition+'"')}(y,{clientPartition:v}),function(e){if(!/[0-9]{12}/.exec(e))throw new Error("Access point ARN accountID does not match regex '[0-9]{12}'")}(w),function(e,t){if(""===e)throw new Error("ARN region is empty");if(!t.useArnRegion&&!Di(e,t.clientRegion)&&!Di(e,t.clientSigningRegion))throw new Error("Region in ARN is incompatible, got "+e+" but expected "+t.clientRegion);if(t.useArnRegion&&ji(e))throw new Error("Endpoint does not support FIPS region")}(_,{useArnRegion:d,clientRegion:r,clientSigningRegion:m});var E=function(e){var t=e.includes(":")?":":"/",n=Object(Qr.__read)(e.split(t)),r=n[0],i=n.slice(1);if("accesspoint"===r){if(1!==i.length||""===i[0])throw new Error("Access Point ARN should have one resource accesspoint"+t+"{accesspointname}");return{accesspointName:i[0]}}if("outpost"===r){if(!i[0]||"accesspoint"!==i[1]||!i[2]||3!==i.length)throw new Error("Outpost ARN should have resource outpost"+t+"{outpostId}"+t+"accesspoint"+t+"{accesspointName}");var o=Object(Qr.__read)(i,3),s=o[0];o[1];return{outpostId:s,accesspointName:o[2]}}throw new Error("ARN resource should begin with 'accesspoint"+t+"' or 'outpost"+t+"'")}(S),M=E.accesspointName,A=E.outpostId;Ui(M+"-"+w,{tlsCompatible:l});var I=d?_:r,k=d?_:m;return A?(function(e){if("s3-outposts"!==e)throw new Error("Expect 's3-posts' in Outpost ARN service component")}(b),Ui(A,{tlsCompatible:l}),function(e){if(e)throw new Error("Dualstack endpoint is not supported with Outpost")}(a),function(e){if(ji(null!=e?e:""))throw new Error("FIPS region is not supported with Outpost, got "+e)}(I),{bucketEndpoint:!0,hostname:M+"-"+w+"."+A+".s3-outposts."+I+"."+i,signingRegion:k,signingService:"s3-outposts"}):(function(e){if("s3"!==e)throw new Error("Expect 's3' in Accesspoint ARN service component")}(b),{bucketEndpoint:!0,hostname:M+"-"+w+".s3-accesspoint"+(a?".dualstack":"")+"."+I+"."+i,signingRegion:k})},zi=function(e){var t,n=e.accelerateEndpoint,r=void 0!==n&&n,i=e.baseHostname,o=e.bucketName,s=e.dualstackEndpoint,a=void 0!==s&&s,u=e.pathStyleEndpoint,c=void 0!==u&&u,f=e.tlsCompatible,l=void 0===f||f,d=Object(Qr.__read)((t=i,Ni.test(t)?["us-east-1","amazonaws.com"]:Li(t)),2),h=d[0],p=d[1];return c||!function(e){return Oi.test(e)&&!xi.test(e)&&!Ci.test(e)}(o)||l&&Ti.test(o)?{bucketEndpoint:!1,hostname:a?"s3.dualstack."+h+"."+p:i}:(r?i="s3-accelerate"+(a?".dualstack":"")+"."+p:a&&(i="s3.dualstack."+h+"."+p),{bucketEndpoint:!0,hostname:o+"."+i})},qi=function(e){return function(t,n){return function(r){return Object(Qr.__awaiter)(void 0,void 0,void 0,(function(){var i,o,s,a,u,c,f,l,d,h,p,v,g,m,b,y,w;return Object(Qr.__generator)(this,(function(_){switch(_.label){case 0:return i=r.input.Bucket,o=e.bucketEndpoint,s=r.request,Xr.a.isInstance(s)?e.bucketEndpoint?(s.hostname=i,[3,6]):[3,1]:[3,7];case 1:return ki(i)?(a=function(e){var t=e.split(":");if(t.length<6||"arn"!==t[0])throw new Error("Malformed ARN");var n=Object(Qr.__read)(t);return{partition:n[1],service:n[2],region:n[3],accountId:n[4],resource:n.slice(5).join(":")}}(i),c=Ri,[4,e.region()]):[3,5];case 2:return u=c.apply(void 0,[_.sent()]),[4,e.regionInfoProvider(u)];case 3:return f=_.sent()||{},l=f.partition,d=f.signingRegion,h=void 0===d?u:d,[4,e.useArnRegion()];case 4:return p=_.sent(),v=Bi({bucketName:a,baseHostname:s.hostname,accelerateEndpoint:e.useAccelerateEndpoint,dualstackEndpoint:e.useDualstackEndpoint,pathStyleEndpoint:e.forcePathStyle,tlsCompatible:"https:"===s.protocol,useArnRegion:p,clientPartition:l,clientSigningRegion:h}),y=v.hostname,w=v.bucketEndpoint,g=v.signingRegion,m=v.signingService,g&&g!==h&&(n.signing_region=g),m&&"s3"!==m&&(n.signing_service=m),s.hostname=y,o=w,[3,6];case 5:b=Bi({bucketName:i,baseHostname:s.hostname,accelerateEndpoint:e.useAccelerateEndpoint,dualstackEndpoint:e.useDualstackEndpoint,pathStyleEndpoint:e.forcePathStyle,tlsCompatible:"https:"===s.protocol}),y=b.hostname,w=b.bucketEndpoint,s.hostname=y,o=w,_.label=6;case 6:o&&(s.path=s.path.replace(/^(\/)?[^\/]+/,""),""===s.path&&(s.path="/")),_.label=7;case 7:return[2,t(Object(Qr.__assign)(Object(Qr.__assign)({},r),{request:s}))]}}))}))}}},Ki={tags:["BUCKET_ENDPOINT"],name:"bucketEndpointMiddleware",relation:"before",toMiddleware:"hostHeaderMiddleware"},Hi=function(e){return{applyToStack:function(t){t.addRelativeTo(qi(e),Ki)}}};var Vi=n(10);var Gi={name:"ssecMiddleware",step:"initialize",tags:["SSE"]},Wi=function(e){return{applyToStack:function(t){t.add(function(e){var t=this;return function(n){return function(r){return Object(Qr.__awaiter)(t,void 0,void 0,(function(){var t,i,o,s,a,u,c,f,l,d,h,p,v,g,m,b,y;return Object(Qr.__generator)(this,(function(w){switch(w.label){case 0:t=Object(Qr.__assign)({},r.input),i=[{target:"SSECustomerKey",hash:"SSECustomerKeyMD5"},{target:"CopySourceSSECustomerKey",hash:"CopySourceSSECustomerKeyMD5"}],w.label=1;case 1:w.trys.push([1,6,7,8]),o=Object(Qr.__values)(i),s=o.next(),w.label=2;case 2:return s.done?[3,5]:(a=s.value,(u=t[a.target])?(c=ArrayBuffer.isView(u)?new Uint8Array(u.buffer,u.byteOffset,u.byteLength):"string"==typeof u?e.utf8Decoder(u):new Uint8Array(u),f=e.base64Encoder(c),(l=new e.md5).update(c),d=[Object(Qr.__assign)({},t)],(y={})[a.target]=f,h=a.hash,v=(p=e).base64Encoder,[4,l.digest()]):[3,4]);case 3:t=Qr.__assign.apply(void 0,d.concat([(y[h]=v.apply(p,[w.sent()]),y)])),w.label=4;case 4:return s=o.next(),[3,2];case 5:return[3,8];case 6:return g=w.sent(),m={error:g},[3,8];case 7:try{s&&!s.done&&(b=o.return)&&b.call(o)}finally{if(m)throw m.error}return[7];case 8:return[2,n(Object(Qr.__assign)(Object(Qr.__assign)({},r),{input:t}))]}}))}))}}}(e),Gi)}}},$i=function(e){function t(t){var n=e.call(this)||this;return n.input=t,n}return c(t,e),t.prototype.resolveMiddleware=function(e,t,n){this.middlewareStack.use(Object(Vi.a)(t,this.serialize,this.deserialize)),this.middlewareStack.use(Wi(t)),this.middlewareStack.use(Hi(t));var r=e.concat(this.middlewareStack),i=t.logger,o={logger:i,clientName:"S3Client",commandName:"GetObjectCommand",inputFilterSensitiveLog:Xt.filterSensitiveLog,outputFilterSensitiveLog:Zt.filterSensitiveLog};"function"==typeof i.info&&i.info({clientName:"S3Client",commandName:"GetObjectCommand"});var s=t.requestHandler;return r.resolve((function(e){return s.handle(e.request,n||{})}),o)},t.prototype.serialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,l;return d(this,(function(d){switch(d.label){case 0:if(n=f(f(f(f(f(f(f(f(f(f({"Content-Type":""},Mi(e.SSECustomerKey)&&{"x-amz-server-side-encryption-customer-key":e.SSECustomerKey}),Mi(e.SSECustomerAlgorithm)&&{"x-amz-server-side-encryption-customer-algorithm":e.SSECustomerAlgorithm}),Mi(e.SSECustomerKeyMD5)&&{"x-amz-server-side-encryption-customer-key-MD5":e.SSECustomerKeyMD5}),Mi(e.RequestPayer)&&{"x-amz-request-payer":e.RequestPayer}),Mi(e.ExpectedBucketOwner)&&{"x-amz-expected-bucket-owner":e.ExpectedBucketOwner}),Mi(e.IfUnmodifiedSince)&&{"If-Unmodified-Since":Object(Zr.e)(e.IfUnmodifiedSince).toString()}),Mi(e.IfModifiedSince)&&{"If-Modified-Since":Object(Zr.e)(e.IfModifiedSince).toString()}),Mi(e.IfNoneMatch)&&{"If-None-Match":e.IfNoneMatch}),Mi(e.IfMatch)&&{"If-Match":e.IfMatch}),Mi(e.Range)&&{Range:e.Range}),r="/{Bucket}/{Key+}",void 0===e.Bucket)throw new Error("No value provided for input HTTP label: Bucket.");if((i=e.Bucket).length<=0)throw new Error("Empty value provided for input HTTP label: Bucket.");if(r=r.replace("{Bucket}",Object(Zr.f)(i)),void 0===e.Key)throw new Error("No value provided for input HTTP label: Key.");if((i=e.Key).length<=0)throw new Error("Empty value provided for input HTTP label: Key.");return r=r.replace("{Key+}",i.split("/").map((function(e){return Object(Zr.f)(e)})).join("/")),o=f(f(f(f(f(f(f(f({"x-id":"GetObject"},void 0!==e.ResponseContentEncoding&&{"response-content-encoding":e.ResponseContentEncoding}),void 0!==e.ResponseCacheControl&&{"response-cache-control":e.ResponseCacheControl}),void 0!==e.ResponseContentLanguage&&{"response-content-language":e.ResponseContentLanguage}),void 0!==e.ResponseContentDisposition&&{"response-content-disposition":e.ResponseContentDisposition}),void 0!==e.PartNumber&&{partNumber:e.PartNumber.toString()}),void 0!==e.VersionId&&{versionId:e.VersionId}),void 0!==e.ResponseExpires&&{"response-expires":(e.ResponseExpires.toISOString().split(".")[0]+"Z").toString()}),void 0!==e.ResponseContentType&&{"response-content-type":e.ResponseContentType}),[4,t.endpoint()];case 1:return s=d.sent(),a=s.hostname,u=s.protocol,c=void 0===u?"https":u,l=s.port,[2,new Xr.a({protocol:c,hostname:a,port:l,method:"GET",headers:n,path:r,query:o,body:void 0})]}}))}))}(e,t)},t.prototype.deserialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n,r;return d(this,(function(i){return 200!==e.statusCode&&e.statusCode>=300?[2,ai(e,t)]:(n={$metadata:Si(e),AcceptRanges:void 0,Body:void 0,CacheControl:void 0,ContentDisposition:void 0,ContentEncoding:void 0,ContentLanguage:void 0,ContentLength:void 0,ContentRange:void 0,ContentType:void 0,DeleteMarker:void 0,ETag:void 0,Expiration:void 0,Expires:void 0,LastModified:void 0,Metadata:void 0,MissingMeta:void 0,ObjectLockLegalHoldStatus:void 0,ObjectLockMode:void 0,ObjectLockRetainUntilDate:void 0,PartsCount:void 0,ReplicationStatus:void 0,RequestCharged:void 0,Restore:void 0,SSECustomerAlgorithm:void 0,SSECustomerKeyMD5:void 0,SSEKMSKeyId:void 0,ServerSideEncryption:void 0,StorageClass:void 0,TagCount:void 0,VersionId:void 0,WebsiteRedirectLocation:void 0},void 0!==e.headers["x-amz-object-lock-mode"]&&(n.ObjectLockMode=e.headers["x-amz-object-lock-mode"]),void 0!==e.headers["content-language"]&&(n.ContentLanguage=e.headers["content-language"]),void 0!==e.headers["content-disposition"]&&(n.ContentDisposition=e.headers["content-disposition"]),void 0!==e.headers["cache-control"]&&(n.CacheControl=e.headers["cache-control"]),void 0!==e.headers["content-type"]&&(n.ContentType=e.headers["content-type"]),void 0!==e.headers["content-range"]&&(n.ContentRange=e.headers["content-range"]),void 0!==e.headers["x-amz-server-side-encryption-aws-kms-key-id"]&&(n.SSEKMSKeyId=e.headers["x-amz-server-side-encryption-aws-kms-key-id"]),void 0!==e.headers["content-length"]&&(n.ContentLength=parseInt(e.headers["content-length"],10)),void 0!==e.headers["x-amz-object-lock-retain-until-date"]&&(n.ObjectLockRetainUntilDate=new Date(e.headers["x-amz-object-lock-retain-until-date"])),void 0!==e.headers["x-amz-object-lock-legal-hold"]&&(n.ObjectLockLegalHoldStatus=e.headers["x-amz-object-lock-legal-hold"]),void 0!==e.headers["x-amz-delete-marker"]&&(n.DeleteMarker="true"===e.headers["x-amz-delete-marker"]),void 0!==e.headers["x-amz-storage-class"]&&(n.StorageClass=e.headers["x-amz-storage-class"]),void 0!==e.headers["content-encoding"]&&(n.ContentEncoding=e.headers["content-encoding"]),void 0!==e.headers["x-amz-restore"]&&(n.Restore=e.headers["x-amz-restore"]),void 0!==e.headers["x-amz-website-redirect-location"]&&(n.WebsiteRedirectLocation=e.headers["x-amz-website-redirect-location"]),void 0!==e.headers["x-amz-server-side-encryption"]&&(n.ServerSideEncryption=e.headers["x-amz-server-side-encryption"]),void 0!==e.headers["x-amz-mp-parts-count"]&&(n.PartsCount=parseInt(e.headers["x-amz-mp-parts-count"],10)),void 0!==e.headers["x-amz-server-side-encryption-customer-algorithm"]&&(n.SSECustomerAlgorithm=e.headers["x-amz-server-side-encryption-customer-algorithm"]),void 0!==e.headers["accept-ranges"]&&(n.AcceptRanges=e.headers["accept-ranges"]),void 0!==e.headers["x-amz-version-id"]&&(n.VersionId=e.headers["x-amz-version-id"]),void 0!==e.headers.expires&&(n.Expires=new Date(e.headers.expires)),void 0!==e.headers["x-amz-expiration"]&&(n.Expiration=e.headers["x-amz-expiration"]),void 0!==e.headers["x-amz-missing-meta"]&&(n.MissingMeta=parseInt(e.headers["x-amz-missing-meta"],10)),void 0!==e.headers["x-amz-replication-status"]&&(n.ReplicationStatus=e.headers["x-amz-replication-status"]),void 0!==e.headers["x-amz-tagging-count"]&&(n.TagCount=parseInt(e.headers["x-amz-tagging-count"],10)),void 0!==e.headers["x-amz-server-side-encryption-customer-key-md5"]&&(n.SSECustomerKeyMD5=e.headers["x-amz-server-side-encryption-customer-key-md5"]),void 0!==e.headers["last-modified"]&&(n.LastModified=new Date(e.headers["last-modified"])),void 0!==e.headers.etag&&(n.ETag=e.headers.etag),void 0!==e.headers["x-amz-request-charged"]&&(n.RequestCharged=e.headers["x-amz-request-charged"]),Object.keys(e.headers).forEach((function(t){void 0===n.Metadata&&(n.Metadata={}),t.startsWith("x-amz-meta-")&&(n.Metadata[t.substring(11)]=e.headers[t])})),r=e.body,n.Body=r,[2,Promise.resolve(n)])}))}))}(e,t)},t}(Zr.b),Yi=function(e){function t(t){var n=e.call(this)||this;return n.input=t,n}return c(t,e),t.prototype.resolveMiddleware=function(e,t,n){this.middlewareStack.use(Object(Vi.a)(t,this.serialize,this.deserialize)),this.middlewareStack.use(Hi(t));var r=e.concat(this.middlewareStack),i=t.logger,o={logger:i,clientName:"S3Client",commandName:"DeleteObjectCommand",inputFilterSensitiveLog:Z.filterSensitiveLog,outputFilterSensitiveLog:J.filterSensitiveLog};"function"==typeof i.info&&i.info({clientName:"S3Client",commandName:"DeleteObjectCommand"});var s=t.requestHandler;return r.resolve((function(e){return s.handle(e.request,n||{})}),o)},t.prototype.serialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,l;return d(this,(function(d){switch(d.label){case 0:if(n=f(f(f(f({"Content-Type":""},Mi(e.MFA)&&{"x-amz-mfa":e.MFA}),Mi(e.ExpectedBucketOwner)&&{"x-amz-expected-bucket-owner":e.ExpectedBucketOwner}),Mi(e.BypassGovernanceRetention)&&{"x-amz-bypass-governance-retention":e.BypassGovernanceRetention.toString()}),Mi(e.RequestPayer)&&{"x-amz-request-payer":e.RequestPayer}),r="/{Bucket}/{Key+}",void 0===e.Bucket)throw new Error("No value provided for input HTTP label: Bucket.");if((i=e.Bucket).length<=0)throw new Error("Empty value provided for input HTTP label: Bucket.");if(r=r.replace("{Bucket}",Object(Zr.f)(i)),void 0===e.Key)throw new Error("No value provided for input HTTP label: Key.");if((i=e.Key).length<=0)throw new Error("Empty value provided for input HTTP label: Key.");return r=r.replace("{Key+}",i.split("/").map((function(e){return Object(Zr.f)(e)})).join("/")),o=f({"x-id":"DeleteObject"},void 0!==e.VersionId&&{versionId:e.VersionId}),[4,t.endpoint()];case 1:return s=d.sent(),a=s.hostname,u=s.protocol,c=void 0===u?"https":u,l=s.port,[2,new Xr.a({protocol:c,hostname:a,port:l,method:"DELETE",headers:n,path:r,query:o,body:void 0})]}}))}))}(e,t)},t.prototype.deserialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n;return d(this,(function(r){switch(r.label){case 0:return 204!==e.statusCode&&e.statusCode>=300?[2,si(e,t)]:(n={$metadata:Si(e),DeleteMarker:void 0,RequestCharged:void 0,VersionId:void 0},void 0!==e.headers["x-amz-delete-marker"]&&(n.DeleteMarker="true"===e.headers["x-amz-delete-marker"]),void 0!==e.headers["x-amz-request-charged"]&&(n.RequestCharged=e.headers["x-amz-request-charged"]),void 0!==e.headers["x-amz-version-id"]&&(n.VersionId=e.headers["x-amz-version-id"]),[4,Ei(e.body,t)]);case 1:return r.sent(),[2,Promise.resolve(n)]}}))}))}(e,t)},t}(Zr.b),Ji=function(e){function t(t){var n=e.call(this)||this;return n.input=t,n}return c(t,e),t.prototype.resolveMiddleware=function(e,t,n){this.middlewareStack.use(Object(Vi.a)(t,this.serialize,this.deserialize)),this.middlewareStack.use(Hi(t));var r=e.concat(this.middlewareStack),i=t.logger,o={logger:i,clientName:"S3Client",commandName:"ListObjectsCommand",inputFilterSensitiveLog:Fn.filterSensitiveLog,outputFilterSensitiveLog:Bn.filterSensitiveLog};"function"==typeof i.info&&i.info({clientName:"S3Client",commandName:"ListObjectsCommand"});var s=t.requestHandler;return r.resolve((function(e){return s.handle(e.request,n||{})}),o)},t.prototype.serialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,l;return d(this,(function(d){switch(d.label){case 0:if(n=f(f({"Content-Type":""},Mi(e.ExpectedBucketOwner)&&{"x-amz-expected-bucket-owner":e.ExpectedBucketOwner}),Mi(e.RequestPayer)&&{"x-amz-request-payer":e.RequestPayer}),r="/{Bucket}",void 0===e.Bucket)throw new Error("No value provided for input HTTP label: Bucket.");if((i=e.Bucket).length<=0)throw new Error("Empty value provided for input HTTP label: Bucket.");return r=r.replace("{Bucket}",Object(Zr.f)(i)),o=f(f(f(f(f({},void 0!==e.MaxKeys&&{"max-keys":e.MaxKeys.toString()}),void 0!==e.Marker&&{marker:e.Marker}),void 0!==e.Prefix&&{prefix:e.Prefix}),void 0!==e.Delimiter&&{delimiter:e.Delimiter}),void 0!==e.EncodingType&&{"encoding-type":e.EncodingType}),[4,t.endpoint()];case 1:return s=d.sent(),a=s.hostname,u=s.protocol,c=void 0===u?"https":u,l=s.port,[2,new Xr.a({protocol:c,hostname:a,port:l,method:"GET",headers:n,path:r,query:o,body:void 0})]}}))}))}(e,t)},t.prototype.deserialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n,r;return d(this,(function(i){switch(i.label){case 0:return 200!==e.statusCode&&e.statusCode>=300?[2,ui(e,t)]:(n={$metadata:Si(e),CommonPrefixes:void 0,Contents:void 0,Delimiter:void 0,EncodingType:void 0,IsTruncated:void 0,Marker:void 0,MaxKeys:void 0,Name:void 0,NextMarker:void 0,Prefix:void 0},[4,Ai(e.body,t)]);case 1:return""===(r=i.sent()).CommonPrefixes&&(n.CommonPrefixes=[]),void 0!==r.CommonPrefixes&&(n.CommonPrefixes=mi(Object(Zr.g)(r.CommonPrefixes),t)),""===r.Contents&&(n.Contents=[]),void 0!==r.Contents&&(n.Contents=yi(Object(Zr.g)(r.Contents),t)),void 0!==r.Delimiter&&(n.Delimiter=r.Delimiter),void 0!==r.EncodingType&&(n.EncodingType=r.EncodingType),void 0!==r.IsTruncated&&(n.IsTruncated="true"==r.IsTruncated),void 0!==r.Marker&&(n.Marker=r.Marker),void 0!==r.MaxKeys&&(n.MaxKeys=parseInt(r.MaxKeys)),void 0!==r.Name&&(n.Name=r.Name),void 0!==r.NextMarker&&(n.NextMarker=r.NextMarker),void 0!==r.Prefix&&(n.Prefix=r.Prefix),[2,Promise.resolve(n)]}}))}))}(e,t)},t}(Zr.b),Zi=n(153),Xi=n(38),Qi=n(110),eo=n(18);function to(e,t,n){return void 0===n&&(n=1048576),new Promise((function(r,i){var o=new FileReader;o.addEventListener("error",i),o.addEventListener("abort",i);var s=e.size,a=0;function u(){a>=s?r():o.readAsArrayBuffer(e.slice(a,Math.min(s,a+n)))}o.addEventListener("load",(function(e){var n=e.target.result;t(new Uint8Array(n)),a+=n.byteLength,u()})),u()}))}var no=n(24),ro=n(15),io=[1732584193,4023233417,2562383102,271733878],oo=function(){function e(){this.state=Uint32Array.from(io),this.buffer=new DataView(new ArrayBuffer(64)),this.bufferLength=0,this.bytesHashed=0,this.finished=!1}return e.prototype.update=function(e){if(!function(e){if("string"==typeof e)return 0===e.length;return 0===e.byteLength}(e)){if(this.finished)throw new Error("Attempted to update an already finished hash.");var t=function(e){if("string"==typeof e)return Object(ro.a)(e);if(ArrayBuffer.isView(e))return new Uint8Array(e.buffer,e.byteOffset,e.byteLength/Uint8Array.BYTES_PER_ELEMENT);return new Uint8Array(e)}(e),n=0,r=t.byteLength;for(this.bytesHashed+=r;r>0;)this.buffer.setUint8(this.bufferLength++,t[n++]),r--,64===this.bufferLength&&(this.hashBuffer(),this.bufferLength=0)}},e.prototype.digest=function(){return Object(Qr.__awaiter)(this,void 0,void 0,(function(){var e,t,n,r,i,o,s;return Object(Qr.__generator)(this,(function(a){if(!this.finished){if(t=(e=this).buffer,n=e.bufferLength,r=e.bytesHashed,i=8*r,t.setUint8(this.bufferLength++,128),n%64>=56){for(s=this.bufferLength;s<64;s++)t.setUint8(s,0);this.hashBuffer(),this.bufferLength=0}for(s=this.bufferLength;s<56;s++)t.setUint8(s,0);t.setUint32(56,i>>>0,!0),t.setUint32(60,Math.floor(i/4294967296),!0),this.hashBuffer(),this.finished=!0}for(o=new DataView(new ArrayBuffer(16)),s=0;s<4;s++)o.setUint32(4*s,this.state[s],!0);return[2,new Uint8Array(o.buffer,o.byteOffset,o.byteLength)]}))}))},e.prototype.hashBuffer=function(){var e=this.buffer,t=this.state,n=t[0],r=t[1],i=t[2],o=t[3];n=ao(n,r,i,o,e.getUint32(0,!0),7,3614090360),o=ao(o,n,r,i,e.getUint32(4,!0),12,3905402710),i=ao(i,o,n,r,e.getUint32(8,!0),17,606105819),r=ao(r,i,o,n,e.getUint32(12,!0),22,3250441966),n=ao(n,r,i,o,e.getUint32(16,!0),7,4118548399),o=ao(o,n,r,i,e.getUint32(20,!0),12,1200080426),i=ao(i,o,n,r,e.getUint32(24,!0),17,2821735955),r=ao(r,i,o,n,e.getUint32(28,!0),22,4249261313),n=ao(n,r,i,o,e.getUint32(32,!0),7,1770035416),o=ao(o,n,r,i,e.getUint32(36,!0),12,2336552879),i=ao(i,o,n,r,e.getUint32(40,!0),17,4294925233),r=ao(r,i,o,n,e.getUint32(44,!0),22,2304563134),n=ao(n,r,i,o,e.getUint32(48,!0),7,1804603682),o=ao(o,n,r,i,e.getUint32(52,!0),12,4254626195),i=ao(i,o,n,r,e.getUint32(56,!0),17,2792965006),n=uo(n,r=ao(r,i,o,n,e.getUint32(60,!0),22,1236535329),i,o,e.getUint32(4,!0),5,4129170786),o=uo(o,n,r,i,e.getUint32(24,!0),9,3225465664),i=uo(i,o,n,r,e.getUint32(44,!0),14,643717713),r=uo(r,i,o,n,e.getUint32(0,!0),20,3921069994),n=uo(n,r,i,o,e.getUint32(20,!0),5,3593408605),o=uo(o,n,r,i,e.getUint32(40,!0),9,38016083),i=uo(i,o,n,r,e.getUint32(60,!0),14,3634488961),r=uo(r,i,o,n,e.getUint32(16,!0),20,3889429448),n=uo(n,r,i,o,e.getUint32(36,!0),5,568446438),o=uo(o,n,r,i,e.getUint32(56,!0),9,3275163606),i=uo(i,o,n,r,e.getUint32(12,!0),14,4107603335),r=uo(r,i,o,n,e.getUint32(32,!0),20,1163531501),n=uo(n,r,i,o,e.getUint32(52,!0),5,2850285829),o=uo(o,n,r,i,e.getUint32(8,!0),9,4243563512),i=uo(i,o,n,r,e.getUint32(28,!0),14,1735328473),n=co(n,r=uo(r,i,o,n,e.getUint32(48,!0),20,2368359562),i,o,e.getUint32(20,!0),4,4294588738),o=co(o,n,r,i,e.getUint32(32,!0),11,2272392833),i=co(i,o,n,r,e.getUint32(44,!0),16,1839030562),r=co(r,i,o,n,e.getUint32(56,!0),23,4259657740),n=co(n,r,i,o,e.getUint32(4,!0),4,2763975236),o=co(o,n,r,i,e.getUint32(16,!0),11,1272893353),i=co(i,o,n,r,e.getUint32(28,!0),16,4139469664),r=co(r,i,o,n,e.getUint32(40,!0),23,3200236656),n=co(n,r,i,o,e.getUint32(52,!0),4,681279174),o=co(o,n,r,i,e.getUint32(0,!0),11,3936430074),i=co(i,o,n,r,e.getUint32(12,!0),16,3572445317),r=co(r,i,o,n,e.getUint32(24,!0),23,76029189),n=co(n,r,i,o,e.getUint32(36,!0),4,3654602809),o=co(o,n,r,i,e.getUint32(48,!0),11,3873151461),i=co(i,o,n,r,e.getUint32(60,!0),16,530742520),n=fo(n,r=co(r,i,o,n,e.getUint32(8,!0),23,3299628645),i,o,e.getUint32(0,!0),6,4096336452),o=fo(o,n,r,i,e.getUint32(28,!0),10,1126891415),i=fo(i,o,n,r,e.getUint32(56,!0),15,2878612391),r=fo(r,i,o,n,e.getUint32(20,!0),21,4237533241),n=fo(n,r,i,o,e.getUint32(48,!0),6,1700485571),o=fo(o,n,r,i,e.getUint32(12,!0),10,2399980690),i=fo(i,o,n,r,e.getUint32(40,!0),15,4293915773),r=fo(r,i,o,n,e.getUint32(4,!0),21,2240044497),n=fo(n,r,i,o,e.getUint32(32,!0),6,1873313359),o=fo(o,n,r,i,e.getUint32(60,!0),10,4264355552),i=fo(i,o,n,r,e.getUint32(24,!0),15,2734768916),r=fo(r,i,o,n,e.getUint32(52,!0),21,1309151649),n=fo(n,r,i,o,e.getUint32(16,!0),6,4149444226),o=fo(o,n,r,i,e.getUint32(44,!0),10,3174756917),i=fo(i,o,n,r,e.getUint32(8,!0),15,718787259),r=fo(r,i,o,n,e.getUint32(36,!0),21,3951481745),t[0]=n+t[0]&4294967295,t[1]=r+t[1]&4294967295,t[2]=i+t[2]&4294967295,t[3]=o+t[3]&4294967295},e}();function so(e,t,n,r,i,o){return((t=(t+e&4294967295)+(r+o&4294967295)&4294967295)<>>32-i)+n&4294967295}function ao(e,t,n,r,i,o,s){return so(t&n|~t&r,e,t,i,o,s)}function uo(e,t,n,r,i,o,s){return so(t&r|n&~r,e,t,i,o,s)}function co(e,t,n,r,i,o,s){return so(t^n^r,e,t,i,o,s)}function fo(e,t,n,r,i,o,s){return so(n^(t|~r),e,t,i,o,s)}var lo=n(11),ho=n(39),po=n(17),vo=n(40),go=n(41),mo=new Set(["ap-east-1","ap-northeast-1","ap-northeast-2","ap-south-1","ap-southeast-1","ap-southeast-2","ca-central-1","eu-central-1","eu-north-1","eu-west-1","eu-west-2","eu-west-3","me-south-1","sa-east-1","us-east-1","us-east-2","us-west-1","us-west-2"]),bo=new Set(["cn-north-1","cn-northwest-1"]),yo=new Set(["us-iso-east-1"]),wo=new Set(["us-isob-east-1"]),_o=new Set(["us-gov-east-1","us-gov-west-1"]),So=f(f({},{apiVersion:"2006-03-01",disableHostPrefix:!1,logger:{},regionInfoProvider:function(e,t){var n=void 0;switch(e){case"ap-east-1":n={hostname:"s3.ap-east-1.amazonaws.com",partition:"aws"};break;case"ap-northeast-1":n={hostname:"s3.ap-northeast-1.amazonaws.com",partition:"aws"};break;case"ap-northeast-2":n={hostname:"s3.ap-northeast-2.amazonaws.com",partition:"aws"};break;case"ap-south-1":n={hostname:"s3.ap-south-1.amazonaws.com",partition:"aws"};break;case"ap-southeast-1":n={hostname:"s3.ap-southeast-1.amazonaws.com",partition:"aws"};break;case"ap-southeast-2":n={hostname:"s3.ap-southeast-2.amazonaws.com",partition:"aws"};break;case"ca-central-1":n={hostname:"s3.ca-central-1.amazonaws.com",partition:"aws"};break;case"cn-north-1":n={hostname:"s3.cn-north-1.amazonaws.com.cn",partition:"aws-cn"};break;case"cn-northwest-1":n={hostname:"s3.cn-northwest-1.amazonaws.com.cn",partition:"aws-cn"};break;case"eu-central-1":n={hostname:"s3.eu-central-1.amazonaws.com",partition:"aws"};break;case"eu-north-1":n={hostname:"s3.eu-north-1.amazonaws.com",partition:"aws"};break;case"eu-west-1":n={hostname:"s3.eu-west-1.amazonaws.com",partition:"aws"};break;case"eu-west-2":n={hostname:"s3.eu-west-2.amazonaws.com",partition:"aws"};break;case"eu-west-3":n={hostname:"s3.eu-west-3.amazonaws.com",partition:"aws"};break;case"fips-us-gov-west-1":n={hostname:"s3-fips-us-gov-west-1.amazonaws.com",partition:"aws-us-gov",signingRegion:"us-gov-west-1"};break;case"me-south-1":n={hostname:"s3.me-south-1.amazonaws.com",partition:"aws"};break;case"s3-external-1":n={hostname:"s3-external-1.amazonaws.com",partition:"aws",signingRegion:"us-east-1"};break;case"sa-east-1":n={hostname:"s3.sa-east-1.amazonaws.com",partition:"aws"};break;case"us-east-1":n={hostname:"s3.amazonaws.com",partition:"aws"};break;case"us-east-2":n={hostname:"s3.us-east-2.amazonaws.com",partition:"aws"};break;case"us-gov-east-1":n={hostname:"s3.us-gov-east-1.amazonaws.com",partition:"aws-us-gov"};break;case"us-gov-west-1":n={hostname:"s3.us-gov-west-1.amazonaws.com",partition:"aws-us-gov"};break;case"us-iso-east-1":n={hostname:"s3.us-iso-east-1.c2s.ic.gov",partition:"aws-iso"};break;case"us-isob-east-1":n={hostname:"s3.us-isob-east-1.sc2s.sgov.gov",partition:"aws-iso-b"};break;case"us-west-1":n={hostname:"s3.us-west-1.amazonaws.com",partition:"aws"};break;case"us-west-2":n={hostname:"s3.us-west-2.amazonaws.com",partition:"aws"};break;default:mo.has(e)&&(n={hostname:"s3.{region}.amazonaws.com".replace("{region}",e),partition:"aws"}),bo.has(e)&&(n={hostname:"s3.{region}.amazonaws.com.cn".replace("{region}",e),partition:"aws-cn"}),yo.has(e)&&(n={hostname:"s3.{region}.c2s.ic.gov".replace("{region}",e),partition:"aws-iso"}),wo.has(e)&&(n={hostname:"s3.{region}.sc2s.sgov.gov".replace("{region}",e),partition:"aws-iso-b"}),_o.has(e)&&(n={hostname:"s3.{region}.amazonaws.com".replace("{region}",e),partition:"aws-us-gov"}),void 0===n&&(n={hostname:"s3.{region}.amazonaws.com".replace("{region}",e),partition:"aws"})}return Promise.resolve(n)},signingEscapePath:!1,signingName:"s3",useArnRegion:!1}),{runtime:"browser",base64Decoder:po.a,base64Encoder:po.b,bodyLengthChecker:vo.a,credentialDefaultProvider:Object(no.a)("Credential is missing"),defaultUserAgent:Object(go.a)(Zi.name,Zi.version),eventStreamSerdeProvider:Qi.a,maxAttempts:lo.a,md5:oo,region:Object(no.a)("Region is missing"),requestHandler:new eo.a,sha256:Xi.Sha256,streamCollector:eo.b,streamHasher:function(e,t){return Object(Qr.__awaiter)(this,void 0,void 0,(function(){var n;return Object(Qr.__generator)(this,(function(r){switch(r.label){case 0:return n=new e,[4,to(t,(function(e){n.update(e)}))];case 1:return r.sent(),[2,n.digest()]}}))}))},urlParser:ho.a,utf8Decoder:ro.a,utf8Encoder:ro.b}),Eo=n(22),Mo=n(112),Ao=n(37);var Io={step:"build",tags:["SET_EXPECT_HEADER","EXPECT_HEADER"],name:"addExpectContinueMiddleware"},ko=function(e){return{applyToStack:function(t){t.add(function(e){var t=this;return function(n){return function(r){return Object(Qr.__awaiter)(t,void 0,void 0,(function(){var t;return Object(Qr.__generator)(this,(function(i){return t=r.request,Xr.a.isInstance(t)&&t.body&&"node"===e.runtime&&(t.headers=Object(Qr.__assign)(Object(Qr.__assign)({},t.headers),{Expect:"100-continue"})),[2,n(Object(Qr.__assign)(Object(Qr.__assign)({},r),{request:t}))]}))}))}}}(e),Io)}}},Oo=n(21),xo=n(43);var Co={step:"initialize",tags:["VALIDATE_BUCKET_NAME"],name:"validateBucketNameMiddleware"},To=function(e){return{applyToStack:function(e){e.add(function(){var e=this;return function(t){return function(n){return Object(Qr.__awaiter)(e,void 0,void 0,(function(){var e,r;return Object(Qr.__generator)(this,(function(i){if("string"==typeof(e=n.input.Bucket)&&!ki(e)&&e.indexOf("/")>=0)throw(r=new Error("Bucket name shouldn't contain '/', received '"+e+"'")).name="InvalidBucketName",r;return[2,t(Object(Qr.__assign)({},n))]}))}))}}}(),Co)}}},Po={step:"build",tags:["USE_REGIONAL_ENDPOINT","S3"],name:"useRegionalEndpointMiddleware"},No=function(e){return{applyToStack:function(t){t.add(function(e){return function(t){return function(n){return Object(Qr.__awaiter)(void 0,void 0,void 0,(function(){var r,i;return Object(Qr.__generator)(this,(function(o){switch(o.label){case 0:return r=n.request,!Xr.a.isInstance(r)||e.isCustomEndpoint?[2,t(Object(Qr.__assign)({},n))]:"s3.amazonaws.com"!==r.hostname?[3,1]:(r.hostname="s3.us-east-1.amazonaws.com",[3,3]);case 1:return i="aws-global",[4,e.region()];case 2:i===o.sent()&&(r.hostname="s3.amazonaws.com"),o.label=3;case 3:return[2,t(Object(Qr.__assign)({},n))]}}))}))}}}(e),Po)}}},Ro=n(25),Lo=n(23),jo=function(e){function t(t){var n,r,i,o,s,a,u,c,l,d,h,p=this,v=f(f({},So),t),g=Object(Eo.b)(v),m=Object(Eo.a)(g),b=Object(Ro.b)(m),y=Object(lo.c)(b),w=Object(Lo.b)(y),_=(r=(n=w).bucketEndpoint,i=void 0!==r&&r,o=n.forcePathStyle,s=void 0!==o&&o,a=n.useAccelerateEndpoint,u=void 0!==a&&a,c=n.useDualstackEndpoint,l=void 0!==c&&c,d=n.useArnRegion,h=void 0!==d&&d,Object(Qr.__assign)(Object(Qr.__assign)({},n),{bucketEndpoint:i,forcePathStyle:s,useAccelerateEndpoint:u,useDualstackEndpoint:l,useArnRegion:"function"==typeof h?h:function(){return Promise.resolve(h)}})),S=Object(Oo.b)(_),E=Object(Mo.a)(S);return(p=e.call(this,E)||this).config=E,p.middlewareStack.use(Object(Ro.a)(p.config)),p.middlewareStack.use(Object(lo.b)(p.config)),p.middlewareStack.use(Object(Lo.a)(p.config)),p.middlewareStack.use(Object(Ao.a)(p.config)),p.middlewareStack.use(To(p.config)),p.middlewareStack.use(No(p.config)),p.middlewareStack.use(ko(p.config)),p.middlewareStack.use(Object(Oo.a)(p.config)),p.middlewareStack.use(Object(xo.a)(p.config)),p}return c(t,e),t.prototype.destroy=function(){e.prototype.destroy.call(this)},t}(Zr.a),Do=n(74);function Uo(e){var t=e.port,n=e.query,r=e.protocol,i=e.path,o=e.hostname;r&&":"!==r.substr(-1)&&(r+=":"),t&&(o+=":"+t),i&&"/"!==i.charAt(0)&&(i="/"+i);var s=n?Object(Do.a)(n):"";return s&&"?"!==s[0]&&(s="?"+s),r+"//"+o+i+s}function Bo(e,t){return Object(Qr.__awaiter)(this,void 0,void 0,(function(){var n,r,i=this;return Object(Qr.__generator)(this,(function(o){switch(o.label){case 0:return n=function(e){return function(e){return Object(Qr.__awaiter)(i,void 0,void 0,(function(){return Object(Qr.__generator)(this,(function(t){return[2,{output:{request:e.request},response:void 0}]}))}))}},(r=e.middlewareStack.clone()).add(n,{step:"build",priority:"low"}),[4,t.resolveMiddleware(r,e.config,void 0)(t).then((function(e){return e.output.request}))];case 1:return[2,o.sent()]}}))}))}var Fo=n(111),zo=function(){function e(e){var t=Object(Qr.__assign)({service:e.signingName||e.service||"s3",uriEscapePath:e.uriEscapePath||!1},e);this.signer=new Fo.a(t)}return e.prototype.presign=function(e,t){void 0===t&&(t={});var n=t.unsignableHeaders,r=void 0===n?new Set:n,i=Object(Qr.__rest)(t,["unsignableHeaders"]);return Object(Qr.__awaiter)(this,void 0,void 0,(function(){return Object(Qr.__generator)(this,(function(t){return r.add("content-type"),e.headers["X-Amz-Content-Sha256"]="UNSIGNED-PAYLOAD",[2,this.signer.presign(e,Object(Qr.__assign)({expiresIn:900,unsignableHeaders:r},i))]}))}))},e}(),qo=n(64),Ko=n.n(qo),Ho=new r.a("axios-http-handler"),Vo=function(){function e(e,t){void 0===e&&(e={}),this.httpOptions=e,this.emitter=t}return e.prototype.destroy=function(){},e.prototype.handle=function(e,t){var n=this.httpOptions.requestTimeout,r=this.emitter,i=e.path;if(e.query){var o=Object(Do.a)(e.query);o&&(i+="?"+o)}var s=e.port,a=e.protocol+"//"+e.hostname+(s?":"+s:"")+i,u={};u.url=a,u.method=e.method,u.headers=e.headers,delete u.headers.host,e.body?u.data=e.body:u.headers["Content-Type"]&&(u.data=null),r&&(u.onUploadProgress=function(e){r.emit("sendProgress",e),Ho.debug(e)}),u.responseType="blob";var c=[Ko.a.request(u).then((function(e){return{response:new Xr.b({headers:e.headers,statusCode:e.status,body:e.data})}})).catch((function(e){throw Ho.error(e),e})),Go(n)];return Promise.race(c)},e}();function Go(e){return void 0===e&&(e=0),new Promise((function(t,n){e&&setTimeout((function(){var t=new Error("Request did not complete within "+e+" ms");t.name="TimeoutError",n(t)}),e)}))}var Wo,$o,Yo,Jo,Zo,Xo,Qo,es,ts,ns,rs,is,os,ss,as,us,cs,fs,ls,ds,hs=function(e){function t(t){var n=e.call(this)||this;return n.input=t,n}return c(t,e),t.prototype.resolveMiddleware=function(e,t,n){this.middlewareStack.use(Object(Vi.a)(t,this.serialize,this.deserialize)),this.middlewareStack.use(Wi(t)),this.middlewareStack.use(Hi(t));var r=e.concat(this.middlewareStack),i=t.logger,o={logger:i,clientName:"S3Client",commandName:"PutObjectCommand",inputFilterSensitiveLog:_r.filterSensitiveLog,outputFilterSensitiveLog:wr.filterSensitiveLog};"function"==typeof i.info&&i.info({clientName:"S3Client",commandName:"PutObjectCommand"});var s=t.requestHandler;return r.resolve((function(e){return s.handle(e.request,n||{})}),o)},t.prototype.serialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,l,h,p;return d(this,(function(d){switch(d.label){case 0:if(n=f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f({"Content-Type":"application/octet-stream"},Mi(e.GrantFullControl)&&{"x-amz-grant-full-control":e.GrantFullControl}),Mi(e.ContentEncoding)&&{"Content-Encoding":e.ContentEncoding}),Mi(e.RequestPayer)&&{"x-amz-request-payer":e.RequestPayer}),Mi(e.GrantReadACP)&&{"x-amz-grant-read-acp":e.GrantReadACP}),Mi(e.SSECustomerKeyMD5)&&{"x-amz-server-side-encryption-customer-key-MD5":e.SSECustomerKeyMD5}),Mi(e.CacheControl)&&{"Cache-Control":e.CacheControl}),Mi(e.WebsiteRedirectLocation)&&{"x-amz-website-redirect-location":e.WebsiteRedirectLocation}),Mi(e.ObjectLockLegalHoldStatus)&&{"x-amz-object-lock-legal-hold":e.ObjectLockLegalHoldStatus}),Mi(e.GrantWriteACP)&&{"x-amz-grant-write-acp":e.GrantWriteACP}),Mi(e.ContentLength)&&{"Content-Length":e.ContentLength.toString()}),Mi(e.ObjectLockRetainUntilDate)&&{"x-amz-object-lock-retain-until-date":(e.ObjectLockRetainUntilDate.toISOString().split(".")[0]+"Z").toString()}),Mi(e.SSECustomerAlgorithm)&&{"x-amz-server-side-encryption-customer-algorithm":e.SSECustomerAlgorithm}),Mi(e.ContentDisposition)&&{"Content-Disposition":e.ContentDisposition}),Mi(e.SSECustomerKey)&&{"x-amz-server-side-encryption-customer-key":e.SSECustomerKey}),Mi(e.SSEKMSEncryptionContext)&&{"x-amz-server-side-encryption-context":e.SSEKMSEncryptionContext}),Mi(e.Tagging)&&{"x-amz-tagging":e.Tagging}),Mi(e.Expires)&&{Expires:Object(Zr.e)(e.Expires).toString()}),Mi(e.StorageClass)&&{"x-amz-storage-class":e.StorageClass}),Mi(e.ExpectedBucketOwner)&&{"x-amz-expected-bucket-owner":e.ExpectedBucketOwner}),Mi(e.ContentMD5)&&{"Content-MD5":e.ContentMD5}),Mi(e.ServerSideEncryption)&&{"x-amz-server-side-encryption":e.ServerSideEncryption}),Mi(e.ObjectLockMode)&&{"x-amz-object-lock-mode":e.ObjectLockMode}),Mi(e.SSEKMSKeyId)&&{"x-amz-server-side-encryption-aws-kms-key-id":e.SSEKMSKeyId}),Mi(e.ContentLanguage)&&{"Content-Language":e.ContentLanguage}),Mi(e.GrantRead)&&{"x-amz-grant-read":e.GrantRead}),Mi(e.ACL)&&{"x-amz-acl":e.ACL}),Mi(e.ContentType)&&{"Content-Type":e.ContentType}),void 0!==e.Metadata&&Object.keys(e.Metadata).reduce((function(t,n){return t["x-amz-meta-"+n]=e.Metadata[n],t}),{})),r="/{Bucket}/{Key+}",void 0===e.Bucket)throw new Error("No value provided for input HTTP label: Bucket.");if((i=e.Bucket).length<=0)throw new Error("Empty value provided for input HTTP label: Bucket.");if(r=r.replace("{Bucket}",Object(Zr.f)(i)),void 0===e.Key)throw new Error("No value provided for input HTTP label: Key.");if((i=e.Key).length<=0)throw new Error("Empty value provided for input HTTP label: Key.");return r=r.replace("{Key+}",i.split("/").map((function(e){return Object(Zr.f)(e)})).join("/")),o={"x-id":"PutObject"},void 0!==e.Body&&(a=e.Body,s=a),[4,t.endpoint()];case 1:return u=d.sent(),c=u.hostname,l=u.protocol,h=void 0===l?"https":l,p=u.port,[2,new Xr.a({protocol:h,hostname:c,port:p,method:"PUT",headers:n,path:r,query:o,body:s})]}}))}))}(e,t)},t.prototype.deserialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n;return d(this,(function(r){switch(r.label){case 0:return 200!==e.statusCode&&e.statusCode>=300?[2,fi(e,t)]:(n={$metadata:Si(e),ETag:void 0,Expiration:void 0,RequestCharged:void 0,SSECustomerAlgorithm:void 0,SSECustomerKeyMD5:void 0,SSEKMSEncryptionContext:void 0,SSEKMSKeyId:void 0,ServerSideEncryption:void 0,VersionId:void 0},void 0!==e.headers["x-amz-server-side-encryption-context"]&&(n.SSEKMSEncryptionContext=e.headers["x-amz-server-side-encryption-context"]),void 0!==e.headers["x-amz-expiration"]&&(n.Expiration=e.headers["x-amz-expiration"]),void 0!==e.headers["x-amz-server-side-encryption-customer-key-md5"]&&(n.SSECustomerKeyMD5=e.headers["x-amz-server-side-encryption-customer-key-md5"]),void 0!==e.headers.etag&&(n.ETag=e.headers.etag),void 0!==e.headers["x-amz-server-side-encryption-customer-algorithm"]&&(n.SSECustomerAlgorithm=e.headers["x-amz-server-side-encryption-customer-algorithm"]),void 0!==e.headers["x-amz-version-id"]&&(n.VersionId=e.headers["x-amz-version-id"]),void 0!==e.headers["x-amz-request-charged"]&&(n.RequestCharged=e.headers["x-amz-request-charged"]),void 0!==e.headers["x-amz-server-side-encryption-aws-kms-key-id"]&&(n.SSEKMSKeyId=e.headers["x-amz-server-side-encryption-aws-kms-key-id"]),void 0!==e.headers["x-amz-server-side-encryption"]&&(n.ServerSideEncryption=e.headers["x-amz-server-side-encryption"]),[4,Ei(e.body,t)]);case 1:return r.sent(),[2,Promise.resolve(n)]}}))}))}(e,t)},t}(Zr.b),ps=function(e){function t(t){var n=e.call(this)||this;return n.input=t,n}return c(t,e),t.prototype.resolveMiddleware=function(e,t,n){this.middlewareStack.use(Object(Vi.a)(t,this.serialize,this.deserialize)),this.middlewareStack.use(Wi(t)),this.middlewareStack.use(Hi(t));var r=e.concat(this.middlewareStack),i=t.logger,o={logger:i,clientName:"S3Client",commandName:"CreateMultipartUploadCommand",inputFilterSensitiveLog:D.filterSensitiveLog,outputFilterSensitiveLog:j.filterSensitiveLog};"function"==typeof i.info&&i.info({clientName:"S3Client",commandName:"CreateMultipartUploadCommand"});var s=t.requestHandler;return r.resolve((function(e){return s.handle(e.request,n||{})}),o)},t.prototype.serialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,l;return d(this,(function(d){switch(d.label){case 0:if(n=f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f({"Content-Type":""},Mi(e.GrantFullControl)&&{"x-amz-grant-full-control":e.GrantFullControl}),Mi(e.SSECustomerKeyMD5)&&{"x-amz-server-side-encryption-customer-key-MD5":e.SSECustomerKeyMD5}),Mi(e.SSECustomerAlgorithm)&&{"x-amz-server-side-encryption-customer-algorithm":e.SSECustomerAlgorithm}),Mi(e.SSEKMSKeyId)&&{"x-amz-server-side-encryption-aws-kms-key-id":e.SSEKMSKeyId}),Mi(e.ObjectLockLegalHoldStatus)&&{"x-amz-object-lock-legal-hold":e.ObjectLockLegalHoldStatus}),Mi(e.RequestPayer)&&{"x-amz-request-payer":e.RequestPayer}),Mi(e.GrantRead)&&{"x-amz-grant-read":e.GrantRead}),Mi(e.GrantWriteACP)&&{"x-amz-grant-write-acp":e.GrantWriteACP}),Mi(e.WebsiteRedirectLocation)&&{"x-amz-website-redirect-location":e.WebsiteRedirectLocation}),Mi(e.ContentType)&&{"Content-Type":e.ContentType}),Mi(e.ContentLanguage)&&{"Content-Language":e.ContentLanguage}),Mi(e.CacheControl)&&{"Cache-Control":e.CacheControl}),Mi(e.GrantReadACP)&&{"x-amz-grant-read-acp":e.GrantReadACP}),Mi(e.Tagging)&&{"x-amz-tagging":e.Tagging}),Mi(e.SSEKMSEncryptionContext)&&{"x-amz-server-side-encryption-context":e.SSEKMSEncryptionContext}),Mi(e.ACL)&&{"x-amz-acl":e.ACL}),Mi(e.SSECustomerKey)&&{"x-amz-server-side-encryption-customer-key":e.SSECustomerKey}),Mi(e.ExpectedBucketOwner)&&{"x-amz-expected-bucket-owner":e.ExpectedBucketOwner}),Mi(e.Expires)&&{Expires:Object(Zr.e)(e.Expires).toString()}),Mi(e.ObjectLockRetainUntilDate)&&{"x-amz-object-lock-retain-until-date":(e.ObjectLockRetainUntilDate.toISOString().split(".")[0]+"Z").toString()}),Mi(e.ServerSideEncryption)&&{"x-amz-server-side-encryption":e.ServerSideEncryption}),Mi(e.ContentDisposition)&&{"Content-Disposition":e.ContentDisposition}),Mi(e.ObjectLockMode)&&{"x-amz-object-lock-mode":e.ObjectLockMode}),Mi(e.StorageClass)&&{"x-amz-storage-class":e.StorageClass}),Mi(e.ContentEncoding)&&{"Content-Encoding":e.ContentEncoding}),void 0!==e.Metadata&&Object.keys(e.Metadata).reduce((function(t,n){return t["x-amz-meta-"+n]=e.Metadata[n],t}),{})),r="/{Bucket}/{Key+}",void 0===e.Bucket)throw new Error("No value provided for input HTTP label: Bucket.");if((i=e.Bucket).length<=0)throw new Error("Empty value provided for input HTTP label: Bucket.");if(r=r.replace("{Bucket}",Object(Zr.f)(i)),void 0===e.Key)throw new Error("No value provided for input HTTP label: Key.");if((i=e.Key).length<=0)throw new Error("Empty value provided for input HTTP label: Key.");return r=r.replace("{Key+}",i.split("/").map((function(e){return Object(Zr.f)(e)})).join("/")),o={uploads:""},[4,t.endpoint()];case 1:return s=d.sent(),a=s.hostname,u=s.protocol,c=void 0===u?"https":u,l=s.port,[2,new Xr.a({protocol:c,hostname:a,port:l,method:"POST",headers:n,path:r,query:o,body:void 0})]}}))}))}(e,t)},t.prototype.deserialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n,r;return d(this,(function(i){switch(i.label){case 0:return 200!==e.statusCode&&e.statusCode>=300?[2,oi(e,t)]:(n={$metadata:Si(e),AbortDate:void 0,AbortRuleId:void 0,Bucket:void 0,Key:void 0,RequestCharged:void 0,SSECustomerAlgorithm:void 0,SSECustomerKeyMD5:void 0,SSEKMSEncryptionContext:void 0,SSEKMSKeyId:void 0,ServerSideEncryption:void 0,UploadId:void 0},void 0!==e.headers["x-amz-server-side-encryption-context"]&&(n.SSEKMSEncryptionContext=e.headers["x-amz-server-side-encryption-context"]),void 0!==e.headers["x-amz-server-side-encryption"]&&(n.ServerSideEncryption=e.headers["x-amz-server-side-encryption"]),void 0!==e.headers["x-amz-request-charged"]&&(n.RequestCharged=e.headers["x-amz-request-charged"]),void 0!==e.headers["x-amz-abort-date"]&&(n.AbortDate=new Date(e.headers["x-amz-abort-date"])),void 0!==e.headers["x-amz-server-side-encryption-customer-algorithm"]&&(n.SSECustomerAlgorithm=e.headers["x-amz-server-side-encryption-customer-algorithm"]),void 0!==e.headers["x-amz-server-side-encryption-aws-kms-key-id"]&&(n.SSEKMSKeyId=e.headers["x-amz-server-side-encryption-aws-kms-key-id"]),void 0!==e.headers["x-amz-abort-rule-id"]&&(n.AbortRuleId=e.headers["x-amz-abort-rule-id"]),void 0!==e.headers["x-amz-server-side-encryption-customer-key-md5"]&&(n.SSECustomerKeyMD5=e.headers["x-amz-server-side-encryption-customer-key-md5"]),[4,Ai(e.body,t)]);case 1:return void 0!==(r=i.sent()).Bucket&&(n.Bucket=r.Bucket),void 0!==r.Key&&(n.Key=r.Key),void 0!==r.UploadId&&(n.UploadId=r.UploadId),[2,Promise.resolve(n)]}}))}))}(e,t)},t}(Zr.b);!function(e){e.SELECT="SELECT"}(Wo||(Wo={})),($o||($o={})).filterSensitiveLog=function(e){return f(f({},e),e.OutputLocation&&{OutputLocation:Br.filterSensitiveLog(e.OutputLocation)})},(Yo||(Yo={})).filterSensitiveLog=function(e){return f(f({},e),e.RestoreRequest&&{RestoreRequest:$o.filterSensitiveLog(e.RestoreRequest)})},(Jo||(Jo={})).filterSensitiveLog=function(e){return f({},e)},(Zo||(Zo={})).filterSensitiveLog=function(e){return f({},e)},(Xo||(Xo={})).filterSensitiveLog=function(e){return f({},e)},(Qo||(Qo={})).filterSensitiveLog=function(e){return f({},e)},(es||(es={})).filterSensitiveLog=function(e){return f({},e)},(ts||(ts={})).filterSensitiveLog=function(e){return f({},e)},(ns||(ns={})).filterSensitiveLog=function(e){return f({},e)},function(e){e.visit=function(e,t){return void 0!==e.Cont?t.Cont(e.Cont):void 0!==e.Progress?t.Progress(e.Progress):void 0!==e.Stats?t.Stats(e.Stats):void 0!==e.End?t.End(e.End):void 0!==e.Records?t.Records(e.Records):t._(e.$unknown[0],e.$unknown[1])},e.filterSensitiveLog=function(e){var t;return void 0!==e.Cont?{Cont:Jo.filterSensitiveLog(e.Cont)}:void 0!==e.Progress?{Progress:Qo.filterSensitiveLog(e.Progress)}:void 0!==e.Stats?{Stats:ns.filterSensitiveLog(e.Stats)}:void 0!==e.End?{End:Zo.filterSensitiveLog(e.End)}:void 0!==e.Records?{Records:es.filterSensitiveLog(e.Records)}:void 0!==e.$unknown?((t={})[e.$unknown[0]]="UNKNOWN",t):void 0}}(rs||(rs={})),(is||(is={})).filterSensitiveLog=function(e){return f(f({},e),e.Payload&&{Payload:"STREAMING_CONTENT"})},(os||(os={})).filterSensitiveLog=function(e){return f({},e)},(ss||(ss={})).filterSensitiveLog=function(e){return f({},e)},(as||(as={})).filterSensitiveLog=function(e){return f(f({},e),e.SSECustomerKey&&{SSECustomerKey:Zr.d})},(us||(us={})).filterSensitiveLog=function(e){return f(f({},e),e.SSEKMSKeyId&&{SSEKMSKeyId:Zr.d})},(cs||(cs={})).filterSensitiveLog=function(e){return f(f({},e),e.SSECustomerKey&&{SSECustomerKey:Zr.d})},(fs||(fs={})).filterSensitiveLog=function(e){return f({},e)},(ls||(ls={})).filterSensitiveLog=function(e){return f(f({},e),e.SSEKMSKeyId&&{SSEKMSKeyId:Zr.d})},(ds||(ds={})).filterSensitiveLog=function(e){return f(f(f({},e),e.SSECustomerKey&&{SSECustomerKey:Zr.d}),e.CopySourceSSECustomerKey&&{CopySourceSSECustomerKey:Zr.d})};var vs=function(e){function t(t){var n=e.call(this)||this;return n.input=t,n}return c(t,e),t.prototype.resolveMiddleware=function(e,t,n){this.middlewareStack.use(Object(Vi.a)(t,this.serialize,this.deserialize)),this.middlewareStack.use(Wi(t)),this.middlewareStack.use(Hi(t));var r=e.concat(this.middlewareStack),i=t.logger,o={logger:i,clientName:"S3Client",commandName:"UploadPartCommand",inputFilterSensitiveLog:cs.filterSensitiveLog,outputFilterSensitiveLog:us.filterSensitiveLog};"function"==typeof i.info&&i.info({clientName:"S3Client",commandName:"UploadPartCommand"});var s=t.requestHandler;return r.resolve((function(e){return s.handle(e.request,n||{})}),o)},t.prototype.serialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,l,h,p;return d(this,(function(d){switch(d.label){case 0:if(n=f(f(f(f(f(f(f({"Content-Type":"application/octet-stream"},Mi(e.ExpectedBucketOwner)&&{"x-amz-expected-bucket-owner":e.ExpectedBucketOwner}),Mi(e.RequestPayer)&&{"x-amz-request-payer":e.RequestPayer}),Mi(e.ContentLength)&&{"Content-Length":e.ContentLength.toString()}),Mi(e.SSECustomerKey)&&{"x-amz-server-side-encryption-customer-key":e.SSECustomerKey}),Mi(e.SSECustomerAlgorithm)&&{"x-amz-server-side-encryption-customer-algorithm":e.SSECustomerAlgorithm}),Mi(e.SSECustomerKeyMD5)&&{"x-amz-server-side-encryption-customer-key-MD5":e.SSECustomerKeyMD5}),Mi(e.ContentMD5)&&{"Content-MD5":e.ContentMD5}),r="/{Bucket}/{Key+}",void 0===e.Bucket)throw new Error("No value provided for input HTTP label: Bucket.");if((i=e.Bucket).length<=0)throw new Error("Empty value provided for input HTTP label: Bucket.");if(r=r.replace("{Bucket}",Object(Zr.f)(i)),void 0===e.Key)throw new Error("No value provided for input HTTP label: Key.");if((i=e.Key).length<=0)throw new Error("Empty value provided for input HTTP label: Key.");return r=r.replace("{Key+}",i.split("/").map((function(e){return Object(Zr.f)(e)})).join("/")),o=f(f({"x-id":"UploadPart"},void 0!==e.PartNumber&&{partNumber:e.PartNumber.toString()}),void 0!==e.UploadId&&{uploadId:e.UploadId}),void 0!==e.Body&&(a=e.Body,s=a),[4,t.endpoint()];case 1:return u=d.sent(),c=u.hostname,l=u.protocol,h=void 0===l?"https":l,p=u.port,[2,new Xr.a({protocol:h,hostname:c,port:p,method:"PUT",headers:n,path:r,query:o,body:s})]}}))}))}(e,t)},t.prototype.deserialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n;return d(this,(function(r){switch(r.label){case 0:return 200!==e.statusCode&&e.statusCode>=300?[2,li(e,t)]:(n={$metadata:Si(e),ETag:void 0,RequestCharged:void 0,SSECustomerAlgorithm:void 0,SSECustomerKeyMD5:void 0,SSEKMSKeyId:void 0,ServerSideEncryption:void 0},void 0!==e.headers["x-amz-server-side-encryption-customer-key-md5"]&&(n.SSECustomerKeyMD5=e.headers["x-amz-server-side-encryption-customer-key-md5"]),void 0!==e.headers["x-amz-server-side-encryption"]&&(n.ServerSideEncryption=e.headers["x-amz-server-side-encryption"]),void 0!==e.headers["x-amz-server-side-encryption-aws-kms-key-id"]&&(n.SSEKMSKeyId=e.headers["x-amz-server-side-encryption-aws-kms-key-id"]),void 0!==e.headers["x-amz-server-side-encryption-customer-algorithm"]&&(n.SSECustomerAlgorithm=e.headers["x-amz-server-side-encryption-customer-algorithm"]),void 0!==e.headers["x-amz-request-charged"]&&(n.RequestCharged=e.headers["x-amz-request-charged"]),void 0!==e.headers.etag&&(n.ETag=e.headers.etag),[4,Ei(e.body,t)]);case 1:return r.sent(),[2,Promise.resolve(n)]}}))}))}(e,t)},t}(Zr.b),gs=function(e){function t(t){var n=e.call(this)||this;return n.input=t,n}return c(t,e),t.prototype.resolveMiddleware=function(e,t,n){this.middlewareStack.use(Object(Vi.a)(t,this.serialize,this.deserialize)),this.middlewareStack.use(Hi(t));var r=e.concat(this.middlewareStack),i=t.logger,o={logger:i,clientName:"S3Client",commandName:"CompleteMultipartUploadCommand",inputFilterSensitiveLog:I.filterSensitiveLog,outputFilterSensitiveLog:E.filterSensitiveLog};"function"==typeof i.info&&i.info({clientName:"S3Client",commandName:"CompleteMultipartUploadCommand"});var s=t.requestHandler;return r.resolve((function(e){return s.handle(e.request,n||{})}),o)},t.prototype.serialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,l,h,p;return d(this,(function(d){switch(d.label){case 0:if(n=f(f({"Content-Type":"application/xml"},Mi(e.ExpectedBucketOwner)&&{"x-amz-expected-bucket-owner":e.ExpectedBucketOwner}),Mi(e.RequestPayer)&&{"x-amz-request-payer":e.RequestPayer}),r="/{Bucket}/{Key+}",void 0===e.Key)throw new Error("No value provided for input HTTP label: Key.");if((i=e.Key).length<=0)throw new Error("Empty value provided for input HTTP label: Key.");if(r=r.replace("{Key+}",i.split("/").map((function(e){return Object(Zr.f)(e)})).join("/")),void 0===e.Bucket)throw new Error("No value provided for input HTTP label: Bucket.");if((i=e.Bucket).length<=0)throw new Error("Empty value provided for input HTTP label: Bucket.");return r=r.replace("{Bucket}",Object(Zr.f)(i)),o=f({},void 0!==e.UploadId&&{uploadId:e.UploadId}),void 0!==e.MultipartUpload&&(a=vi(e.MultipartUpload,t),s='',a.addAttribute("xmlns","http://s3.amazonaws.com/doc/2006-03-01/"),s+=a.toString()),[4,t.endpoint()];case 1:return u=d.sent(),c=u.hostname,l=u.protocol,h=void 0===l?"https":l,p=u.port,[2,new Xr.a({protocol:h,hostname:c,port:p,method:"POST",headers:n,path:r,query:o,body:s})]}}))}))}(e,t)},t.prototype.deserialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n,r;return d(this,(function(i){switch(i.label){case 0:return 200!==e.statusCode&&e.statusCode>=300?[2,ii(e,t)]:(n={$metadata:Si(e),Bucket:void 0,ETag:void 0,Expiration:void 0,Key:void 0,Location:void 0,RequestCharged:void 0,SSEKMSKeyId:void 0,ServerSideEncryption:void 0,VersionId:void 0},void 0!==e.headers["x-amz-expiration"]&&(n.Expiration=e.headers["x-amz-expiration"]),void 0!==e.headers["x-amz-server-side-encryption"]&&(n.ServerSideEncryption=e.headers["x-amz-server-side-encryption"]),void 0!==e.headers["x-amz-server-side-encryption-aws-kms-key-id"]&&(n.SSEKMSKeyId=e.headers["x-amz-server-side-encryption-aws-kms-key-id"]),void 0!==e.headers["x-amz-version-id"]&&(n.VersionId=e.headers["x-amz-version-id"]),void 0!==e.headers["x-amz-request-charged"]&&(n.RequestCharged=e.headers["x-amz-request-charged"]),[4,Ai(e.body,t)]);case 1:return void 0!==(r=i.sent()).Bucket&&(n.Bucket=r.Bucket),void 0!==r.ETag&&(n.ETag=r.ETag),void 0!==r.Key&&(n.Key=r.Key),void 0!==r.Location&&(n.Location=r.Location),[2,Promise.resolve(n)]}}))}))}(e,t)},t}(Zr.b),ms=function(e){function t(t){var n=e.call(this)||this;return n.input=t,n}return c(t,e),t.prototype.resolveMiddleware=function(e,t,n){this.middlewareStack.use(Object(Vi.a)(t,this.serialize,this.deserialize)),this.middlewareStack.use(Hi(t));var r=e.concat(this.middlewareStack),i=t.logger,o={logger:i,clientName:"S3Client",commandName:"AbortMultipartUploadCommand",inputFilterSensitiveLog:v.filterSensitiveLog,outputFilterSensitiveLog:p.filterSensitiveLog};"function"==typeof i.info&&i.info({clientName:"S3Client",commandName:"AbortMultipartUploadCommand"});var s=t.requestHandler;return r.resolve((function(e){return s.handle(e.request,n||{})}),o)},t.prototype.serialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,l;return d(this,(function(d){switch(d.label){case 0:if(n=f(f({"Content-Type":""},Mi(e.RequestPayer)&&{"x-amz-request-payer":e.RequestPayer}),Mi(e.ExpectedBucketOwner)&&{"x-amz-expected-bucket-owner":e.ExpectedBucketOwner}),r="/{Bucket}/{Key+}",void 0===e.Key)throw new Error("No value provided for input HTTP label: Key.");if((i=e.Key).length<=0)throw new Error("Empty value provided for input HTTP label: Key.");if(r=r.replace("{Key+}",i.split("/").map((function(e){return Object(Zr.f)(e)})).join("/")),void 0===e.Bucket)throw new Error("No value provided for input HTTP label: Bucket.");if((i=e.Bucket).length<=0)throw new Error("Empty value provided for input HTTP label: Bucket.");return r=r.replace("{Bucket}",Object(Zr.f)(i)),o=f({"x-id":"AbortMultipartUpload"},void 0!==e.UploadId&&{uploadId:e.UploadId}),[4,t.endpoint()];case 1:return s=d.sent(),a=s.hostname,u=s.protocol,c=void 0===u?"https":u,l=s.port,[2,new Xr.a({protocol:c,hostname:a,port:l,method:"DELETE",headers:n,path:r,query:o,body:void 0})]}}))}))}(e,t)},t.prototype.deserialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n;return d(this,(function(r){switch(r.label){case 0:return 204!==e.statusCode&&e.statusCode>=300?[2,ri(e,t)]:(n={$metadata:Si(e),RequestCharged:void 0},void 0!==e.headers["x-amz-request-charged"]&&(n.RequestCharged=e.headers["x-amz-request-charged"]),[4,Ei(e.body,t)]);case 1:return r.sent(),[2,Promise.resolve(n)]}}))}))}(e,t)},t}(Zr.b),bs=function(e){function t(t){var n=e.call(this)||this;return n.input=t,n}return c(t,e),t.prototype.resolveMiddleware=function(e,t,n){this.middlewareStack.use(Object(Vi.a)(t,this.serialize,this.deserialize)),this.middlewareStack.use(Hi(t));var r=e.concat(this.middlewareStack),i=t.logger,o={logger:i,clientName:"S3Client",commandName:"ListPartsCommand",inputFilterSensitiveLog:Yn.filterSensitiveLog,outputFilterSensitiveLog:$n.filterSensitiveLog};"function"==typeof i.info&&i.info({clientName:"S3Client",commandName:"ListPartsCommand"});var s=t.requestHandler;return r.resolve((function(e){return s.handle(e.request,n||{})}),o)},t.prototype.serialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,l;return d(this,(function(d){switch(d.label){case 0:if(n=f(f({"Content-Type":""},Mi(e.RequestPayer)&&{"x-amz-request-payer":e.RequestPayer}),Mi(e.ExpectedBucketOwner)&&{"x-amz-expected-bucket-owner":e.ExpectedBucketOwner}),r="/{Bucket}/{Key+}",void 0===e.Bucket)throw new Error("No value provided for input HTTP label: Bucket.");if((i=e.Bucket).length<=0)throw new Error("Empty value provided for input HTTP label: Bucket.");if(r=r.replace("{Bucket}",Object(Zr.f)(i)),void 0===e.Key)throw new Error("No value provided for input HTTP label: Key.");if((i=e.Key).length<=0)throw new Error("Empty value provided for input HTTP label: Key.");return r=r.replace("{Key+}",i.split("/").map((function(e){return Object(Zr.f)(e)})).join("/")),o=f(f(f({"x-id":"ListParts"},void 0!==e.UploadId&&{uploadId:e.UploadId}),void 0!==e.MaxParts&&{"max-parts":e.MaxParts.toString()}),void 0!==e.PartNumberMarker&&{"part-number-marker":e.PartNumberMarker.toString()}),[4,t.endpoint()];case 1:return s=d.sent(),a=s.hostname,u=s.protocol,c=void 0===u?"https":u,l=s.port,[2,new Xr.a({protocol:c,hostname:a,port:l,method:"GET",headers:n,path:r,query:o,body:void 0})]}}))}))}(e,t)},t.prototype.deserialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n,r;return d(this,(function(i){switch(i.label){case 0:return 200!==e.statusCode&&e.statusCode>=300?[2,ci(e,t)]:(n={$metadata:Si(e),AbortDate:void 0,AbortRuleId:void 0,Bucket:void 0,Initiator:void 0,IsTruncated:void 0,Key:void 0,MaxParts:void 0,NextPartNumberMarker:void 0,Owner:void 0,PartNumberMarker:void 0,Parts:void 0,RequestCharged:void 0,StorageClass:void 0,UploadId:void 0},void 0!==e.headers["x-amz-abort-rule-id"]&&(n.AbortRuleId=e.headers["x-amz-abort-rule-id"]),void 0!==e.headers["x-amz-request-charged"]&&(n.RequestCharged=e.headers["x-amz-request-charged"]),void 0!==e.headers["x-amz-abort-date"]&&(n.AbortDate=new Date(e.headers["x-amz-abort-date"])),[4,Ai(e.body,t)]);case 1:return void 0!==(r=i.sent()).Bucket&&(n.Bucket=r.Bucket),void 0!==r.Initiator&&(n.Initiator=bi(r.Initiator,t)),void 0!==r.IsTruncated&&(n.IsTruncated="true"==r.IsTruncated),void 0!==r.Key&&(n.Key=r.Key),void 0!==r.MaxParts&&(n.MaxParts=parseInt(r.MaxParts)),void 0!==r.NextPartNumberMarker&&(n.NextPartNumberMarker=parseInt(r.NextPartNumberMarker)),void 0!==r.Owner&&(n.Owner=wi(r.Owner,t)),void 0!==r.PartNumberMarker&&(n.PartNumberMarker=parseInt(r.PartNumberMarker)),""===r.Part&&(n.Parts=[]),void 0!==r.Part&&(n.Parts=_i(Object(Zr.g)(r.Part),t)),void 0!==r.StorageClass&&(n.StorageClass=r.StorageClass),void 0!==r.UploadId&&(n.UploadId=r.UploadId),[2,Promise.resolve(n)]}}))}))}(e,t)},t}(Zr.b),ys=n(49),ws=n(106),_s=n(16),Ss=function(e){var t,n=Object(_s.parse)(e),r=n.hostname,i=void 0===r?"localhost":r,o=n.pathname,s=void 0===o?"/":o,a=n.port,u=n.protocol,c=void 0===u?"https:":u,f=n.search;return f&&(t=Object(ws.a)(f)),{hostname:i,port:a?parseInt(a):void 0,protocol:c,path:s,query:t}};function Es(e){return(Es="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var Ms=function(){return(Ms=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},Os=new r.a("AWSS3ProviderManagedUpload"),xs=function(){function e(e,t,n){this.minPartSize=5242880,this.queueSize=4,this.body=null,this.params=null,this.opts=null,this.multiPartMap=[],this.cancel=!1,this.bytesUploaded=0,this.totalBytesToUpload=0,this.emitter=null,this.params=e,this.opts=t,this.emitter=n}return e.prototype.upload=function(){return As(this,void 0,void 0,(function(){var e,t,n,r,i,o;return Is(this,(function(s){switch(s.label){case 0:return e=this,[4,this.validateAndSanitizeBody(this.params.Body)];case 1:return e.body=s.sent(),this.totalBytesToUpload=this.byteLength(this.body),this.totalBytesToUpload<=this.minPartSize?(this.params.Body=this.body,t=new hs(this.params),[4,this._createNewS3Client(this.opts,this.emitter)]):[3,3];case 2:return[2,s.sent().send(t)];case 3:return[4,this.createMultiPartUpload()];case 4:n=s.sent(),r=Math.ceil(this.totalBytesToUpload/this.minPartSize),i=0,s.label=5;case 5:return i0)throw new Error("Multi Part upload clean up failed");return[2]}}))}))},e.prototype.setupEventListener=function(e){var t=this;e.emitter.on("sendProgress",(function(n){t.progressChanged(e.partNumber,n.loaded-e._lastUploadedBytes),e._lastUploadedBytes=n.loaded}))},e.prototype.progressChanged=function(e,t){this.bytesUploaded+=t,this.emitter.emit("sendProgress",{loaded:this.bytesUploaded,total:this.totalBytesToUpload,part:e,key:this.params.Key})},e.prototype.byteLength=function(e){if(null==e)return 0;if("number"==typeof e.byteLength)return e.byteLength;if("number"==typeof e.length)return e.length;if("number"==typeof e.size)return e.size;if("string"!=typeof e.path)throw new Error("Cannot determine length of "+e)},e.prototype.validateAndSanitizeBody=function(e){return As(this,void 0,void 0,(function(){return Is(this,(function(t){switch(t.label){case 0:return this.isGenericObject(e)?[2,JSON.stringify(e)]:[3,1];case 1:return this.isBlob(e)?a.a.isReactNative?[4,Object(eo.b)(e)]:[3,3]:[3,4];case 2:return[2,t.sent()];case 3:case 4:return[2,e]}}))}))},e.prototype.isBlob=function(e){return"undefined"!=typeof Blob&&e instanceof Blob},e.prototype.isGenericObject=function(e){if(null!==e&&"object"===Es(e))try{return!(this.byteLength(e)>=0)}catch(e){return!0}return!1},e.prototype._createNewS3Client=function(e,t){return As(this,void 0,void 0,(function(){var n,r,i,o,s;return Is(this,(function(u){switch(u.label){case 0:return[4,this._getCredentials()];case 1:return n=u.sent(),r=e.region,i=e.dangerouslyConnectToHttpEndpointForTesting,o={},i&&(o={endpoint:"http://localhost:20005",tls:!1,bucketEndpoint:!1,forcePathStyle:!0}),(s=new jo(Ms(Ms({region:r,credentials:n},o),{requestHandler:new Vo({},t),customUserAgent:Object(a.b)(),urlParser:Ss}))).middlewareStack.remove("contentLengthMiddleware"),[2,s]}}))}))},e.prototype._getCredentials=function(){return s.a.get().then((function(e){if(!e)return!1;var t=s.a.shear(e);return Os.debug("set credentials for storage",t),t})).catch((function(e){return Os.warn("ensure credentials error",e),!1}))},e}();function Cs(e){return(Cs="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var Ts=function(){return(Ts=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},qs=new r.a("StorageClass"),Ks=function(){function e(){this._config={},this._pluggables=[],qs.debug("Storage Options",this._config),this.get=this.get.bind(this),this.put=this.put.bind(this),this.remove=this.remove.bind(this),this.list=this.list.bind(this)}return e.prototype.getModuleName=function(){return"Storage"},e.prototype.addPluggable=function(e){if(e&&"Storage"===e.getCategory()){this._pluggables.push(e);return e.configure(this._config[e.getProviderName()])}},e.prototype.getPluggable=function(e){var t=this._pluggables.find((function(t){return t.getProviderName()===e}));return void 0===t?(qs.debug("No plugin found with providerName",e),null):t},e.prototype.removePluggable=function(e){this._pluggables=this._pluggables.filter((function(t){return t.getProviderName()!==e}))},e.prototype.configure=function(e){var t=this;if(qs.debug("configure Storage"),!e)return this._config;var n=i.a.parseMobilehubConfig(e),r=Object.keys(n.Storage),o=["bucket","region","level","track","customPrefix","serverSideEncryption","SSECustomerAlgorithm","SSECustomerKey","SSECustomerKeyMD5","SSEKMSKeyId"],s=function(e){return o.some((function(t){return t===e}))};return r&&r.find((function(e){return s(e)}))&&!n.Storage.AWSS3&&(n.Storage.AWSS3={}),Object.entries(n.Storage).map((function(e){var t=zs(e,2),r=t[0],i=t[1];r&&s(r)&&void 0!==i&&(n.Storage.AWSS3[r]=i,delete n.Storage[r])})),Object.keys(n.Storage).forEach((function(e){"string"!=typeof n.Storage[e]&&(t._config[e]=Us(Us({},t._config[e]),n.Storage[e]))})),this._pluggables.forEach((function(e){e.configure(t._config[e.getProviderName()])})),0===this._pluggables.length&&this.addPluggable(new Ds),this._config},e.prototype.get=function(e,t){return Bs(this,void 0,void 0,(function(){var n,r,i;return Fs(this,(function(o){return n=(t||{}).provider,r=void 0===n?"AWSS3":n,void 0===(i=this._pluggables.find((function(e){return e.getProviderName()===r})))&&(qs.debug("No plugin found with providerName",r),Promise.reject("No plugin found in Storage for the provider")),[2,i.get(e,t)]}))}))},e.prototype.put=function(e,t,n){return Bs(this,void 0,void 0,(function(){var r,i,o;return Fs(this,(function(s){return r=(n||{}).provider,i=void 0===r?"AWSS3":r,void 0===(o=this._pluggables.find((function(e){return e.getProviderName()===i})))&&(qs.debug("No plugin found with providerName",i),Promise.reject("No plugin found in Storage for the provider")),[2,o.put(e,t,n)]}))}))},e.prototype.remove=function(e,t){return Bs(this,void 0,void 0,(function(){var n,r,i;return Fs(this,(function(o){return n=(t||{}).provider,r=void 0===n?"AWSS3":n,void 0===(i=this._pluggables.find((function(e){return e.getProviderName()===r})))&&(qs.debug("No plugin found with providerName",r),Promise.reject("No plugin found in Storage for the provider")),[2,i.remove(e,t)]}))}))},e.prototype.list=function(e,t){return Bs(this,void 0,void 0,(function(){var n,r,i;return Fs(this,(function(o){return n=(t||{}).provider,r=void 0===n?"AWSS3":n,void 0===(i=this._pluggables.find((function(e){return e.getProviderName()===r})))&&(qs.debug("No plugin found with providerName",r),Promise.reject("No plugin found in Storage for the provider")),[2,i.list(e,t)]}))}))},e}(),Hs=n(19),Vs=function(){return(Vs=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&(r=this.getByLanguage(e,n.split("-")[0])),r||(void 0!==t?t:e))},e.prototype.getByLanguage=function(e,t,n){if(void 0===n&&(n=null),!t)return n;var r=this._dict[t];return r?r[e]:n},e.prototype.putVocabulariesForLanguage=function(e,t){var n=this._dict[e];n||(n=this._dict[e]={}),Object.assign(n,t)},e.prototype.putVocabularies=function(e){var t=this;Object.keys(e).map((function(n){t.putVocabulariesForLanguage(n,e[n])}))},e}(),s=n(19),a=new r.a("I18n"),u=null,c=null,f=function(){function e(){}return e.configure=function(t){return a.debug("configure I18n"),t?(u=Object.assign({},u,t.I18n||t),e.createInstance(),u):u},e.getModuleName=function(){return"I18n"},e.createInstance=function(){a.debug("create I18n instance"),c||(c=new o(u))},e.setLanguage=function(t){return e.checkConfig(),c.setLanguage(t)},e.get=function(t,n){return e.checkConfig()?c.get(t,n):void 0===n?t:n},e.putVocabulariesForLanguage=function(t,n){return e.checkConfig(),c.putVocabulariesForLanguage(t,n)},e.putVocabularies=function(t){return e.checkConfig(),c.putVocabularies(t)},e.checkConfig=function(){return c||(c=new o(u)),!0},e}();s.a.register(f)},function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var r=n(44),i=n(33),o=n(19);function s(e){return(s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var a=function(){function e(){this._logger=new r.a("ServiceWorker")}return Object.defineProperty(e.prototype,"serviceWorker",{get:function(){return this._serviceWorker},enumerable:!0,configurable:!0}),e.prototype.register=function(e,t){var n=this;return void 0===e&&(e="/service-worker.js"),void 0===t&&(t="/"),this._logger.debug("registering "+e),this._logger.debug("registering service worker with scope "+t),new Promise((function(r,i){if(!navigator||!("serviceWorker"in navigator))return i(new Error("Service Worker not available"));navigator.serviceWorker.register(e,{scope:t}).then((function(e){return e.installing?n._serviceWorker=e.installing:e.waiting?n._serviceWorker=e.waiting:e.active&&(n._serviceWorker=e.active),n._registration=e,n._setupListeners(),n._logger.debug("Service Worker Registration Success: "+e),r(e)})).catch((function(e){return n._logger.debug("Service Worker Registration Failed "+e),i(e)}))}))},e.prototype.enablePush=function(e){var t=this;if(!this._registration)throw new Error("Service Worker not registered");return this._publicKey=e,new Promise((function(n,r){if(!Object(i.b)().isBrowser)return r(new Error("Service Worker not available"));t._registration.pushManager.getSubscription().then((function(r){if(!r)return t._logger.debug("User is NOT subscribed to push"),t._registration.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:t._urlB64ToUint8Array(e)}).then((function(e){t._subscription=e,t._logger.debug("User subscribed: "+JSON.stringify(e)),n(e)})).catch((function(e){t._logger.error(e)}));t._subscription=r,t._logger.debug("User is subscribed to push: "+JSON.stringify(r)),n(r)}))}))},e.prototype._urlB64ToUint8Array=function(e){for(var t=(e+"=".repeat((4-e.length%4)%4)).replace(/\-/g,"+").replace(/_/g,"/"),n=window.atob(t),r=new Uint8Array(n.length),i=0;i0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s}var g,m,b,y,w,_,S,E,M,A,I,k,O,x,C,T,P,N,R,L,j,D,U,B,F,z,q,K,H,V,G,W,$,Y,J,Z,X,Q,ee,te,ne,re,ie,oe,se,ae,ue,ce,fe,le,de,he,pe,ve,ge,me,be,ye,we,_e,Se,Ee,Me,Ae,Ie,ke,Oe,xe,Ce,Te,Pe,Ne,Re,Le,je,De,Ue,Be,Fe,ze,qe,Ke,He,Ve,Ge,We,$e,Ye,Je,Ze,Xe,Qe,et,tt,nt,rt,it,ot,st,at,ut,ct,ft,lt,dt,ht,pt,vt,gt,mt,bt,yt,wt,_t,St,Et,Mt,At,It,kt,Ot,xt,Ct,Tt,Pt,Nt,Rt,Lt,jt,Dt,Ut;Object.create;(g||(g={})).filterSensitiveLog=function(e){return d({},e)},(m||(m={})).filterSensitiveLog=function(e){return d({},e)},(b||(b={})).filterSensitiveLog=function(e){return d({},e)},(y||(y={})).filterSensitiveLog=function(e){return d({},e)},(w||(w={})).filterSensitiveLog=function(e){return d({},e)},(_||(_={})).filterSensitiveLog=function(e){return d({},e)},(S||(S={})).filterSensitiveLog=function(e){return d({},e)},(E||(E={})).filterSensitiveLog=function(e){return d({},e)},(M||(M={})).filterSensitiveLog=function(e){return d({},e)},(A||(A={})).filterSensitiveLog=function(e){return d({},e)},(I||(I={})).filterSensitiveLog=function(e){return d({},e)},(k||(k={})).filterSensitiveLog=function(e){return d({},e)},(O||(O={})).filterSensitiveLog=function(e){return d({},e)},(x||(x={})).filterSensitiveLog=function(e){return d({},e)},(C||(C={})).filterSensitiveLog=function(e){return d({},e)},(T||(T={})).filterSensitiveLog=function(e){return d({},e)},(P||(P={})).filterSensitiveLog=function(e){return d({},e)},(N||(N={})).filterSensitiveLog=function(e){return d({},e)},(R||(R={})).filterSensitiveLog=function(e){return d({},e)},(L||(L={})).filterSensitiveLog=function(e){return d({},e)},(j||(j={})).filterSensitiveLog=function(e){return d({},e)},(D||(D={})).filterSensitiveLog=function(e){return d({},e)},(U||(U={})).filterSensitiveLog=function(e){return d({},e)},(B||(B={})).filterSensitiveLog=function(e){return d({},e)},(F||(F={})).filterSensitiveLog=function(e){return d({},e)},(z||(z={})).filterSensitiveLog=function(e){return d({},e)},(q||(q={})).filterSensitiveLog=function(e){return d({},e)},(K||(K={})).filterSensitiveLog=function(e){return d({},e)},(H||(H={})).filterSensitiveLog=function(e){return d({},e)},(V||(V={})).filterSensitiveLog=function(e){return d({},e)},(G||(G={})).filterSensitiveLog=function(e){return d({},e)},(W||(W={})).filterSensitiveLog=function(e){return d({},e)},($||($={})).filterSensitiveLog=function(e){return d({},e)},(Y||(Y={})).filterSensitiveLog=function(e){return d({},e)},(J||(J={})).filterSensitiveLog=function(e){return d({},e)},(Z||(Z={})).filterSensitiveLog=function(e){return d({},e)},(X||(X={})).filterSensitiveLog=function(e){return d({},e)},(Q||(Q={})).filterSensitiveLog=function(e){return d({},e)},(ee||(ee={})).filterSensitiveLog=function(e){return d({},e)},(te||(te={})).filterSensitiveLog=function(e){return d({},e)},(ne||(ne={})).filterSensitiveLog=function(e){return d({},e)},(re||(re={})).filterSensitiveLog=function(e){return d({},e)},(ie||(ie={})).filterSensitiveLog=function(e){return d({},e)},(oe||(oe={})).filterSensitiveLog=function(e){return d({},e)},(se||(se={})).filterSensitiveLog=function(e){return d({},e)},(ae||(ae={})).filterSensitiveLog=function(e){return d({},e)},(ue||(ue={})).filterSensitiveLog=function(e){return d({},e)},(ce||(ce={})).filterSensitiveLog=function(e){return d({},e)},(fe||(fe={})).filterSensitiveLog=function(e){return d({},e)},(le||(le={})).filterSensitiveLog=function(e){return d({},e)},(de||(de={})).filterSensitiveLog=function(e){return d({},e)},(he||(he={})).filterSensitiveLog=function(e){return d({},e)},(pe||(pe={})).filterSensitiveLog=function(e){return d({},e)},(ve||(ve={})).filterSensitiveLog=function(e){return d({},e)},(ge||(ge={})).filterSensitiveLog=function(e){return d({},e)},(me||(me={})).filterSensitiveLog=function(e){return d({},e)},(be||(be={})).filterSensitiveLog=function(e){return d({},e)},(ye||(ye={})).filterSensitiveLog=function(e){return d({},e)},(we||(we={})).filterSensitiveLog=function(e){return d({},e)},(_e||(_e={})).filterSensitiveLog=function(e){return d({},e)},(Se||(Se={})).filterSensitiveLog=function(e){return d({},e)},(Ee||(Ee={})).filterSensitiveLog=function(e){return d({},e)},(Me||(Me={})).filterSensitiveLog=function(e){return d({},e)},(Ae||(Ae={})).filterSensitiveLog=function(e){return d({},e)},(Ie||(Ie={})).filterSensitiveLog=function(e){return d({},e)},(ke||(ke={})).filterSensitiveLog=function(e){return d({},e)},(Oe||(Oe={})).filterSensitiveLog=function(e){return d({},e)},(xe||(xe={})).filterSensitiveLog=function(e){return d({},e)},(Ce||(Ce={})).filterSensitiveLog=function(e){return d({},e)},(Te||(Te={})).filterSensitiveLog=function(e){return d({},e)},(Pe||(Pe={})).filterSensitiveLog=function(e){return d({},e)},(Ne||(Ne={})).filterSensitiveLog=function(e){return d({},e)},(Re||(Re={})).filterSensitiveLog=function(e){return d({},e)},(Le||(Le={})).filterSensitiveLog=function(e){return d({},e)},(je||(je={})).filterSensitiveLog=function(e){return d({},e)},(De||(De={})).filterSensitiveLog=function(e){return d({},e)},(Ue||(Ue={})).filterSensitiveLog=function(e){return d({},e)},(Be||(Be={})).filterSensitiveLog=function(e){return d({},e)},(Fe||(Fe={})).filterSensitiveLog=function(e){return d({},e)},(ze||(ze={})).filterSensitiveLog=function(e){return d({},e)},(qe||(qe={})).filterSensitiveLog=function(e){return d({},e)},(Ke||(Ke={})).filterSensitiveLog=function(e){return d({},e)},(He||(He={})).filterSensitiveLog=function(e){return d({},e)},(Ve||(Ve={})).filterSensitiveLog=function(e){return d({},e)},(Ge||(Ge={})).filterSensitiveLog=function(e){return d({},e)},(We||(We={})).filterSensitiveLog=function(e){return d({},e)},($e||($e={})).filterSensitiveLog=function(e){return d({},e)},(Ye||(Ye={})).filterSensitiveLog=function(e){return d({},e)},(Je||(Je={})).filterSensitiveLog=function(e){return d({},e)},(Ze||(Ze={})).filterSensitiveLog=function(e){return d({},e)},(Xe||(Xe={})).filterSensitiveLog=function(e){return d({},e)},(Qe||(Qe={})).filterSensitiveLog=function(e){return d({},e)},(et||(et={})).filterSensitiveLog=function(e){return d({},e)},(tt||(tt={})).filterSensitiveLog=function(e){return d({},e)},(nt||(nt={})).filterSensitiveLog=function(e){return d({},e)},(rt||(rt={})).filterSensitiveLog=function(e){return d({},e)},(it||(it={})).filterSensitiveLog=function(e){return d({},e)},(ot||(ot={})).filterSensitiveLog=function(e){return d({},e)},(st||(st={})).filterSensitiveLog=function(e){return d({},e)},(at||(at={})).filterSensitiveLog=function(e){return d({},e)},(ut||(ut={})).filterSensitiveLog=function(e){return d({},e)},(ct||(ct={})).filterSensitiveLog=function(e){return d({},e)},(ft||(ft={})).filterSensitiveLog=function(e){return d({},e)},(lt||(lt={})).filterSensitiveLog=function(e){return d({},e)},(dt||(dt={})).filterSensitiveLog=function(e){return d({},e)},(ht||(ht={})).filterSensitiveLog=function(e){return d({},e)},(pt||(pt={})).filterSensitiveLog=function(e){return d({},e)},(vt||(vt={})).filterSensitiveLog=function(e){return d({},e)},(gt||(gt={})).filterSensitiveLog=function(e){return d({},e)},(mt||(mt={})).filterSensitiveLog=function(e){return d({},e)},(bt||(bt={})).filterSensitiveLog=function(e){return d({},e)},(yt||(yt={})).filterSensitiveLog=function(e){return d({},e)},(wt||(wt={})).filterSensitiveLog=function(e){return d({},e)},(_t||(_t={})).filterSensitiveLog=function(e){return d({},e)},(St||(St={})).filterSensitiveLog=function(e){return d({},e)},(Et||(Et={})).filterSensitiveLog=function(e){return d({},e)},(Mt||(Mt={})).filterSensitiveLog=function(e){return d({},e)},(At||(At={})).filterSensitiveLog=function(e){return d({},e)},(It||(It={})).filterSensitiveLog=function(e){return d({},e)},(kt||(kt={})).filterSensitiveLog=function(e){return d({},e)},(Ot||(Ot={})).filterSensitiveLog=function(e){return d({},e)},(xt||(xt={})).filterSensitiveLog=function(e){return d({},e)},(Ct||(Ct={})).filterSensitiveLog=function(e){return d({},e)},(Tt||(Tt={})).filterSensitiveLog=function(e){return d({},e)},(Pt||(Pt={})).filterSensitiveLog=function(e){return d({},e)},(Nt||(Nt={})).filterSensitiveLog=function(e){return d({},e)},(Rt||(Rt={})).filterSensitiveLog=function(e){return d({},e)},(Lt||(Lt={})).filterSensitiveLog=function(e){return d({},e)},(jt||(jt={})).filterSensitiveLog=function(e){return d({},e)},(Dt||(Dt={})).filterSensitiveLog=function(e){return d({},e)},(Ut||(Ut={})).filterSensitiveLog=function(e){return d({},e)};var Bt=n(2),Ft=n(0),zt=function(e,t){return h(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,f,l,h,v,g,m;return p(this,(function(p){switch(p.label){case 0:return r=[d({},e)],m={},[4,mn(e.body,t)];case 1:switch(n=d.apply(void 0,r.concat([(m.body=p.sent(),m)])),o="UnknownError",o=bn(e,n.body),o){case"BadRequestException":case"com.amazonaws.pinpoint#BadRequestException":return[3,2];case"ForbiddenException":case"com.amazonaws.pinpoint#ForbiddenException":return[3,4];case"InternalServerErrorException":case"com.amazonaws.pinpoint#InternalServerErrorException":return[3,6];case"MethodNotAllowedException":case"com.amazonaws.pinpoint#MethodNotAllowedException":return[3,8];case"NotFoundException":case"com.amazonaws.pinpoint#NotFoundException":return[3,10];case"PayloadTooLargeException":case"com.amazonaws.pinpoint#PayloadTooLargeException":return[3,12];case"TooManyRequestsException":case"com.amazonaws.pinpoint#TooManyRequestsException":return[3,14]}return[3,16];case 2:return s=[{}],[4,Kt(n,t)];case 3:return i=d.apply(void 0,[d.apply(void 0,s.concat([p.sent()])),{name:o,$metadata:vn(e)}]),[3,17];case 4:return a=[{}],[4,Ht(n,t)];case 5:return i=d.apply(void 0,[d.apply(void 0,a.concat([p.sent()])),{name:o,$metadata:vn(e)}]),[3,17];case 6:return u=[{}],[4,Vt(n,t)];case 7:return i=d.apply(void 0,[d.apply(void 0,u.concat([p.sent()])),{name:o,$metadata:vn(e)}]),[3,17];case 8:return c=[{}],[4,Gt(n,t)];case 9:return i=d.apply(void 0,[d.apply(void 0,c.concat([p.sent()])),{name:o,$metadata:vn(e)}]),[3,17];case 10:return f=[{}],[4,Wt(n,t)];case 11:return i=d.apply(void 0,[d.apply(void 0,f.concat([p.sent()])),{name:o,$metadata:vn(e)}]),[3,17];case 12:return l=[{}],[4,$t(n,t)];case 13:return i=d.apply(void 0,[d.apply(void 0,l.concat([p.sent()])),{name:o,$metadata:vn(e)}]),[3,17];case 14:return h=[{}],[4,Yt(n,t)];case 15:return i=d.apply(void 0,[d.apply(void 0,h.concat([p.sent()])),{name:o,$metadata:vn(e)}]),[3,17];case 16:v=n.body,o=v.code||v.Code||o,i=d(d({},v),{name:""+o,message:v.message||v.Message||o,$fault:"client",$metadata:vn(e)}),p.label=17;case 17:return g=i.message||i.Message||o,i.message=g,delete i.Message,[2,Promise.reject(Object.assign(new Error(g),i))]}}))}))},qt=function(e,t){return h(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,f,l,h,v,g,m;return p(this,(function(p){switch(p.label){case 0:return r=[d({},e)],m={},[4,mn(e.body,t)];case 1:switch(n=d.apply(void 0,r.concat([(m.body=p.sent(),m)])),o="UnknownError",o=bn(e,n.body),o){case"BadRequestException":case"com.amazonaws.pinpoint#BadRequestException":return[3,2];case"ForbiddenException":case"com.amazonaws.pinpoint#ForbiddenException":return[3,4];case"InternalServerErrorException":case"com.amazonaws.pinpoint#InternalServerErrorException":return[3,6];case"MethodNotAllowedException":case"com.amazonaws.pinpoint#MethodNotAllowedException":return[3,8];case"NotFoundException":case"com.amazonaws.pinpoint#NotFoundException":return[3,10];case"PayloadTooLargeException":case"com.amazonaws.pinpoint#PayloadTooLargeException":return[3,12];case"TooManyRequestsException":case"com.amazonaws.pinpoint#TooManyRequestsException":return[3,14]}return[3,16];case 2:return s=[{}],[4,Kt(n,t)];case 3:return i=d.apply(void 0,[d.apply(void 0,s.concat([p.sent()])),{name:o,$metadata:vn(e)}]),[3,17];case 4:return a=[{}],[4,Ht(n,t)];case 5:return i=d.apply(void 0,[d.apply(void 0,a.concat([p.sent()])),{name:o,$metadata:vn(e)}]),[3,17];case 6:return u=[{}],[4,Vt(n,t)];case 7:return i=d.apply(void 0,[d.apply(void 0,u.concat([p.sent()])),{name:o,$metadata:vn(e)}]),[3,17];case 8:return c=[{}],[4,Gt(n,t)];case 9:return i=d.apply(void 0,[d.apply(void 0,c.concat([p.sent()])),{name:o,$metadata:vn(e)}]),[3,17];case 10:return f=[{}],[4,Wt(n,t)];case 11:return i=d.apply(void 0,[d.apply(void 0,f.concat([p.sent()])),{name:o,$metadata:vn(e)}]),[3,17];case 12:return l=[{}],[4,$t(n,t)];case 13:return i=d.apply(void 0,[d.apply(void 0,l.concat([p.sent()])),{name:o,$metadata:vn(e)}]),[3,17];case 14:return h=[{}],[4,Yt(n,t)];case 15:return i=d.apply(void 0,[d.apply(void 0,h.concat([p.sent()])),{name:o,$metadata:vn(e)}]),[3,17];case 16:v=n.body,o=v.code||v.Code||o,i=d(d({},v),{name:""+o,message:v.message||v.Message||o,$fault:"client",$metadata:vn(e)}),p.label=17;case 17:return g=i.message||i.Message||o,i.message=g,delete i.Message,[2,Promise.reject(Object.assign(new Error(g),i))]}}))}))},Kt=function(e,t){return h(void 0,void 0,void 0,(function(){var t,n;return p(this,(function(r){return t={name:"BadRequestException",$fault:"client",$metadata:vn(e),Message:void 0,RequestID:void 0},void 0!==(n=e.body).Message&&null!==n.Message&&(t.Message=n.Message),void 0!==n.RequestID&&null!==n.RequestID&&(t.RequestID=n.RequestID),[2,t]}))}))},Ht=function(e,t){return h(void 0,void 0,void 0,(function(){var t,n;return p(this,(function(r){return t={name:"ForbiddenException",$fault:"client",$metadata:vn(e),Message:void 0,RequestID:void 0},void 0!==(n=e.body).Message&&null!==n.Message&&(t.Message=n.Message),void 0!==n.RequestID&&null!==n.RequestID&&(t.RequestID=n.RequestID),[2,t]}))}))},Vt=function(e,t){return h(void 0,void 0,void 0,(function(){var t,n;return p(this,(function(r){return t={name:"InternalServerErrorException",$fault:"server",$metadata:vn(e),Message:void 0,RequestID:void 0},void 0!==(n=e.body).Message&&null!==n.Message&&(t.Message=n.Message),void 0!==n.RequestID&&null!==n.RequestID&&(t.RequestID=n.RequestID),[2,t]}))}))},Gt=function(e,t){return h(void 0,void 0,void 0,(function(){var t,n;return p(this,(function(r){return t={name:"MethodNotAllowedException",$fault:"client",$metadata:vn(e),Message:void 0,RequestID:void 0},void 0!==(n=e.body).Message&&null!==n.Message&&(t.Message=n.Message),void 0!==n.RequestID&&null!==n.RequestID&&(t.RequestID=n.RequestID),[2,t]}))}))},Wt=function(e,t){return h(void 0,void 0,void 0,(function(){var t,n;return p(this,(function(r){return t={name:"NotFoundException",$fault:"client",$metadata:vn(e),Message:void 0,RequestID:void 0},void 0!==(n=e.body).Message&&null!==n.Message&&(t.Message=n.Message),void 0!==n.RequestID&&null!==n.RequestID&&(t.RequestID=n.RequestID),[2,t]}))}))},$t=function(e,t){return h(void 0,void 0,void 0,(function(){var t,n;return p(this,(function(r){return t={name:"PayloadTooLargeException",$fault:"client",$metadata:vn(e),Message:void 0,RequestID:void 0},void 0!==(n=e.body).Message&&null!==n.Message&&(t.Message=n.Message),void 0!==n.RequestID&&null!==n.RequestID&&(t.RequestID=n.RequestID),[2,t]}))}))},Yt=function(e,t){return h(void 0,void 0,void 0,(function(){var t,n;return p(this,(function(r){return t={name:"TooManyRequestsException",$fault:"client",$metadata:vn(e),Message:void 0,RequestID:void 0},void 0!==(n=e.body).Message&&null!==n.Message&&(t.Message=n.Message),void 0!==n.RequestID&&null!==n.RequestID&&(t.RequestID=n.RequestID),[2,t]}))}))},Jt=function(e,t){return d(d(d(d(d(d(d(d({},void 0!==e.AppVersion&&{AppVersion:e.AppVersion}),void 0!==e.Locale&&{Locale:e.Locale}),void 0!==e.Make&&{Make:e.Make}),void 0!==e.Model&&{Model:e.Model}),void 0!==e.ModelVersion&&{ModelVersion:e.ModelVersion}),void 0!==e.Platform&&{Platform:e.Platform}),void 0!==e.PlatformVersion&&{PlatformVersion:e.PlatformVersion}),void 0!==e.Timezone&&{Timezone:e.Timezone})},Zt=function(e,t){return d(d(d(d(d(d({},void 0!==e.City&&{City:e.City}),void 0!==e.Country&&{Country:e.Country}),void 0!==e.Latitude&&{Latitude:e.Latitude}),void 0!==e.Longitude&&{Longitude:e.Longitude}),void 0!==e.PostalCode&&{PostalCode:e.PostalCode}),void 0!==e.Region&&{Region:e.Region})},Xt=function(e,t){return d(d(d(d(d(d(d(d(d(d(d({},void 0!==e.Address&&{Address:e.Address}),void 0!==e.Attributes&&{Attributes:an(e.Attributes,t)}),void 0!==e.ChannelType&&{ChannelType:e.ChannelType}),void 0!==e.Demographic&&{Demographic:Jt(e.Demographic,t)}),void 0!==e.EffectiveDate&&{EffectiveDate:e.EffectiveDate}),void 0!==e.EndpointStatus&&{EndpointStatus:e.EndpointStatus}),void 0!==e.Location&&{Location:Zt(e.Location,t)}),void 0!==e.Metrics&&{Metrics:nn(e.Metrics,t)}),void 0!==e.OptOut&&{OptOut:e.OptOut}),void 0!==e.RequestId&&{RequestId:e.RequestId}),void 0!==e.User&&{User:Qt(e.User,t)})},Qt=function(e,t){return d(d({},void 0!==e.UserAttributes&&{UserAttributes:an(e.UserAttributes,t)}),void 0!==e.UserId&&{UserId:e.UserId})},en=function(e,t){return d({},void 0!==e.BatchItem&&{BatchItem:sn(e.BatchItem,t)})},tn=function(e,t){return e.map((function(e){return e}))},nn=function(e,t){return Object.entries(e).reduce((function(e,t){var n,r=v(t,2),i=r[0],o=r[1];return d(d({},e),((n={})[i]=o,n))}),{})},rn=function(e,t){return Object.entries(e).reduce((function(e,t){var n,r=v(t,2),i=r[0],o=r[1];return d(d({},e),((n={})[i]=o,n))}),{})},on=function(e,t){return Object.entries(e).reduce((function(e,n){var r,i=v(n,2),o=i[0],s=i[1];return d(d({},e),((r={})[o]=function(e,t){return d(d(d(d(d(d(d(d(d(d({},void 0!==e.AppPackageName&&{AppPackageName:e.AppPackageName}),void 0!==e.AppTitle&&{AppTitle:e.AppTitle}),void 0!==e.AppVersionCode&&{AppVersionCode:e.AppVersionCode}),void 0!==e.Attributes&&{Attributes:rn(e.Attributes,t)}),void 0!==e.ClientSdkVersion&&{ClientSdkVersion:e.ClientSdkVersion}),void 0!==e.EventType&&{EventType:e.EventType}),void 0!==e.Metrics&&{Metrics:nn(e.Metrics,t)}),void 0!==e.SdkName&&{SdkName:e.SdkName}),void 0!==e.Session&&{Session:cn(e.Session,t)}),void 0!==e.Timestamp&&{Timestamp:e.Timestamp})}(s,t),r))}),{})},sn=function(e,t){return Object.entries(e).reduce((function(e,n){var r,i=v(n,2),o=i[0],s=i[1];return d(d({},e),((r={})[o]=function(e,t){return d(d({},void 0!==e.Endpoint&&{Endpoint:un(e.Endpoint,t)}),void 0!==e.Events&&{Events:on(e.Events,t)})}(s,t),r))}),{})},an=function(e,t){return Object.entries(e).reduce((function(e,n){var r,i=v(n,2),o=i[0],s=i[1];return d(d({},e),((r={})[o]=tn(s,t),r))}),{})},un=function(e,t){return d(d(d(d(d(d(d(d(d(d(d({},void 0!==e.Address&&{Address:e.Address}),void 0!==e.Attributes&&{Attributes:an(e.Attributes,t)}),void 0!==e.ChannelType&&{ChannelType:e.ChannelType}),void 0!==e.Demographic&&{Demographic:Jt(e.Demographic,t)}),void 0!==e.EffectiveDate&&{EffectiveDate:e.EffectiveDate}),void 0!==e.EndpointStatus&&{EndpointStatus:e.EndpointStatus}),void 0!==e.Location&&{Location:Zt(e.Location,t)}),void 0!==e.Metrics&&{Metrics:nn(e.Metrics,t)}),void 0!==e.OptOut&&{OptOut:e.OptOut}),void 0!==e.RequestId&&{RequestId:e.RequestId}),void 0!==e.User&&{User:Qt(e.User,t)})},cn=function(e,t){return d(d(d(d({},void 0!==e.Duration&&{Duration:e.Duration}),void 0!==e.Id&&{Id:e.Id}),void 0!==e.StartTimestamp&&{StartTimestamp:e.StartTimestamp}),void 0!==e.StopTimestamp&&{StopTimestamp:e.StopTimestamp})},fn=function(e,t){return{Message:void 0!==e.Message&&null!==e.Message?e.Message:void 0,StatusCode:void 0!==e.StatusCode&&null!==e.StatusCode?e.StatusCode:void 0}},ln=function(e,t){return{Results:void 0!==e.Results&&null!==e.Results?hn(e.Results,t):void 0}},dn=function(e,t){return Object.entries(e).reduce((function(e,t){var n,r=v(t,2),i=r[0],o=r[1];return d(d({},e),((n={})[i]=function(e,t){return{Message:void 0!==e.Message&&null!==e.Message?e.Message:void 0,StatusCode:void 0!==e.StatusCode&&null!==e.StatusCode?e.StatusCode:void 0}}(o),n))}),{})},hn=function(e,t){return Object.entries(e).reduce((function(e,n){var r,i=v(n,2),o=i[0],s=i[1];return d(d({},e),((r={})[o]=function(e,t){return{EndpointItemResponse:void 0!==e.EndpointItemResponse&&null!==e.EndpointItemResponse?fn(e.EndpointItemResponse):void 0,EventsItemResponse:void 0!==e.EventsItemResponse&&null!==e.EventsItemResponse?dn(e.EventsItemResponse,t):void 0}}(s,t),r))}),{})},pn=function(e,t){return{Message:void 0!==e.Message&&null!==e.Message?e.Message:void 0,RequestID:void 0!==e.RequestID&&null!==e.RequestID?e.RequestID:void 0}},vn=function(e){return{httpStatusCode:e.statusCode,httpHeaders:e.headers,requestId:e.headers["x-amzn-requestid"]}},gn=function(e,t){return void 0===e&&(e=new Uint8Array),e instanceof Uint8Array?Promise.resolve(e):t.streamCollector(e)||Promise.resolve(new Uint8Array)},mn=function(e,t){return function(e,t){return gn(e,t).then((function(e){return t.utf8Encoder(e)}))}(e,t).then((function(e){return e.length?JSON.parse(e):{}}))},bn=function(e,t){var n,r,i=function(e){var t=e;return t.indexOf(":")>=0&&(t=t.split(":")[0]),t.indexOf("#")>=0&&(t=t.split("#")[1]),t},o=(n=e.headers,r="x-amzn-errortype",Object.keys(n).find((function(e){return e.toLowerCase()===r.toLowerCase()})));return void 0!==o?i(e.headers[o]):void 0!==t.code?i(t.code):void 0!==t.__type?i(t.__type):""},yn=n(10),wn=function(e){function t(t){var n=e.call(this)||this;return n.input=t,n}return l(t,e),t.prototype.resolveMiddleware=function(e,t,n){this.middlewareStack.use(Object(yn.a)(t,this.serialize,this.deserialize));var r=e.concat(this.middlewareStack),i=t.logger,o={logger:i,clientName:"PinpointClient",commandName:"PutEventsCommand",inputFilterSensitiveLog:Ie.filterSensitiveLog,outputFilterSensitiveLog:ke.filterSensitiveLog};"function"==typeof i.info&&i.info({clientName:"PinpointClient",commandName:"PutEventsCommand"});var s=t.requestHandler;return r.resolve((function(e){return s.handle(e.request,n||{})}),o)},t.prototype.serialize=function(e,t){return function(e,t){return h(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,f;return p(this,(function(l){switch(l.label){case 0:if(n={"Content-Type":"application/json"},r="/v1/apps/{ApplicationId}/events",void 0===e.ApplicationId)throw new Error("No value provided for input HTTP label: ApplicationId.");if((i=e.ApplicationId).length<=0)throw new Error("Empty value provided for input HTTP label: ApplicationId.");return r=r.replace("{ApplicationId}",Object(Ft.f)(i)),void 0!==e.EventsRequest&&(o=en(e.EventsRequest,t)),void 0===o&&(o={}),o=JSON.stringify(o),[4,t.endpoint()];case 1:return s=l.sent(),a=s.hostname,u=s.protocol,c=void 0===u?"https":u,f=s.port,[2,new Bt.a({protocol:c,hostname:a,port:f,method:"POST",headers:n,path:r,body:o})]}}))}))}(e,t)},t.prototype.deserialize=function(e,t){return function(e,t){return h(void 0,void 0,void 0,(function(){var n,r;return p(this,(function(i){switch(i.label){case 0:return 202!==e.statusCode&&e.statusCode>=300?[2,zt(e,t)]:(n={$metadata:vn(e),EventsResponse:void 0},[4,mn(e.body,t)]);case 1:return r=i.sent(),n.EventsResponse=ln(r,t),[2,Promise.resolve(n)]}}))}))}(e,t)},t}(Ft.b),_n=function(e){function t(t){var n=e.call(this)||this;return n.input=t,n}return l(t,e),t.prototype.resolveMiddleware=function(e,t,n){this.middlewareStack.use(Object(yn.a)(t,this.serialize,this.deserialize));var r=e.concat(this.middlewareStack),i=t.logger,o={logger:i,clientName:"PinpointClient",commandName:"UpdateEndpointCommand",inputFilterSensitiveLog:ct.filterSensitiveLog,outputFilterSensitiveLog:ft.filterSensitiveLog};"function"==typeof i.info&&i.info({clientName:"PinpointClient",commandName:"UpdateEndpointCommand"});var s=t.requestHandler;return r.resolve((function(e){return s.handle(e.request,n||{})}),o)},t.prototype.serialize=function(e,t){return function(e,t){return h(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,f;return p(this,(function(l){switch(l.label){case 0:if(n={"Content-Type":"application/json"},r="/v1/apps/{ApplicationId}/endpoints/{EndpointId}",void 0===e.ApplicationId)throw new Error("No value provided for input HTTP label: ApplicationId.");if((i=e.ApplicationId).length<=0)throw new Error("Empty value provided for input HTTP label: ApplicationId.");if(r=r.replace("{ApplicationId}",Object(Ft.f)(i)),void 0===e.EndpointId)throw new Error("No value provided for input HTTP label: EndpointId.");if((i=e.EndpointId).length<=0)throw new Error("Empty value provided for input HTTP label: EndpointId.");return r=r.replace("{EndpointId}",Object(Ft.f)(i)),void 0!==e.EndpointRequest&&(o=Xt(e.EndpointRequest,t)),void 0===o&&(o={}),o=JSON.stringify(o),[4,t.endpoint()];case 1:return s=l.sent(),a=s.hostname,u=s.protocol,c=void 0===u?"https":u,f=s.port,[2,new Bt.a({protocol:c,hostname:a,port:f,method:"PUT",headers:n,path:r,body:o})]}}))}))}(e,t)},t.prototype.deserialize=function(e,t){return function(e,t){return h(void 0,void 0,void 0,(function(){var n,r;return p(this,(function(i){switch(i.label){case 0:return 202!==e.statusCode&&e.statusCode>=300?[2,qt(e,t)]:(n={$metadata:vn(e),MessageBody:void 0},[4,mn(e.body,t)]);case 1:return r=i.sent(),n.MessageBody=pn(r,t),[2,Promise.resolve(n)]}}))}))}(e,t)},t}(Ft.b),Sn=n(149),En=n(38),Mn=n(18),An=n(24),In=n(11),kn=n(39),On=n(17),xn=n(40),Cn=n(41),Tn=n(15),Pn=new Set(["ap-east-1","ap-northeast-1","ap-northeast-2","ap-south-1","ap-southeast-1","ap-southeast-2","ca-central-1","eu-central-1","eu-north-1","eu-west-1","eu-west-2","eu-west-3","me-south-1","sa-east-1","us-east-1","us-east-2","us-west-1","us-west-2"]),Nn=new Set(["cn-north-1","cn-northwest-1"]),Rn=new Set(["us-iso-east-1"]),Ln=new Set(["us-isob-east-1"]),jn=new Set(["us-gov-east-1","us-gov-west-1"]),Dn=d(d({},{apiVersion:"2016-12-01",disableHostPrefix:!1,logger:{},regionInfoProvider:function(e,t){var n=void 0;switch(e){case"ap-south-1":n={hostname:"pinpoint.ap-south-1.amazonaws.com",partition:"aws",signingService:"mobiletargeting"};break;case"ap-southeast-2":n={hostname:"pinpoint.ap-southeast-2.amazonaws.com",partition:"aws",signingService:"mobiletargeting"};break;case"eu-central-1":n={hostname:"pinpoint.eu-central-1.amazonaws.com",partition:"aws",signingService:"mobiletargeting"};break;case"eu-west-1":n={hostname:"pinpoint.eu-west-1.amazonaws.com",partition:"aws",signingService:"mobiletargeting"};break;case"us-east-1":n={hostname:"pinpoint.us-east-1.amazonaws.com",partition:"aws",signingService:"mobiletargeting"};break;case"us-west-2":n={hostname:"pinpoint.us-west-2.amazonaws.com",partition:"aws",signingService:"mobiletargeting"};break;default:Pn.has(e)&&(n={hostname:"pinpoint.{region}.amazonaws.com".replace("{region}",e),partition:"aws",signingService:"mobiletargeting"}),Nn.has(e)&&(n={hostname:"pinpoint.{region}.amazonaws.com.cn".replace("{region}",e),partition:"aws-cn"}),Rn.has(e)&&(n={hostname:"pinpoint.{region}.c2s.ic.gov".replace("{region}",e),partition:"aws-iso"}),Ln.has(e)&&(n={hostname:"pinpoint.{region}.sc2s.sgov.gov".replace("{region}",e),partition:"aws-iso-b"}),jn.has(e)&&(n={hostname:"pinpoint.{region}.amazonaws.com".replace("{region}",e),partition:"aws-us-gov"}),void 0===n&&(n={hostname:"pinpoint.{region}.amazonaws.com".replace("{region}",e),partition:"aws",signingService:"mobiletargeting"})}return Promise.resolve(n)},signingName:"mobiletargeting"}),{runtime:"browser",base64Decoder:On.a,base64Encoder:On.b,bodyLengthChecker:xn.a,credentialDefaultProvider:Object(An.a)("Credential is missing"),defaultUserAgent:Object(Cn.a)(Sn.name,Sn.version),maxAttempts:In.a,region:Object(An.a)("Region is missing"),requestHandler:new Mn.a,sha256:En.Sha256,streamCollector:Mn.b,urlParser:kn.a,utf8Decoder:Tn.a,utf8Encoder:Tn.b}),Un=n(22),Bn=n(37),Fn=n(21),zn=n(43),qn=n(25),Kn=n(23),Hn=function(e){function t(t){var n=this,r=d(d({},Dn),t),i=Object(Un.b)(r),o=Object(Un.a)(i),s=Object(qn.b)(o),a=Object(In.c)(s),u=Object(Kn.b)(a),c=Object(Fn.b)(u);return(n=e.call(this,c)||this).config=c,n.middlewareStack.use(Object(qn.a)(n.config)),n.middlewareStack.use(Object(In.b)(n.config)),n.middlewareStack.use(Object(Kn.a)(n.config)),n.middlewareStack.use(Object(Bn.a)(n.config)),n.middlewareStack.use(Object(Fn.a)(n.config)),n.middlewareStack.use(Object(zn.a)(n.config)),n}return l(t,e),t.prototype.destroy=function(){e.prototype.destroy.call(this)},t}(Ft.a),Vn=n(26),Gn=n(27),Wn=function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function s(e){try{u(r.next(e))}catch(e){o(e)}}function a(e){try{u(r.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}u((r=r.apply(e,t||[])).next())}))},$n=function(e,t){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(i=s.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},Jn=function(){for(var e=[],t=0;tthis._config.bufferSize)return Zn.debug("Exceeded analytics events buffer size"),e.handlers.reject(new Error("Exceeded the size of analytics events buffer"));var n=((t={})[e.params.event.eventId]=e,t);this._buffer.push(n)},e.prototype.pause=function(){this._pause=!0},e.prototype.resume=function(){this._pause=!1},e.prototype.updateClient=function(e){this._client=e},e.prototype.flush=function(){this._flush=!0},e.prototype._startLoop=function(){this._interval&&clearInterval(this._interval);var e=this._config.flushInterval;this._interval=setInterval(this._sendBatch,e)},e.prototype._sendBatch=function(){var e=this._buffer.length;if(this._flush&&!e&&clearInterval(this._interval),!this._pause&&e){var t=this._config.flushSize,n=Math.min(t,e),r=this._buffer.splice(0,n);this._putEvents(r)}},e.prototype._putEvents=function(e){return Wn(this,void 0,void 0,(function(){var t,n,r,i,o;return $n(this,(function(s){switch(s.label){case 0:t=this._bufferToMap(e),n=this._generateBatchEventParams(t),s.label=1;case 1:return s.trys.push([1,3,,4]),r=new wn(n),[4,this._client.send(r)];case 2:return i=s.sent(),this._processPutEventsSuccessResponse(i,t),[3,4];case 3:return o=s.sent(),[2,this._handlePutEventsFailure(o,t)];case 4:return[2]}}))}))},e.prototype._generateBatchEventParams=function(e){var t={ApplicationId:"",EventsRequest:{BatchItem:{}}};return Object.values(e).forEach((function(e){var n=e.params,r=n.event,i=n.timestamp,o=n.config,s=r.name,a=r.attributes,u=r.metrics,c=r.eventId,f=r.session,l=o.appId,d=o.endpointId,h=t.EventsRequest.BatchItem;t.ApplicationId=t.ApplicationId||l,h[d]||(h[d]={Endpoint:{},Events:{}}),h[d].Events[c]={EventType:s,Timestamp:new Date(i).toISOString(),Attributes:a,Metrics:u,Session:f}})),t},e.prototype._handlePutEventsFailure=function(e,t){Zn.debug("_putEvents Failed: ",e);var n=e.$metadata&&e.$metadata.httpStatusCode;if(Xn.includes(n)){var r=Object.values(t);this._retry(r)}else;},e.prototype._processPutEventsSuccessResponse=function(e,t){var n=e.EventsResponse.Results,r=[];Object.entries(n).forEach((function(e){var n=Yn(e,2),i=n[0],o=n[1].EventsItemResponse;Object.entries(o).forEach((function(e){var n,o,s=Yn(e,2),a=s[0],u=s[1],c=u.StatusCode,f=u.Message,l=t[a],d={EventsResponse:{Results:(n={},n[i]={EventsItemResponse:(o={},o[a]={StatusCode:c,Message:f},o)},n)}};if(Qn.includes(c))l.handlers.resolve(d);else{if(!Xn.includes(c)){var h=l.params.event.name;return Zn.error("event "+a+" : "+h+" failed with error: "+f),l.handlers.reject(d)}r.push(l)}}))})),r.length&&this._retry(r)},e.prototype._retry=function(e){var t,n=[];e.forEach((function(e){var t,r=e.params,i=r.event,o=i.eventId,s=i.name;if(r.resendLimit-- >0)return Zn.debug("resending event "+o+" : "+s+" with "+r.resendLimit+" retry attempts remaining"),void n.push((t={},t[o]=e,t));Zn.debug("no retry attempts remaining for event "+o+" : "+s)})),(t=this._buffer).unshift.apply(t,Jn(n))},e.prototype._bufferToMap=function(e){return e.reduce((function(e,t){var n=Yn(Object.entries(t),1),r=Yn(n[0],2),i=r[0],o=r[1];return e[i]=o,e}),{})},e}();function tr(e){return(tr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var nr=function(){return(nr=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0?(ur.debug("resending event "+e.eventName+" with "+e.resendLimit+" retry times left"),this._pinpointPutEvents(e,t)):ur.debug("retry times used up for event "+e.eventName)},e.prototype._updateEndpoint=function(e){return rr(this,void 0,void 0,(function(){var t,n,r,i,o,s,u,c,f,l,d,h;return ir(this,(function(p){switch(p.label){case 0:t=e.params,n=e.handlers,r=t.config,i=t.event,o=r.appId,s=r.endpointId,u=this._endpointRequest(r,a.a.transferKeyToLowerCase(i,[],["attributes","userAttributes","Attributes","UserAttributes"])),c={ApplicationId:o,EndpointId:s,EndpointRequest:u},p.label=1;case 1:return p.trys.push([1,3,,4]),f=new _n(c),[4,this.pinpointClient.send(f)];case 2:return l=p.sent(),ur.debug("updateEndpoint success",l),this._endpointGenerating=!1,this._resumeBuffer(),n.resolve(l),[2];case 3:return d=p.sent(),h={err:d,update_params:c,endpointObject:e},[2,this._handleEndpointUpdateFailure(h)];case 4:return[2]}}))}))},e.prototype._handleEndpointUpdateFailure=function(e){return rr(this,void 0,void 0,(function(){var t,n,r;return ir(this,(function(i){switch(t=e.err,n=e.endpointObject,r=t.$metadata&&t.$metadata.httpStatusCode,ur.debug("updateEndpoint error",t),r){case 403:return[2,this._handleEndpointUpdateForbidden(e)];default:if(cr.includes(r))return!0,[2,this._retryEndpointUpdate(n,!0)];ur.error("updateEndpoint failed",t),n.handlers.reject(t)}return[2]}))}))},e.prototype._handleEndpointUpdateForbidden=function(e){var t=e.err,n=e.endpointObject,r=t.code,i=t.retryable;if("ExpiredTokenException"!==r&&!i)return n.handlers.reject(t);this._retryEndpointUpdate(n)},e.prototype._retryEndpointUpdate=function(e,t){void 0===t&&(t=!1),ur.debug("_retryEndpointUpdate",e);var n=e.params,r=n.config.resendLimit;if(n.resendLimit="number"==typeof n.resendLimit?n.resendLimit:r,n.resendLimit-- >0)return ur.debug("resending endpoint update "+n.event.eventId+" with "+n.resendLimit+" retry attempts remaining"),void(this._endpointBuffer.length?this._endpointBuffer.unshift(e):this._updateEndpoint(e));ur.warn("resending endpoint update "+n.event.eventId+" failed after "+n.config.resendLimit+" attempts"),this._endpointGenerating&&ur.error("Initial endpoint update failed. ")},e.prototype._initClients=function(e){return rr(this,void 0,void 0,(function(){var t,n;return ir(this,(function(r){return ur.debug("init clients"),this.pinpointClient&&this._config.credentials&&this._config.credentials.sessionToken===e.sessionToken&&this._config.credentials.identityId===e.identityId?(ur.debug("no change for aws credentials, directly return from init"),[2]):(t=this._config.credentials?this._config.credentials.identityId:null,this._config.credentials=e,n=this._config.region,ur.debug("init clients with credentials",e),this.pinpointClient=new Hn({region:n,credentials:e,customUserAgent:Object(u.b)()}),this.pinpointClient.middlewareStack.addRelativeTo((function(e){return function(t){return delete t.request.headers["amz-sdk-invocation-id"],delete t.request.headers["amz-sdk-request"],e(t)}}),{step:"finalizeRequest",relation:"after",toMiddleware:"retryMiddleware"}),this._bufferExists()&&t===e.identityId?this._updateBufferClient():this._initBuffer(),this._customizePinpointClientReq(),[2])}))}))},e.prototype._bufferExists=function(){return this._buffer&&this._buffer instanceof er},e.prototype._initBuffer=function(){this._bufferExists()&&this._flushBuffer(),this._buffer=new er(this.pinpointClient,this._config),this._endpointGenerating&&this._buffer.pause()},e.prototype._updateBufferClient=function(){this._bufferExists()&&this._buffer.updateClient(this.pinpointClient)},e.prototype._flushBuffer=function(){this._bufferExists()&&(this._buffer.flush(),this._buffer=null)},e.prototype._resumeBuffer=function(){this._bufferExists()&&this._buffer.resume()},e.prototype._customizePinpointClientReq=function(){},e.prototype._getEndpointId=function(e){return rr(this,void 0,void 0,(function(){var t;return ir(this,(function(n){switch(n.label){case 0:return[4,Vn.a.getItem(e)];case 1:return t=n.sent(),ur.debug("endpointId from cache",t,"type",tr(t)),t||(t=Object(Gn.v1)(),Vn.a.setItem(e,t)),[2,t]}}))}))},e.prototype._endpointRequest=function(e,t){var n=e.credentials,r=this._clientInfo||{},i=e.clientContext||{},o=e.endpoint||{},s={appVersion:r.appVersion,make:r.make,model:r.model,modelVersion:r.version,platform:r.platform},u=(i.clientId,i.appTitle,i.appVersionName,i.appVersionCode,i.appPackageName,or(i,["clientId","appTitle","appVersionName","appVersionCode","appPackageName"])),c=t.address?"android"===r.platform?"GCM":"APNS":void 0,f=nr(nr(nr({channelType:c,requestId:Object(Gn.v1)(),effectiveDate:(new Date).toISOString()},o),t),{attributes:nr(nr({},o.attributes),t.attributes),demographic:nr(nr(nr(nr({},s),u),o.demographic),t.demographic),location:nr(nr({},o.location),t.location),metrics:nr(nr({},o.metrics),t.metrics),user:{userId:t.userId||o.userId||n.identityId,userAttributes:nr(nr({},o.userAttributes),t.userAttributes)}}),l=(f.userId,f.userAttributes,f.name,f.session,f.eventId,f.immediate,or(f,["userId","userAttributes","name","session","eventId","immediate"]));return a.a.transferKeyToUpperCase(l,[],["metrics","userAttributes","attributes"])},e.prototype._eventError=function(e){ur.error("record event failed.",e),ur.warn('Please ensure you have updated your Pinpoint IAM Policy with the Action: "mobiletargeting:PutEvents" in order to record events')},e.prototype._getCredentials=function(){return rr(this,void 0,void 0,(function(){var e,t;return ir(this,(function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,c.a.get()];case 1:return(e=n.sent())?(ur.debug("set credentials for analytics",e),[2,c.a.shear(e)]):[2,null];case 2:return t=n.sent(),ur.debug("ensure credentials error",t),[2,null];case 3:return[2]}}))}))},e.category="Analytics",e.providerName="AWSPinpoint",e}()},function(e,t,n){"use strict";n.d(t,"a",(function(){return Ht}));var r=n(44),i=n(50),o=n(89),s=function(e,t){return(s=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}s(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var u=function(){return(u=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]=300?[2,Fe(e,t)]:[4,dt(e.body,t)];case 1:return n=o.sent(),{},r=st(n,t),i=u({$metadata:ct(e)},r),[2,Promise.resolve(i)]}}))}))}(e,t)},t}(pt.b),gt=n(150),mt=n(38),bt=n(110),yt=n(18),wt=n(24),_t=n(11),St=n(39),Et=n(17),Mt=n(40),At=n(41),It=n(15),kt=new Set(["ap-east-1","ap-northeast-1","ap-northeast-2","ap-south-1","ap-southeast-1","ap-southeast-2","ca-central-1","eu-central-1","eu-north-1","eu-west-1","eu-west-2","eu-west-3","me-south-1","sa-east-1","us-east-1","us-east-2","us-west-1","us-west-2"]),Ot=new Set(["cn-north-1","cn-northwest-1"]),xt=new Set(["us-iso-east-1"]),Ct=new Set(["us-isob-east-1"]),Tt=new Set(["us-gov-east-1","us-gov-west-1"]),Pt=u(u({},{apiVersion:"2013-12-02",disableHostPrefix:!1,logger:{},regionInfoProvider:function(e,t){var n=void 0;switch(e){case"ap-east-1":n={hostname:"kinesis.ap-east-1.amazonaws.com",partition:"aws"};break;case"ap-northeast-1":n={hostname:"kinesis.ap-northeast-1.amazonaws.com",partition:"aws"};break;case"ap-northeast-2":n={hostname:"kinesis.ap-northeast-2.amazonaws.com",partition:"aws"};break;case"ap-south-1":n={hostname:"kinesis.ap-south-1.amazonaws.com",partition:"aws"};break;case"ap-southeast-1":n={hostname:"kinesis.ap-southeast-1.amazonaws.com",partition:"aws"};break;case"ap-southeast-2":n={hostname:"kinesis.ap-southeast-2.amazonaws.com",partition:"aws"};break;case"ca-central-1":n={hostname:"kinesis.ca-central-1.amazonaws.com",partition:"aws"};break;case"cn-north-1":n={hostname:"kinesis.cn-north-1.amazonaws.com.cn",partition:"aws-cn"};break;case"cn-northwest-1":n={hostname:"kinesis.cn-northwest-1.amazonaws.com.cn",partition:"aws-cn"};break;case"eu-central-1":n={hostname:"kinesis.eu-central-1.amazonaws.com",partition:"aws"};break;case"eu-north-1":n={hostname:"kinesis.eu-north-1.amazonaws.com",partition:"aws"};break;case"eu-west-1":n={hostname:"kinesis.eu-west-1.amazonaws.com",partition:"aws"};break;case"eu-west-2":n={hostname:"kinesis.eu-west-2.amazonaws.com",partition:"aws"};break;case"eu-west-3":n={hostname:"kinesis.eu-west-3.amazonaws.com",partition:"aws"};break;case"me-south-1":n={hostname:"kinesis.me-south-1.amazonaws.com",partition:"aws"};break;case"sa-east-1":n={hostname:"kinesis.sa-east-1.amazonaws.com",partition:"aws"};break;case"us-east-1":n={hostname:"kinesis.us-east-1.amazonaws.com",partition:"aws"};break;case"us-east-2":n={hostname:"kinesis.us-east-2.amazonaws.com",partition:"aws"};break;case"us-gov-east-1":n={hostname:"kinesis.us-gov-east-1.amazonaws.com",partition:"aws-us-gov"};break;case"us-gov-west-1":n={hostname:"kinesis.us-gov-west-1.amazonaws.com",partition:"aws-us-gov"};break;case"us-iso-east-1":n={hostname:"kinesis.us-iso-east-1.c2s.ic.gov",partition:"aws-iso"};break;case"us-isob-east-1":n={hostname:"kinesis.us-isob-east-1.sc2s.sgov.gov",partition:"aws-iso-b"};break;case"us-west-1":n={hostname:"kinesis.us-west-1.amazonaws.com",partition:"aws"};break;case"us-west-2":n={hostname:"kinesis.us-west-2.amazonaws.com",partition:"aws"};break;default:kt.has(e)&&(n={hostname:"kinesis.{region}.amazonaws.com".replace("{region}",e),partition:"aws"}),Ot.has(e)&&(n={hostname:"kinesis.{region}.amazonaws.com.cn".replace("{region}",e),partition:"aws-cn"}),xt.has(e)&&(n={hostname:"kinesis.{region}.c2s.ic.gov".replace("{region}",e),partition:"aws-iso"}),Ct.has(e)&&(n={hostname:"kinesis.{region}.sc2s.sgov.gov".replace("{region}",e),partition:"aws-iso-b"}),Tt.has(e)&&(n={hostname:"kinesis.{region}.amazonaws.com".replace("{region}",e),partition:"aws-us-gov"}),void 0===n&&(n={hostname:"kinesis.{region}.amazonaws.com".replace("{region}",e),partition:"aws"})}return Promise.resolve(n)},signingName:"kinesis"}),{runtime:"browser",base64Decoder:Et.a,base64Encoder:Et.b,bodyLengthChecker:Mt.a,credentialDefaultProvider:Object(wt.a)("Credential is missing"),defaultUserAgent:Object(At.a)(gt.name,gt.version),eventStreamSerdeProvider:bt.a,maxAttempts:_t.a,region:Object(wt.a)("Region is missing"),requestHandler:new yt.a,sha256:mt.Sha256,streamCollector:yt.b,urlParser:St.a,utf8Decoder:It.a,utf8Encoder:It.b}),Nt=n(22),Rt=n(112),Lt=n(37),jt=n(21),Dt=n(43),Ut=n(25),Bt=n(23),Ft=function(e){function t(t){var n=this,r=u(u({},Pt),t),i=Object(Nt.b)(r),o=Object(Nt.a)(i),s=Object(Ut.b)(o),a=Object(_t.c)(s),c=Object(Bt.b)(a),f=Object(jt.b)(c),l=Object(Rt.a)(f);return(n=e.call(this,l)||this).config=l,n.middlewareStack.use(Object(Ut.a)(n.config)),n.middlewareStack.use(Object(_t.b)(n.config)),n.middlewareStack.use(Object(Bt.a)(n.config)),n.middlewareStack.use(Object(Lt.a)(n.config)),n.middlewareStack.use(Object(jt.a)(n.config)),n.middlewareStack.use(Object(Dt.a)(n.config)),n}return a(t,e),t.prototype.destroy=function(){e.prototype.destroy.call(this)},t}(pt.a),zt=function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function s(e){try{u(r.next(e))}catch(e){o(e)}}function a(e){try{u(r.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}u((r=r.apply(e,t||[])).next())}))},qt=function(e,t){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(i=s.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]=0&&this.changeListeners.splice(t,1)},e}(),a=n(33),u=Object(a.b)().isBrowser,c=function(){function e(e){void 0===e&&(e={}),this.cookies=new s,this.store=u?window.localStorage:Object.create(null),this.cookies=e.req?new s(e.req.headers.cookie):new s,Object.assign(this.store,this.cookies.getAll())}return Object.defineProperty(e.prototype,"length",{get:function(){return Object.entries(this.store).length},enumerable:!0,configurable:!0}),e.prototype.clear=function(){var e=this;Array.from(new Array(this.length)).map((function(t,n){return e.key(n)})).forEach((function(t){return e.removeItem(t)}))},e.prototype.getItem=function(e){return this.getLocalItem(e)},e.prototype.getLocalItem=function(e){return Object.prototype.hasOwnProperty.call(this.store,e)?this.store[e]:null},e.prototype.getUniversalItem=function(e){return this.cookies.get(e)},e.prototype.key=function(e){return Object.keys(this.store)[e]},e.prototype.removeItem=function(e){this.removeLocalItem(e),this.removeUniversalItem(e)},e.prototype.removeLocalItem=function(e){delete this.store[e]},e.prototype.removeUniversalItem=function(e){this.cookies.remove(e,{path:"/"})},e.prototype.setItem=function(e,t){switch(this.setLocalItem(e,t),e.split(".").pop()){case"LastAuthUser":case"accessToken":case"idToken":this.setUniversalItem(e,t)}},e.prototype.setLocalItem=function(e,t){this.store[e]=t},e.prototype.setUniversalItem=function(e,t){this.cookies.set(e,t,{path:"/",sameSite:!0,secure:"localhost"!==window.location.hostname})},e}()},function(e){e.exports=JSON.parse('{"name":"@aws-sdk/client-cognito-identity","description":"AWS SDK for JavaScript Cognito Identity Client for Node.js, Browser and React Native","version":"1.0.0-rc.4","scripts":{"clean":"npm run remove-definitions && npm run remove-dist","build-documentation":"npm run clean && typedoc ./","prepublishOnly":"yarn build","pretest":"yarn build:cjs","remove-definitions":"rimraf ./types","remove-dist":"rimraf ./dist","remove-documentation":"rimraf ./docs","test:unit":"mocha **/cjs/**/*.spec.js","test:e2e":"mocha **/cjs/**/*.ispec.js && karma start karma.conf.js","test":"yarn test:unit","build:cjs":"tsc -p tsconfig.json","build:es":"tsc -p tsconfig.es.json","build":"yarn build:cjs && yarn build:es"},"main":"./dist/cjs/index.js","types":"./types/index.d.ts","module":"./dist/es/index.js","browser":{"./runtimeConfig":"./runtimeConfig.browser"},"react-native":{"./runtimeConfig":"./runtimeConfig.native"},"sideEffects":false,"dependencies":{"@aws-crypto/sha256-browser":"^1.0.0","@aws-crypto/sha256-js":"^1.0.0","@aws-sdk/config-resolver":"1.0.0-rc.3","@aws-sdk/credential-provider-node":"1.0.0-rc.3","@aws-sdk/fetch-http-handler":"1.0.0-rc.3","@aws-sdk/hash-node":"1.0.0-rc.3","@aws-sdk/invalid-dependency":"1.0.0-rc.3","@aws-sdk/middleware-content-length":"1.0.0-rc.3","@aws-sdk/middleware-host-header":"1.0.0-rc.3","@aws-sdk/middleware-logger":"1.0.0-rc.4","@aws-sdk/middleware-retry":"1.0.0-rc.4","@aws-sdk/middleware-serde":"1.0.0-rc.3","@aws-sdk/middleware-signing":"1.0.0-rc.3","@aws-sdk/middleware-stack":"1.0.0-rc.4","@aws-sdk/middleware-user-agent":"1.0.0-rc.3","@aws-sdk/node-config-provider":"1.0.0-rc.3","@aws-sdk/node-http-handler":"1.0.0-rc.3","@aws-sdk/protocol-http":"1.0.0-rc.3","@aws-sdk/smithy-client":"1.0.0-rc.4","@aws-sdk/types":"1.0.0-rc.3","@aws-sdk/url-parser-browser":"1.0.0-rc.3","@aws-sdk/url-parser-node":"1.0.0-rc.3","@aws-sdk/util-base64-browser":"1.0.0-rc.3","@aws-sdk/util-base64-node":"1.0.0-rc.3","@aws-sdk/util-body-length-browser":"1.0.0-rc.3","@aws-sdk/util-body-length-node":"1.0.0-rc.3","@aws-sdk/util-user-agent-browser":"1.0.0-rc.3","@aws-sdk/util-user-agent-node":"1.0.0-rc.3","@aws-sdk/util-utf8-browser":"1.0.0-rc.3","@aws-sdk/util-utf8-node":"1.0.0-rc.3","tslib":"^2.0.0"},"devDependencies":{"@aws-sdk/client-documentation-generator":"1.0.0-rc.3","@aws-sdk/client-iam":"1.0.0-rc.4","@types/chai":"^4.2.11","@types/mocha":"^7.0.2","@types/node":"^12.7.5","jest":"^26.1.0","rimraf":"^3.0.0","typedoc":"^0.17.8","typescript":"~4.0.2"},"engines":{"node":">=10.0.0"},"author":{"name":"AWS SDK for JavaScript Team","url":"https://aws.amazon.com/javascript/"},"license":"Apache-2.0","homepage":"https://github.com/aws/aws-sdk-js-v3/tree/master/clients/client-cognito-identity","repository":{"type":"git","url":"https://github.com/aws/aws-sdk-js-v3.git","directory":"clients/client-cognito-identity"}}')},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),n(1).__exportStar(n(385),t)},function(e){e.exports=JSON.parse('{"name":"@aws-sdk/client-pinpoint","description":"AWS SDK for JavaScript Pinpoint Client for Node.js, Browser and React Native","version":"1.0.0-rc.4","scripts":{"clean":"npm run remove-definitions && npm run remove-dist","build-documentation":"npm run clean && typedoc ./","prepublishOnly":"yarn build","pretest":"yarn build:cjs","remove-definitions":"rimraf ./types","remove-dist":"rimraf ./dist","remove-documentation":"rimraf ./docs","test":"exit 0","build:cjs":"tsc -p tsconfig.json","build:es":"tsc -p tsconfig.es.json","build":"yarn build:cjs && yarn build:es"},"main":"./dist/cjs/index.js","types":"./types/index.d.ts","module":"./dist/es/index.js","browser":{"./runtimeConfig":"./runtimeConfig.browser"},"react-native":{"./runtimeConfig":"./runtimeConfig.native"},"sideEffects":false,"dependencies":{"@aws-crypto/sha256-browser":"^1.0.0","@aws-crypto/sha256-js":"^1.0.0","@aws-sdk/config-resolver":"1.0.0-rc.3","@aws-sdk/credential-provider-node":"1.0.0-rc.3","@aws-sdk/fetch-http-handler":"1.0.0-rc.3","@aws-sdk/hash-node":"1.0.0-rc.3","@aws-sdk/invalid-dependency":"1.0.0-rc.3","@aws-sdk/middleware-content-length":"1.0.0-rc.3","@aws-sdk/middleware-host-header":"1.0.0-rc.3","@aws-sdk/middleware-logger":"1.0.0-rc.4","@aws-sdk/middleware-retry":"1.0.0-rc.4","@aws-sdk/middleware-serde":"1.0.0-rc.3","@aws-sdk/middleware-signing":"1.0.0-rc.3","@aws-sdk/middleware-stack":"1.0.0-rc.4","@aws-sdk/middleware-user-agent":"1.0.0-rc.3","@aws-sdk/node-config-provider":"1.0.0-rc.3","@aws-sdk/node-http-handler":"1.0.0-rc.3","@aws-sdk/protocol-http":"1.0.0-rc.3","@aws-sdk/smithy-client":"1.0.0-rc.4","@aws-sdk/types":"1.0.0-rc.3","@aws-sdk/url-parser-browser":"1.0.0-rc.3","@aws-sdk/url-parser-node":"1.0.0-rc.3","@aws-sdk/util-base64-browser":"1.0.0-rc.3","@aws-sdk/util-base64-node":"1.0.0-rc.3","@aws-sdk/util-body-length-browser":"1.0.0-rc.3","@aws-sdk/util-body-length-node":"1.0.0-rc.3","@aws-sdk/util-user-agent-browser":"1.0.0-rc.3","@aws-sdk/util-user-agent-node":"1.0.0-rc.3","@aws-sdk/util-utf8-browser":"1.0.0-rc.3","@aws-sdk/util-utf8-node":"1.0.0-rc.3","tslib":"^2.0.0"},"devDependencies":{"@aws-sdk/client-documentation-generator":"1.0.0-rc.3","@types/node":"^12.7.5","jest":"^26.1.0","rimraf":"^3.0.0","typedoc":"^0.17.8","typescript":"~4.0.2"},"engines":{"node":">=10.0.0"},"author":{"name":"AWS SDK for JavaScript Team","url":"https://aws.amazon.com/javascript/"},"license":"Apache-2.0","homepage":"https://github.com/aws/aws-sdk-js-v3/tree/master/clients/client-pinpoint","repository":{"type":"git","url":"https://github.com/aws/aws-sdk-js-v3.git","directory":"clients/client-pinpoint"}}')},function(e){e.exports=JSON.parse('{"name":"@aws-sdk/client-kinesis","description":"AWS SDK for JavaScript Kinesis Client for Node.js, Browser and React Native","version":"1.0.0-rc.4","scripts":{"clean":"npm run remove-definitions && npm run remove-dist","build-documentation":"npm run clean && typedoc ./","prepublishOnly":"yarn build","pretest":"yarn build:cjs","remove-definitions":"rimraf ./types","remove-dist":"rimraf ./dist","remove-documentation":"rimraf ./docs","test":"exit 0","build:cjs":"tsc -p tsconfig.json","build:es":"tsc -p tsconfig.es.json","build":"yarn build:cjs && yarn build:es"},"main":"./dist/cjs/index.js","types":"./types/index.d.ts","module":"./dist/es/index.js","browser":{"./runtimeConfig":"./runtimeConfig.browser"},"react-native":{"./runtimeConfig":"./runtimeConfig.native"},"sideEffects":false,"dependencies":{"@aws-crypto/sha256-browser":"^1.0.0","@aws-crypto/sha256-js":"^1.0.0","@aws-sdk/config-resolver":"1.0.0-rc.3","@aws-sdk/credential-provider-node":"1.0.0-rc.3","@aws-sdk/eventstream-serde-browser":"1.0.0-rc.3","@aws-sdk/eventstream-serde-config-resolver":"1.0.0-rc.3","@aws-sdk/eventstream-serde-node":"1.0.0-rc.3","@aws-sdk/fetch-http-handler":"1.0.0-rc.3","@aws-sdk/hash-node":"1.0.0-rc.3","@aws-sdk/invalid-dependency":"1.0.0-rc.3","@aws-sdk/middleware-content-length":"1.0.0-rc.3","@aws-sdk/middleware-host-header":"1.0.0-rc.3","@aws-sdk/middleware-logger":"1.0.0-rc.4","@aws-sdk/middleware-retry":"1.0.0-rc.4","@aws-sdk/middleware-serde":"1.0.0-rc.3","@aws-sdk/middleware-signing":"1.0.0-rc.3","@aws-sdk/middleware-stack":"1.0.0-rc.4","@aws-sdk/middleware-user-agent":"1.0.0-rc.3","@aws-sdk/node-config-provider":"1.0.0-rc.3","@aws-sdk/node-http-handler":"1.0.0-rc.3","@aws-sdk/protocol-http":"1.0.0-rc.3","@aws-sdk/smithy-client":"1.0.0-rc.4","@aws-sdk/types":"1.0.0-rc.3","@aws-sdk/url-parser-browser":"1.0.0-rc.3","@aws-sdk/url-parser-node":"1.0.0-rc.3","@aws-sdk/util-base64-browser":"1.0.0-rc.3","@aws-sdk/util-base64-node":"1.0.0-rc.3","@aws-sdk/util-body-length-browser":"1.0.0-rc.3","@aws-sdk/util-body-length-node":"1.0.0-rc.3","@aws-sdk/util-user-agent-browser":"1.0.0-rc.3","@aws-sdk/util-user-agent-node":"1.0.0-rc.3","@aws-sdk/util-utf8-browser":"1.0.0-rc.3","@aws-sdk/util-utf8-node":"1.0.0-rc.3","tslib":"^2.0.0"},"devDependencies":{"@aws-sdk/client-documentation-generator":"1.0.0-rc.3","@types/node":"^12.7.5","jest":"^26.1.0","rimraf":"^3.0.0","typedoc":"^0.17.8","typescript":"~4.0.2"},"engines":{"node":">=10.0.0"},"author":{"name":"AWS SDK for JavaScript Team","url":"https://aws.amazon.com/javascript/"},"license":"Apache-2.0","homepage":"https://github.com/aws/aws-sdk-js-v3/tree/master/clients/client-kinesis","repository":{"type":"git","url":"https://github.com/aws/aws-sdk-js-v3.git","directory":"clients/client-kinesis"}}')},function(e){e.exports=JSON.parse('{"name":"@aws-sdk/client-firehose","description":"AWS SDK for JavaScript Firehose Client for Node.js, Browser and React Native","version":"1.0.0-rc.4","scripts":{"clean":"npm run remove-definitions && npm run remove-dist","build-documentation":"npm run clean && typedoc ./","prepublishOnly":"yarn build","pretest":"yarn build:cjs","remove-definitions":"rimraf ./types","remove-dist":"rimraf ./dist","remove-documentation":"rimraf ./docs","test":"exit 0","build:cjs":"tsc -p tsconfig.json","build:es":"tsc -p tsconfig.es.json","build":"yarn build:cjs && yarn build:es"},"main":"./dist/cjs/index.js","types":"./types/index.d.ts","module":"./dist/es/index.js","browser":{"./runtimeConfig":"./runtimeConfig.browser"},"react-native":{"./runtimeConfig":"./runtimeConfig.native"},"sideEffects":false,"dependencies":{"@aws-crypto/sha256-browser":"^1.0.0","@aws-crypto/sha256-js":"^1.0.0","@aws-sdk/config-resolver":"1.0.0-rc.3","@aws-sdk/credential-provider-node":"1.0.0-rc.3","@aws-sdk/fetch-http-handler":"1.0.0-rc.3","@aws-sdk/hash-node":"1.0.0-rc.3","@aws-sdk/invalid-dependency":"1.0.0-rc.3","@aws-sdk/middleware-content-length":"1.0.0-rc.3","@aws-sdk/middleware-host-header":"1.0.0-rc.3","@aws-sdk/middleware-logger":"1.0.0-rc.4","@aws-sdk/middleware-retry":"1.0.0-rc.4","@aws-sdk/middleware-serde":"1.0.0-rc.3","@aws-sdk/middleware-signing":"1.0.0-rc.3","@aws-sdk/middleware-stack":"1.0.0-rc.4","@aws-sdk/middleware-user-agent":"1.0.0-rc.3","@aws-sdk/node-config-provider":"1.0.0-rc.3","@aws-sdk/node-http-handler":"1.0.0-rc.3","@aws-sdk/protocol-http":"1.0.0-rc.3","@aws-sdk/smithy-client":"1.0.0-rc.4","@aws-sdk/types":"1.0.0-rc.3","@aws-sdk/url-parser-browser":"1.0.0-rc.3","@aws-sdk/url-parser-node":"1.0.0-rc.3","@aws-sdk/util-base64-browser":"1.0.0-rc.3","@aws-sdk/util-base64-node":"1.0.0-rc.3","@aws-sdk/util-body-length-browser":"1.0.0-rc.3","@aws-sdk/util-body-length-node":"1.0.0-rc.3","@aws-sdk/util-user-agent-browser":"1.0.0-rc.3","@aws-sdk/util-user-agent-node":"1.0.0-rc.3","@aws-sdk/util-utf8-browser":"1.0.0-rc.3","@aws-sdk/util-utf8-node":"1.0.0-rc.3","tslib":"^2.0.0"},"devDependencies":{"@aws-sdk/client-documentation-generator":"1.0.0-rc.3","@types/node":"^12.7.5","jest":"^26.1.0","rimraf":"^3.0.0","typedoc":"^0.17.8","typescript":"~4.0.2"},"engines":{"node":">=10.0.0"},"author":{"name":"AWS SDK for JavaScript Team","url":"https://aws.amazon.com/javascript/"},"license":"Apache-2.0","homepage":"https://github.com/aws/aws-sdk-js-v3/tree/master/clients/client-firehose","repository":{"type":"git","url":"https://github.com/aws/aws-sdk-js-v3.git","directory":"clients/client-firehose"}}')},function(e){e.exports=JSON.parse('{"name":"@aws-sdk/client-personalize-events","description":"AWS SDK for JavaScript Personalize Events Client for Node.js, Browser and React Native","version":"1.0.0-rc.4","scripts":{"clean":"npm run remove-definitions && npm run remove-dist","build-documentation":"npm run clean && typedoc ./","prepublishOnly":"yarn build","pretest":"yarn build:cjs","remove-definitions":"rimraf ./types","remove-dist":"rimraf ./dist","remove-documentation":"rimraf ./docs","test":"exit 0","build:cjs":"tsc -p tsconfig.json","build:es":"tsc -p tsconfig.es.json","build":"yarn build:cjs && yarn build:es"},"main":"./dist/cjs/index.js","types":"./types/index.d.ts","module":"./dist/es/index.js","browser":{"./runtimeConfig":"./runtimeConfig.browser"},"react-native":{"./runtimeConfig":"./runtimeConfig.native"},"sideEffects":false,"dependencies":{"@aws-crypto/sha256-browser":"^1.0.0","@aws-crypto/sha256-js":"^1.0.0","@aws-sdk/config-resolver":"1.0.0-rc.3","@aws-sdk/credential-provider-node":"1.0.0-rc.3","@aws-sdk/fetch-http-handler":"1.0.0-rc.3","@aws-sdk/hash-node":"1.0.0-rc.3","@aws-sdk/invalid-dependency":"1.0.0-rc.3","@aws-sdk/middleware-content-length":"1.0.0-rc.3","@aws-sdk/middleware-host-header":"1.0.0-rc.3","@aws-sdk/middleware-logger":"1.0.0-rc.4","@aws-sdk/middleware-retry":"1.0.0-rc.4","@aws-sdk/middleware-serde":"1.0.0-rc.3","@aws-sdk/middleware-signing":"1.0.0-rc.3","@aws-sdk/middleware-stack":"1.0.0-rc.4","@aws-sdk/middleware-user-agent":"1.0.0-rc.3","@aws-sdk/node-config-provider":"1.0.0-rc.3","@aws-sdk/node-http-handler":"1.0.0-rc.3","@aws-sdk/protocol-http":"1.0.0-rc.3","@aws-sdk/smithy-client":"1.0.0-rc.4","@aws-sdk/types":"1.0.0-rc.3","@aws-sdk/url-parser-browser":"1.0.0-rc.3","@aws-sdk/url-parser-node":"1.0.0-rc.3","@aws-sdk/util-base64-browser":"1.0.0-rc.3","@aws-sdk/util-base64-node":"1.0.0-rc.3","@aws-sdk/util-body-length-browser":"1.0.0-rc.3","@aws-sdk/util-body-length-node":"1.0.0-rc.3","@aws-sdk/util-user-agent-browser":"1.0.0-rc.3","@aws-sdk/util-user-agent-node":"1.0.0-rc.3","@aws-sdk/util-utf8-browser":"1.0.0-rc.3","@aws-sdk/util-utf8-node":"1.0.0-rc.3","tslib":"^2.0.0"},"devDependencies":{"@aws-sdk/client-documentation-generator":"1.0.0-rc.3","@types/node":"^12.7.5","jest":"^26.1.0","rimraf":"^3.0.0","typedoc":"^0.17.8","typescript":"~4.0.2"},"engines":{"node":">=10.0.0"},"author":{"name":"AWS SDK for JavaScript Team","url":"https://aws.amazon.com/javascript/"},"license":"Apache-2.0","homepage":"https://github.com/aws/aws-sdk-js-v3/tree/master/clients/client-personalize-events","repository":{"type":"git","url":"https://github.com/aws/aws-sdk-js-v3.git","directory":"clients/client-personalize-events"}}')},function(e){e.exports=JSON.parse('{"name":"@aws-sdk/client-s3","description":"AWS SDK for JavaScript S3 Client for Node.js, Browser and React Native","version":"1.0.0-rc.4","scripts":{"clean":"npm run remove-definitions && npm run remove-dist","build-documentation":"npm run clean && typedoc ./","prepublishOnly":"yarn build","pretest":"yarn build:cjs","remove-definitions":"rimraf ./types","remove-dist":"rimraf ./dist","remove-documentation":"rimraf ./docs","test:unit":"mocha **/cjs/**/*.spec.js","test:e2e":"mocha **/cjs/**/*.ispec.js && karma start karma.conf.js","test":"yarn test:unit","build:cjs":"tsc -p tsconfig.json","build:es":"tsc -p tsconfig.es.json","build":"yarn build:cjs && yarn build:es"},"main":"./dist/cjs/index.js","types":"./types/index.d.ts","module":"./dist/es/index.js","browser":{"./runtimeConfig":"./runtimeConfig.browser"},"react-native":{"./runtimeConfig":"./runtimeConfig.native"},"sideEffects":false,"dependencies":{"@aws-crypto/sha256-browser":"^1.0.0","@aws-crypto/sha256-js":"^1.0.0","@aws-sdk/config-resolver":"1.0.0-rc.3","@aws-sdk/credential-provider-node":"1.0.0-rc.3","@aws-sdk/eventstream-serde-browser":"1.0.0-rc.3","@aws-sdk/eventstream-serde-config-resolver":"1.0.0-rc.3","@aws-sdk/eventstream-serde-node":"1.0.0-rc.3","@aws-sdk/fetch-http-handler":"1.0.0-rc.3","@aws-sdk/hash-blob-browser":"1.0.0-rc.3","@aws-sdk/hash-node":"1.0.0-rc.3","@aws-sdk/hash-stream-node":"1.0.0-rc.3","@aws-sdk/invalid-dependency":"1.0.0-rc.3","@aws-sdk/md5-js":"1.0.0-rc.3","@aws-sdk/middleware-apply-body-checksum":"1.0.0-rc.3","@aws-sdk/middleware-bucket-endpoint":"1.0.0-rc.4","@aws-sdk/middleware-content-length":"1.0.0-rc.3","@aws-sdk/middleware-expect-continue":"1.0.0-rc.3","@aws-sdk/middleware-host-header":"1.0.0-rc.3","@aws-sdk/middleware-location-constraint":"1.0.0-rc.3","@aws-sdk/middleware-logger":"1.0.0-rc.4","@aws-sdk/middleware-retry":"1.0.0-rc.4","@aws-sdk/middleware-sdk-s3":"1.0.0-rc.3","@aws-sdk/middleware-serde":"1.0.0-rc.3","@aws-sdk/middleware-signing":"1.0.0-rc.3","@aws-sdk/middleware-ssec":"1.0.0-rc.3","@aws-sdk/middleware-stack":"1.0.0-rc.4","@aws-sdk/middleware-user-agent":"1.0.0-rc.3","@aws-sdk/node-config-provider":"1.0.0-rc.3","@aws-sdk/node-http-handler":"1.0.0-rc.3","@aws-sdk/protocol-http":"1.0.0-rc.3","@aws-sdk/smithy-client":"1.0.0-rc.4","@aws-sdk/types":"1.0.0-rc.3","@aws-sdk/url-parser-browser":"1.0.0-rc.3","@aws-sdk/url-parser-node":"1.0.0-rc.3","@aws-sdk/util-base64-browser":"1.0.0-rc.3","@aws-sdk/util-base64-node":"1.0.0-rc.3","@aws-sdk/util-body-length-browser":"1.0.0-rc.3","@aws-sdk/util-body-length-node":"1.0.0-rc.3","@aws-sdk/util-user-agent-browser":"1.0.0-rc.3","@aws-sdk/util-user-agent-node":"1.0.0-rc.3","@aws-sdk/util-utf8-browser":"1.0.0-rc.3","@aws-sdk/util-utf8-node":"1.0.0-rc.3","@aws-sdk/xml-builder":"1.0.0-rc.3","fast-xml-parser":"^3.16.0","tslib":"^2.0.0"},"devDependencies":{"@aws-sdk/client-documentation-generator":"1.0.0-rc.3","@types/chai":"^4.2.11","@types/mocha":"^7.0.2","@types/node":"^12.7.5","jest":"^26.1.0","rimraf":"^3.0.0","typedoc":"^0.17.8","typescript":"~4.0.2"},"engines":{"node":">=10.0.0"},"author":{"name":"AWS SDK for JavaScript Team","url":"https://aws.amazon.com/javascript/"},"license":"Apache-2.0","homepage":"https://github.com/aws/aws-sdk-js-v3/tree/master/clients/client-s3","repository":{"type":"git","url":"https://github.com/aws/aws-sdk-js-v3.git","directory":"clients/client-s3"}}')},function(e,t,n){"use strict";(function(e){n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return S}));var r,i,o=n(58),s=n(52),a=n(42),u=n(26),c=n(44),f=n(88),l=n(34),d=n(14),h=n(13),p=n(9),v=n(3),g=function(){return(g=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},w=function(){for(var e=[],t=0;t0){var s=r.map((function(e){return e.message}));return _.warn("Skipping incoming subscription. Messages: "+s.join("\n")),void S.drainBuffer()}var a=p.a.getPredicates(S.syncPredicates.get(t),!1),u=n[o];S.passesPredicateValidation(u,a)&&S.pushToBuffer(i,t,u),S.drainBuffer()},error:function(e){var t=e.error,r=y((void 0===t?{errors:[]}:t).errors,1)[0],i=(void 0===r?{}:r).message,o=void 0===i?"":i;_.warn("subscriptionError",o),"function"==typeof w&&w(),o.includes('"errorType":"Unauthorized"')||n.error(o)}})),l.push(m(S,void 0,void 0,(function(){var e,t=this;return b(this,(function(n){switch(n.label){case 0:return[4,new Promise((function(n){w=n,e=t.hubQueryCompletionListener.bind(t,n),f.a.listen("api",e)}))];case 1:return n.sent(),f.a.remove("api",e),[2]}}))}))),[2]}))}))})),[2]}))}))}))})),Promise.all(l).then((function(){return n.next(r.CONNECTED)})),[2]}}))})),function(){d.forEach((function(e){return e.unsubscribe()}))}})),new d.a((function(e){return t.dataObserver=e,t.drainBuffer(),function(){t.dataObserver=null}}))]},t.prototype.passesPredicateValidation=function(e,t){if(!t)return!0;var n=t.predicates,r=t.type;return Object(v.y)(e,r,n)},t.prototype.pushToBuffer=function(e,t,n){this.buffer.push([e,t,n])},t.prototype.drainBuffer=function(){var e=this;this.dataObserver&&(this.buffer.forEach((function(t){return e.dataObserver.next(t)})),this.buffer=[])},t}()}).call(this,n(6).Buffer)},function(e){e.exports=JSON.parse('{"name":"@aws-sdk/client-lex-runtime-service","description":"AWS SDK for JavaScript Lex Runtime Service Client for Node.js, Browser and React Native","version":"1.0.0-rc.4","scripts":{"clean":"npm run remove-definitions && npm run remove-dist","build-documentation":"npm run clean && typedoc ./","prepublishOnly":"yarn build","pretest":"yarn build:cjs","remove-definitions":"rimraf ./types","remove-dist":"rimraf ./dist","remove-documentation":"rimraf ./docs","test:unit":"mocha **/cjs/**/*.spec.js","test":"yarn test:unit","build:cjs":"tsc -p tsconfig.json","build:es":"tsc -p tsconfig.es.json","build":"yarn build:cjs && yarn build:es"},"main":"./dist/cjs/index.js","types":"./types/index.d.ts","module":"./dist/es/index.js","browser":{"./runtimeConfig":"./runtimeConfig.browser"},"react-native":{"./runtimeConfig":"./runtimeConfig.native"},"sideEffects":false,"dependencies":{"@aws-crypto/sha256-browser":"^1.0.0","@aws-crypto/sha256-js":"^1.0.0","@aws-sdk/config-resolver":"1.0.0-rc.3","@aws-sdk/credential-provider-node":"1.0.0-rc.3","@aws-sdk/fetch-http-handler":"1.0.0-rc.3","@aws-sdk/hash-node":"1.0.0-rc.3","@aws-sdk/invalid-dependency":"1.0.0-rc.3","@aws-sdk/middleware-content-length":"1.0.0-rc.3","@aws-sdk/middleware-host-header":"1.0.0-rc.3","@aws-sdk/middleware-logger":"1.0.0-rc.4","@aws-sdk/middleware-retry":"1.0.0-rc.4","@aws-sdk/middleware-serde":"1.0.0-rc.3","@aws-sdk/middleware-signing":"1.0.0-rc.3","@aws-sdk/middleware-stack":"1.0.0-rc.4","@aws-sdk/middleware-user-agent":"1.0.0-rc.3","@aws-sdk/node-config-provider":"1.0.0-rc.3","@aws-sdk/node-http-handler":"1.0.0-rc.3","@aws-sdk/protocol-http":"1.0.0-rc.3","@aws-sdk/smithy-client":"1.0.0-rc.4","@aws-sdk/types":"1.0.0-rc.3","@aws-sdk/url-parser-browser":"1.0.0-rc.3","@aws-sdk/url-parser-node":"1.0.0-rc.3","@aws-sdk/util-base64-browser":"1.0.0-rc.3","@aws-sdk/util-base64-node":"1.0.0-rc.3","@aws-sdk/util-body-length-browser":"1.0.0-rc.3","@aws-sdk/util-body-length-node":"1.0.0-rc.3","@aws-sdk/util-user-agent-browser":"1.0.0-rc.3","@aws-sdk/util-user-agent-node":"1.0.0-rc.3","@aws-sdk/util-utf8-browser":"1.0.0-rc.3","@aws-sdk/util-utf8-node":"1.0.0-rc.3","tslib":"^2.0.0"},"devDependencies":{"@aws-sdk/client-documentation-generator":"1.0.0-rc.3","@types/chai":"^4.2.11","@types/mocha":"^7.0.2","@types/node":"^12.7.5","jest":"^26.1.0","rimraf":"^3.0.0","typedoc":"^0.17.8","typescript":"~4.0.2"},"engines":{"node":">=10.0.0"},"author":{"name":"AWS SDK for JavaScript Team","url":"https://aws.amazon.com/javascript/"},"license":"Apache-2.0","homepage":"https://github.com/aws/aws-sdk-js-v3/tree/master/clients/client-lex-runtime-service","repository":{"type":"git","url":"https://github.com/aws/aws-sdk-js-v3.git","directory":"clients/client-lex-runtime-service"}}')},,function(e,t,n){"use strict";n.r(t);var r=n(19),i=n(143);n.d(t,"Amplify",(function(){return r.a}));var o=n(63),s=n(26),a=n(491);n.d(t,"Analytics",(function(){return a.a}));var u=n(144);n.d(t,"AWSPinpointProvider",(function(){return u.a}));var c=n(145);n.d(t,"AWSKinesisProvider",(function(){return c.a}));var f=n(492);n.d(t,"AWSKinesisFirehoseProvider",(function(){return f.a}));var l=n(490);n.d(t,"AmazonPersonalizeProvider",(function(){return l.a})),n.d(t,"Auth",(function(){return o.a}));var d=n(140);n.d(t,"Storage",(function(){return d.a})),n.d(t,"StorageClass",(function(){return d.b}));var h=n(62);n.d(t,"API",(function(){return h.a})),n.d(t,"APIClass",(function(){return h.b}));var p=n(248);n.d(t,"graphqlOperation",(function(){return p.b}));var v=n(258);n.d(t,"DataStore",(function(){return v.a}));var g=n(9);n.d(t,"Predicates",(function(){return g.b}));var m=n(4);n.d(t,"SortDirection",(function(){return m.e})),n.d(t,"syncExpression",(function(){return m.n}));var b=n(105);n.d(t,"PubSub",(function(){return b.a})),n.d(t,"Cache",(function(){return s.a}));var y=n(489);n.d(t,"Interactions",(function(){return y.a}));var w=n(246);for(var _ in w)["default","Analytics","AWSPinpointProvider","AWSKinesisProvider","AWSKinesisFirehoseProvider","AmazonPersonalizeProvider","Auth","Storage","StorageClass","API","APIClass","graphqlOperation","DataStore","Predicates","SortDirection","syncExpression","PubSub","Cache","Interactions","XR","Predictions","Logger","Hub","JS","ClientDevice","Signer","I18n","ServiceWorker","withSSRContext","Amplify"].indexOf(_)<0&&function(e){n.d(t,e,(function(){return w[e]}))}(_);var S=n(493);n.d(t,"XR",(function(){return S.a}));var E=n(488);n.d(t,"Predictions",(function(){return E.a}));var M=n(44);n.d(t,"Logger",(function(){return M.a}));var A=n(88);n.d(t,"Hub",(function(){return A.a}));var I=n(33);n.d(t,"JS",(function(){return I.a}));var k=n(141);n.d(t,"ClientDevice",(function(){return k.a}));var O=n(104);n.d(t,"Signer",(function(){return O.a}));var x=n(142);n.d(t,"I18n",(function(){return x.a})),n.d(t,"ServiceWorker",(function(){return i.a}));var C=n(247);n.d(t,"withSSRContext",(function(){return C.a})),r.a.Auth=o.a,r.a.Cache=s.a,r.a.ServiceWorker=i.a,t.default=r.a},,,function(e,t){var n={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==n.call(e)}},function(e,t,n){var r;e.exports=(r=n(32),function(){if("function"==typeof ArrayBuffer){var e=r.lib.WordArray,t=e.init;(e.init=function(e){if(e instanceof ArrayBuffer&&(e=new Uint8Array(e)),(e instanceof Int8Array||"undefined"!=typeof Uint8ClampedArray&&e instanceof Uint8ClampedArray||e instanceof Int16Array||e instanceof Uint16Array||e instanceof Int32Array||e instanceof Uint32Array||e instanceof Float32Array||e instanceof Float64Array)&&(e=new Uint8Array(e.buffer,e.byteOffset,e.byteLength)),e instanceof Uint8Array){for(var n=e.byteLength,r=[],i=0;i>>2]|=e[i]<<24-i%4*8;t.call(this,r,n)}else t.apply(this,arguments)}).prototype=e}}(),r.lib.WordArray)},function(e,t,n){"use strict";var r=n(8).Buffer,i=n(273).Transform;function o(e){i.call(this),this._block=r.allocUnsafe(e),this._blockSize=e,this._blockOffset=0,this._length=[0,0,0,0],this._finalized=!1}n(7)(o,i),o.prototype._transform=function(e,t,n){var r=null;try{this.update(e,t)}catch(e){r=e}n(r)},o.prototype._flush=function(e){var t=null;try{this.push(this.digest())}catch(e){t=e}e(t)},o.prototype.update=function(e,t){if(function(e,t){if(!r.isBuffer(e)&&"string"!=typeof e)throw new TypeError(t+" must be a string or a buffer")}(e,"Data"),this._finalized)throw new Error("Digest already called");r.isBuffer(e)||(e=r.from(e,t));for(var n=this._block,i=0;this._blockOffset+e.length-i>=this._blockSize;){for(var o=this._blockOffset;o0;++s)this._length[s]+=a,(a=this._length[s]/4294967296|0)>0&&(this._length[s]-=4294967296*a);return this},o.prototype._update=function(){throw new Error("_update is not implemented")},o.prototype.digest=function(e){if(this._finalized)throw new Error("Digest already called");this._finalized=!0;var t=this._digest();void 0!==e&&(t=t.toString(e)),this._block.fill(0),this._blockOffset=0;for(var n=0;n<4;++n)this._length[n]=0;return t},o.prototype._digest=function(){throw new Error("_digest is not implemented")},e.exports=o},function(e,t,n){"use strict";(function(t,r){var i;e.exports=A,A.ReadableState=M;n(49).EventEmitter;var o=function(e,t){return e.listeners(t).length},s=n(164),a=n(6).Buffer,u=t.Uint8Array||function(){};var c,f=n(274);c=f&&f.debuglog?f.debuglog("stream"):function(){};var l,d,h,p=n(275),v=n(165),g=n(166).getHighWaterMark,m=n(67).codes,b=m.ERR_INVALID_ARG_TYPE,y=m.ERR_STREAM_PUSH_AFTER_EOF,w=m.ERR_METHOD_NOT_IMPLEMENTED,_=m.ERR_STREAM_UNSHIFT_AFTER_END_EVENT;n(7)(A,s);var S=v.errorOrDestroy,E=["error","close","destroy","pause","resume"];function M(e,t,r){i=i||n(68),e=e||{},"boolean"!=typeof r&&(r=t instanceof i),this.objectMode=!!e.objectMode,r&&(this.objectMode=this.objectMode||!!e.readableObjectMode),this.highWaterMark=g(this,e,"readableHighWaterMark",r),this.buffer=new p,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=!1!==e.emitClose,this.autoDestroy=!!e.autoDestroy,this.destroyed=!1,this.defaultEncoding=e.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,e.encoding&&(l||(l=n(59).StringDecoder),this.decoder=new l(e.encoding),this.encoding=e.encoding)}function A(e){if(i=i||n(68),!(this instanceof A))return new A(e);var t=this instanceof i;this._readableState=new M(e,this,t),this.readable=!0,e&&("function"==typeof e.read&&(this._read=e.read),"function"==typeof e.destroy&&(this._destroy=e.destroy)),s.call(this)}function I(e,t,n,r,i){c("readableAddChunk",t);var o,s=e._readableState;if(null===t)s.reading=!1,function(e,t){if(c("onEofChunk"),t.ended)return;if(t.decoder){var n=t.decoder.end();n&&n.length&&(t.buffer.push(n),t.length+=t.objectMode?1:n.length)}t.ended=!0,t.sync?x(e):(t.needReadable=!1,t.emittedReadable||(t.emittedReadable=!0,C(e)))}(e,s);else if(i||(o=function(e,t){var n;r=t,a.isBuffer(r)||r instanceof u||"string"==typeof t||void 0===t||e.objectMode||(n=new b("chunk",["string","Buffer","Uint8Array"],t));var r;return n}(s,t)),o)S(e,o);else if(s.objectMode||t&&t.length>0)if("string"==typeof t||s.objectMode||Object.getPrototypeOf(t)===a.prototype||(t=function(e){return a.from(e)}(t)),r)s.endEmitted?S(e,new _):k(e,s,t,!0);else if(s.ended)S(e,new y);else{if(s.destroyed)return!1;s.reading=!1,s.decoder&&!n?(t=s.decoder.write(t),s.objectMode||0!==t.length?k(e,s,t,!1):T(e,s)):k(e,s,t,!1)}else r||(s.reading=!1,T(e,s));return!s.ended&&(s.lengtht.highWaterMark&&(t.highWaterMark=function(e){return e>=1073741824?e=1073741824:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}function x(e){var t=e._readableState;c("emitReadable",t.needReadable,t.emittedReadable),t.needReadable=!1,t.emittedReadable||(c("emitReadable",t.flowing),t.emittedReadable=!0,r.nextTick(C,e))}function C(e){var t=e._readableState;c("emitReadable_",t.destroyed,t.length,t.ended),t.destroyed||!t.length&&!t.ended||(e.emit("readable"),t.emittedReadable=!1),t.needReadable=!t.flowing&&!t.ended&&t.length<=t.highWaterMark,j(e)}function T(e,t){t.readingMore||(t.readingMore=!0,r.nextTick(P,e,t))}function P(e,t){for(;!t.reading&&!t.ended&&(t.length0,t.resumeScheduled&&!t.paused?t.flowing=!0:e.listenerCount("data")>0&&e.resume()}function R(e){c("readable nexttick read 0"),e.read(0)}function L(e,t){c("resume",t.reading),t.reading||e.read(0),t.resumeScheduled=!1,e.emit("resume"),j(e),t.flowing&&!t.reading&&e.read(0)}function j(e){var t=e._readableState;for(c("flow",t.flowing);t.flowing&&null!==e.read(););}function D(e,t){return 0===t.length?null:(t.objectMode?n=t.buffer.shift():!e||e>=t.length?(n=t.decoder?t.buffer.join(""):1===t.buffer.length?t.buffer.first():t.buffer.concat(t.length),t.buffer.clear()):n=t.buffer.consume(e,t.decoder),n);var n}function U(e){var t=e._readableState;c("endReadable",t.endEmitted),t.endEmitted||(t.ended=!0,r.nextTick(B,t,e))}function B(e,t){if(c("endReadableNT",e.endEmitted,e.length),!e.endEmitted&&0===e.length&&(e.endEmitted=!0,t.readable=!1,t.emit("end"),e.autoDestroy)){var n=t._writableState;(!n||n.autoDestroy&&n.finished)&&t.destroy()}}function F(e,t){for(var n=0,r=e.length;n=t.highWaterMark:t.length>0)||t.ended))return c("read: emitReadable",t.length,t.ended),0===t.length&&t.ended?U(this):x(this),null;if(0===(e=O(e,t))&&t.ended)return 0===t.length&&U(this),null;var r,i=t.needReadable;return c("need readable",i),(0===t.length||t.length-e0?D(e,t):null)?(t.needReadable=t.length<=t.highWaterMark,e=0):(t.length-=e,t.awaitDrain=0),0===t.length&&(t.ended||(t.needReadable=!0),n!==e&&t.ended&&U(this)),null!==r&&this.emit("data",r),r},A.prototype._read=function(e){S(this,new w("_read()"))},A.prototype.pipe=function(e,t){var n=this,i=this._readableState;switch(i.pipesCount){case 0:i.pipes=e;break;case 1:i.pipes=[i.pipes,e];break;default:i.pipes.push(e)}i.pipesCount+=1,c("pipe count=%d opts=%j",i.pipesCount,t);var s=(!t||!1!==t.end)&&e!==r.stdout&&e!==r.stderr?u:g;function a(t,r){c("onunpipe"),t===n&&r&&!1===r.hasUnpiped&&(r.hasUnpiped=!0,c("cleanup"),e.removeListener("close",p),e.removeListener("finish",v),e.removeListener("drain",f),e.removeListener("error",h),e.removeListener("unpipe",a),n.removeListener("end",u),n.removeListener("end",g),n.removeListener("data",d),l=!0,!i.awaitDrain||e._writableState&&!e._writableState.needDrain||f())}function u(){c("onend"),e.end()}i.endEmitted?r.nextTick(s):n.once("end",s),e.on("unpipe",a);var f=function(e){return function(){var t=e._readableState;c("pipeOnDrain",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,0===t.awaitDrain&&o(e,"data")&&(t.flowing=!0,j(e))}}(n);e.on("drain",f);var l=!1;function d(t){c("ondata");var r=e.write(t);c("dest.write",r),!1===r&&((1===i.pipesCount&&i.pipes===e||i.pipesCount>1&&-1!==F(i.pipes,e))&&!l&&(c("false write response, pause",i.awaitDrain),i.awaitDrain++),n.pause())}function h(t){c("onerror",t),g(),e.removeListener("error",h),0===o(e,"error")&&S(e,t)}function p(){e.removeListener("finish",v),g()}function v(){c("onfinish"),e.removeListener("close",p),g()}function g(){c("unpipe"),n.unpipe(e)}return n.on("data",d),function(e,t,n){if("function"==typeof e.prependListener)return e.prependListener(t,n);e._events&&e._events[t]?Array.isArray(e._events[t])?e._events[t].unshift(n):e._events[t]=[n,e._events[t]]:e.on(t,n)}(e,"error",h),e.once("close",p),e.once("finish",v),e.emit("pipe",n),i.flowing||(c("pipe resume"),n.resume()),e},A.prototype.unpipe=function(e){var t=this._readableState,n={hasUnpiped:!1};if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes||(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this,n)),this;if(!e){var r=t.pipes,i=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var o=0;o0,!1!==i.flowing&&this.resume()):"readable"===e&&(i.endEmitted||i.readableListening||(i.readableListening=i.needReadable=!0,i.flowing=!1,i.emittedReadable=!1,c("on readable",i.length,i.reading),i.length?x(this):i.reading||r.nextTick(R,this))),n},A.prototype.addListener=A.prototype.on,A.prototype.removeListener=function(e,t){var n=s.prototype.removeListener.call(this,e,t);return"readable"===e&&r.nextTick(N,this),n},A.prototype.removeAllListeners=function(e){var t=s.prototype.removeAllListeners.apply(this,arguments);return"readable"!==e&&void 0!==e||r.nextTick(N,this),t},A.prototype.resume=function(){var e=this._readableState;return e.flowing||(c("resume"),e.flowing=!e.readableListening,function(e,t){t.resumeScheduled||(t.resumeScheduled=!0,r.nextTick(L,e,t))}(this,e)),e.paused=!1,this},A.prototype.pause=function(){return c("call pause flowing=%j",this._readableState.flowing),!1!==this._readableState.flowing&&(c("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this},A.prototype.wrap=function(e){var t=this,n=this._readableState,r=!1;for(var i in e.on("end",(function(){if(c("wrapped end"),n.decoder&&!n.ended){var e=n.decoder.end();e&&e.length&&t.push(e)}t.push(null)})),e.on("data",(function(i){(c("wrapped data"),n.decoder&&(i=n.decoder.write(i)),n.objectMode&&null==i)||(n.objectMode||i&&i.length)&&(t.push(i)||(r=!0,e.pause()))})),e)void 0===this[i]&&"function"==typeof e[i]&&(this[i]=function(t){return function(){return e[t].apply(e,arguments)}}(i));for(var o=0;o-1))throw new _(e);return this._writableState.defaultEncoding=e,this},Object.defineProperty(A.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}}),Object.defineProperty(A.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),A.prototype._write=function(e,t,n){n(new v("_write()"))},A.prototype._writev=null,A.prototype.end=function(e,t,n){var i=this._writableState;return"function"==typeof e?(n=e,e=null,t=null):"function"==typeof t&&(n=t,t=null),null!=e&&this.write(e,t),i.corked&&(i.corked=1,this.uncork()),i.ending||function(e,t,n){t.ending=!0,T(e,t),n&&(t.finished?r.nextTick(n):e.once("finish",n));t.ended=!0,e.writable=!1}(this,i,n),this},Object.defineProperty(A.prototype,"writableLength",{enumerable:!1,get:function(){return this._writableState.length}}),Object.defineProperty(A.prototype,"destroyed",{enumerable:!1,get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}}),A.prototype.destroy=l.destroy,A.prototype._undestroy=l.undestroy,A.prototype._destroy=function(e,t){t(e)}}).call(this,n(31),n(20))},function(e,t,n){"use strict";e.exports=f;var r=n(67).codes,i=r.ERR_METHOD_NOT_IMPLEMENTED,o=r.ERR_MULTIPLE_CALLBACK,s=r.ERR_TRANSFORM_ALREADY_TRANSFORMING,a=r.ERR_TRANSFORM_WITH_LENGTH_0,u=n(68);function c(e,t){var n=this._transformState;n.transforming=!1;var r=n.writecb;if(null===r)return this.emit("error",new o);n.writechunk=null,n.writecb=null,null!=t&&this.push(t),r(e);var i=this._readableState;i.reading=!1,(i.needReadable||i.length>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10)}function d(e){return(e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7)}function h(e){return(e>>>7|e<<25)^(e>>>18|e<<14)^e>>>3}r(u,i),u.prototype.init=function(){return this._a=1779033703,this._b=3144134277,this._c=1013904242,this._d=2773480762,this._e=1359893119,this._f=2600822924,this._g=528734635,this._h=1541459225,this},u.prototype._update=function(e){for(var t,n=this._w,r=0|this._a,i=0|this._b,o=0|this._c,a=0|this._d,u=0|this._e,p=0|this._f,v=0|this._g,g=0|this._h,m=0;m<16;++m)n[m]=e.readInt32BE(4*m);for(;m<64;++m)n[m]=0|(((t=n[m-2])>>>17|t<<15)^(t>>>19|t<<13)^t>>>10)+n[m-7]+h(n[m-15])+n[m-16];for(var b=0;b<64;++b){var y=g+d(u)+c(u,p,v)+s[b]+n[b]|0,w=l(r)+f(r,i,o)|0;g=v,v=p,p=u,u=a+y|0,a=o,o=i,i=r,r=y+w|0}this._a=r+this._a|0,this._b=i+this._b|0,this._c=o+this._c|0,this._d=a+this._d|0,this._e=u+this._e|0,this._f=p+this._f|0,this._g=v+this._g|0,this._h=g+this._h|0},u.prototype._hash=function(){var e=o.allocUnsafe(32);return e.writeInt32BE(this._a,0),e.writeInt32BE(this._b,4),e.writeInt32BE(this._c,8),e.writeInt32BE(this._d,12),e.writeInt32BE(this._e,16),e.writeInt32BE(this._f,20),e.writeInt32BE(this._g,24),e.writeInt32BE(this._h,28),e},e.exports=u},function(e,t,n){var r=n(7),i=n(69),o=n(8).Buffer,s=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],a=new Array(160);function u(){this.init(),this._w=a,i.call(this,128,112)}function c(e,t,n){return n^e&(t^n)}function f(e,t,n){return e&t|n&(e|t)}function l(e,t){return(e>>>28|t<<4)^(t>>>2|e<<30)^(t>>>7|e<<25)}function d(e,t){return(e>>>14|t<<18)^(e>>>18|t<<14)^(t>>>9|e<<23)}function h(e,t){return(e>>>1|t<<31)^(e>>>8|t<<24)^e>>>7}function p(e,t){return(e>>>1|t<<31)^(e>>>8|t<<24)^(e>>>7|t<<25)}function v(e,t){return(e>>>19|t<<13)^(t>>>29|e<<3)^e>>>6}function g(e,t){return(e>>>19|t<<13)^(t>>>29|e<<3)^(e>>>6|t<<26)}function m(e,t){return e>>>0>>0?1:0}r(u,i),u.prototype.init=function(){return this._ah=1779033703,this._bh=3144134277,this._ch=1013904242,this._dh=2773480762,this._eh=1359893119,this._fh=2600822924,this._gh=528734635,this._hh=1541459225,this._al=4089235720,this._bl=2227873595,this._cl=4271175723,this._dl=1595750129,this._el=2917565137,this._fl=725511199,this._gl=4215389547,this._hl=327033209,this},u.prototype._update=function(e){for(var t=this._w,n=0|this._ah,r=0|this._bh,i=0|this._ch,o=0|this._dh,a=0|this._eh,u=0|this._fh,b=0|this._gh,y=0|this._hh,w=0|this._al,_=0|this._bl,S=0|this._cl,E=0|this._dl,M=0|this._el,A=0|this._fl,I=0|this._gl,k=0|this._hl,O=0;O<32;O+=2)t[O]=e.readInt32BE(4*O),t[O+1]=e.readInt32BE(4*O+4);for(;O<160;O+=2){var x=t[O-30],C=t[O-30+1],T=h(x,C),P=p(C,x),N=v(x=t[O-4],C=t[O-4+1]),R=g(C,x),L=t[O-14],j=t[O-14+1],D=t[O-32],U=t[O-32+1],B=P+j|0,F=T+L+m(B,P)|0;F=(F=F+N+m(B=B+R|0,R)|0)+D+m(B=B+U|0,U)|0,t[O]=F,t[O+1]=B}for(var z=0;z<160;z+=2){F=t[z],B=t[z+1];var q=f(n,r,i),K=f(w,_,S),H=l(n,w),V=l(w,n),G=d(a,M),W=d(M,a),$=s[z],Y=s[z+1],J=c(a,u,b),Z=c(M,A,I),X=k+W|0,Q=y+G+m(X,k)|0;Q=(Q=(Q=Q+J+m(X=X+Z|0,Z)|0)+$+m(X=X+Y|0,Y)|0)+F+m(X=X+B|0,B)|0;var ee=V+K|0,te=H+q+m(ee,V)|0;y=b,k=I,b=u,I=A,u=a,A=M,a=o+Q+m(M=E+X|0,E)|0,o=i,E=S,i=r,S=_,r=n,_=w,n=Q+te+m(w=X+ee|0,X)|0}this._al=this._al+w|0,this._bl=this._bl+_|0,this._cl=this._cl+S|0,this._dl=this._dl+E|0,this._el=this._el+M|0,this._fl=this._fl+A|0,this._gl=this._gl+I|0,this._hl=this._hl+k|0,this._ah=this._ah+n+m(this._al,w)|0,this._bh=this._bh+r+m(this._bl,_)|0,this._ch=this._ch+i+m(this._cl,S)|0,this._dh=this._dh+o+m(this._dl,E)|0,this._eh=this._eh+a+m(this._el,M)|0,this._fh=this._fh+u+m(this._fl,A)|0,this._gh=this._gh+b+m(this._gl,I)|0,this._hh=this._hh+y+m(this._hl,k)|0},u.prototype._hash=function(){var e=o.allocUnsafe(64);function t(t,n,r){e.writeInt32BE(t,r),e.writeInt32BE(n,r+4)}return t(this._ah,this._al,0),t(this._bh,this._bl,8),t(this._ch,this._cl,16),t(this._dh,this._dl,24),t(this._eh,this._el,32),t(this._fh,this._fl,40),t(this._gh,this._gl,48),t(this._hh,this._hl,56),e},e.exports=u},function(e,t,n){"use strict";(function(t,r){var i=n(92);e.exports=y;var o,s=n(160);y.ReadableState=b;n(49).EventEmitter;var a=function(e,t){return e.listeners(t).length},u=n(172),c=n(119).Buffer,f=t.Uint8Array||function(){};var l=Object.create(n(80));l.inherits=n(7);var d=n(286),h=void 0;h=d&&d.debuglog?d.debuglog("stream"):function(){};var p,v=n(287),g=n(173);l.inherits(y,u);var m=["error","close","destroy","pause","resume"];function b(e,t){e=e||{};var r=t instanceof(o=o||n(60));this.objectMode=!!e.objectMode,r&&(this.objectMode=this.objectMode||!!e.readableObjectMode);var i=e.highWaterMark,s=e.readableHighWaterMark,a=this.objectMode?16:16384;this.highWaterMark=i||0===i?i:r&&(s||0===s)?s:a,this.highWaterMark=Math.floor(this.highWaterMark),this.buffer=new v,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.destroyed=!1,this.defaultEncoding=e.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,e.encoding&&(p||(p=n(59).StringDecoder),this.decoder=new p(e.encoding),this.encoding=e.encoding)}function y(e){if(o=o||n(60),!(this instanceof y))return new y(e);this._readableState=new b(e,this),this.readable=!0,e&&("function"==typeof e.read&&(this._read=e.read),"function"==typeof e.destroy&&(this._destroy=e.destroy)),u.call(this)}function w(e,t,n,r,i){var o,s=e._readableState;null===t?(s.reading=!1,function(e,t){if(t.ended)return;if(t.decoder){var n=t.decoder.end();n&&n.length&&(t.buffer.push(n),t.length+=t.objectMode?1:n.length)}t.ended=!0,E(e)}(e,s)):(i||(o=function(e,t){var n;r=t,c.isBuffer(r)||r instanceof f||"string"==typeof t||void 0===t||e.objectMode||(n=new TypeError("Invalid non-string/buffer chunk"));var r;return n}(s,t)),o?e.emit("error",o):s.objectMode||t&&t.length>0?("string"==typeof t||s.objectMode||Object.getPrototypeOf(t)===c.prototype||(t=function(e){return c.from(e)}(t)),r?s.endEmitted?e.emit("error",new Error("stream.unshift() after end event")):_(e,s,t,!0):s.ended?e.emit("error",new Error("stream.push() after EOF")):(s.reading=!1,s.decoder&&!n?(t=s.decoder.write(t),s.objectMode||0!==t.length?_(e,s,t,!1):A(e,s)):_(e,s,t,!1))):r||(s.reading=!1));return function(e){return!e.ended&&(e.needReadable||e.lengtht.highWaterMark&&(t.highWaterMark=function(e){return e>=8388608?e=8388608:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}function E(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(h("emitReadable",t.flowing),t.emittedReadable=!0,t.sync?i.nextTick(M,e):M(e))}function M(e){h("emit readable"),e.emit("readable"),x(e)}function A(e,t){t.readingMore||(t.readingMore=!0,i.nextTick(I,e,t))}function I(e,t){for(var n=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length=t.length?(n=t.decoder?t.buffer.join(""):1===t.buffer.length?t.buffer.head.data:t.buffer.concat(t.length),t.buffer.clear()):n=function(e,t,n){var r;eo.length?o.length:e;if(s===o.length?i+=o:i+=o.slice(0,e),0===(e-=s)){s===o.length?(++r,n.next?t.head=n.next:t.head=t.tail=null):(t.head=n,n.data=o.slice(s));break}++r}return t.length-=r,i}(e,t):function(e,t){var n=c.allocUnsafe(e),r=t.head,i=1;r.data.copy(n),e-=r.data.length;for(;r=r.next;){var o=r.data,s=e>o.length?o.length:e;if(o.copy(n,n.length-e,0,s),0===(e-=s)){s===o.length?(++i,r.next?t.head=r.next:t.head=t.tail=null):(t.head=r,r.data=o.slice(s));break}++i}return t.length-=i,n}(e,t);return r}(e,t.buffer,t.decoder),n);var n}function T(e){var t=e._readableState;if(t.length>0)throw new Error('"endReadable()" called on non-empty stream');t.endEmitted||(t.ended=!0,i.nextTick(P,t,e))}function P(e,t){e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit("end"))}function N(e,t){for(var n=0,r=e.length;n=t.highWaterMark||t.ended))return h("read: emitReadable",t.length,t.ended),0===t.length&&t.ended?T(this):E(this),null;if(0===(e=S(e,t))&&t.ended)return 0===t.length&&T(this),null;var r,i=t.needReadable;return h("need readable",i),(0===t.length||t.length-e0?C(e,t):null)?(t.needReadable=!0,e=0):t.length-=e,0===t.length&&(t.ended||(t.needReadable=!0),n!==e&&t.ended&&T(this)),null!==r&&this.emit("data",r),r},y.prototype._read=function(e){this.emit("error",new Error("_read() is not implemented"))},y.prototype.pipe=function(e,t){var n=this,o=this._readableState;switch(o.pipesCount){case 0:o.pipes=e;break;case 1:o.pipes=[o.pipes,e];break;default:o.pipes.push(e)}o.pipesCount+=1,h("pipe count=%d opts=%j",o.pipesCount,t);var u=(!t||!1!==t.end)&&e!==r.stdout&&e!==r.stderr?f:y;function c(t,r){h("onunpipe"),t===n&&r&&!1===r.hasUnpiped&&(r.hasUnpiped=!0,h("cleanup"),e.removeListener("close",m),e.removeListener("finish",b),e.removeListener("drain",l),e.removeListener("error",g),e.removeListener("unpipe",c),n.removeListener("end",f),n.removeListener("end",y),n.removeListener("data",v),d=!0,!o.awaitDrain||e._writableState&&!e._writableState.needDrain||l())}function f(){h("onend"),e.end()}o.endEmitted?i.nextTick(u):n.once("end",u),e.on("unpipe",c);var l=function(e){return function(){var t=e._readableState;h("pipeOnDrain",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,0===t.awaitDrain&&a(e,"data")&&(t.flowing=!0,x(e))}}(n);e.on("drain",l);var d=!1;var p=!1;function v(t){h("ondata"),p=!1,!1!==e.write(t)||p||((1===o.pipesCount&&o.pipes===e||o.pipesCount>1&&-1!==N(o.pipes,e))&&!d&&(h("false write response, pause",n._readableState.awaitDrain),n._readableState.awaitDrain++,p=!0),n.pause())}function g(t){h("onerror",t),y(),e.removeListener("error",g),0===a(e,"error")&&e.emit("error",t)}function m(){e.removeListener("finish",b),y()}function b(){h("onfinish"),e.removeListener("close",m),y()}function y(){h("unpipe"),n.unpipe(e)}return n.on("data",v),function(e,t,n){if("function"==typeof e.prependListener)return e.prependListener(t,n);e._events&&e._events[t]?s(e._events[t])?e._events[t].unshift(n):e._events[t]=[n,e._events[t]]:e.on(t,n)}(e,"error",g),e.once("close",m),e.once("finish",b),e.emit("pipe",n),o.flowing||(h("pipe resume"),n.resume()),e},y.prototype.unpipe=function(e){var t=this._readableState,n={hasUnpiped:!1};if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes||(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this,n)),this;if(!e){var r=t.pipes,i=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var o=0;on)?t=("rmd160"===e?new u:c(e)).update(t).digest():t.lengthn||t!=t)throw new TypeError("Bad key length")}},function(e,t,n){(function(t){var n;if(t.browser)n="utf-8";else if(t.version){n=parseInt(t.version.split(".")[0].slice(1),10)>=6?"utf-8":"binary"}else n="utf-8";e.exports=n}).call(this,n(20))},function(e,t,n){var r=n(176),i=n(116),o=n(117),s=n(8).Buffer,a=n(179),u=n(180),c=n(182),f=s.alloc(128),l={md5:16,sha1:20,sha224:28,sha256:32,sha384:48,sha512:64,rmd160:20,ripemd160:20};function d(e,t,n){var a=function(e){function t(t){return o(e).update(t).digest()}return"rmd160"===e||"ripemd160"===e?function(e){return(new i).update(e).digest()}:"md5"===e?r:t}(e),u="sha512"===e||"sha384"===e?128:64;t.length>u?t=a(t):t.length>>0},t.writeUInt32BE=function(e,t,n){e[0+n]=t>>>24,e[1+n]=t>>>16&255,e[2+n]=t>>>8&255,e[3+n]=255&t},t.ip=function(e,t,n,r){for(var i=0,o=0,s=6;s>=0;s-=2){for(var a=0;a<=24;a+=8)i<<=1,i|=t>>>a+s&1;for(a=0;a<=24;a+=8)i<<=1,i|=e>>>a+s&1}for(s=6;s>=0;s-=2){for(a=1;a<=25;a+=8)o<<=1,o|=t>>>a+s&1;for(a=1;a<=25;a+=8)o<<=1,o|=e>>>a+s&1}n[r+0]=i>>>0,n[r+1]=o>>>0},t.rip=function(e,t,n,r){for(var i=0,o=0,s=0;s<4;s++)for(var a=24;a>=0;a-=8)i<<=1,i|=t>>>a+s&1,i<<=1,i|=e>>>a+s&1;for(s=4;s<8;s++)for(a=24;a>=0;a-=8)o<<=1,o|=t>>>a+s&1,o<<=1,o|=e>>>a+s&1;n[r+0]=i>>>0,n[r+1]=o>>>0},t.pc1=function(e,t,n,r){for(var i=0,o=0,s=7;s>=5;s--){for(var a=0;a<=24;a+=8)i<<=1,i|=t>>a+s&1;for(a=0;a<=24;a+=8)i<<=1,i|=e>>a+s&1}for(a=0;a<=24;a+=8)i<<=1,i|=t>>a+s&1;for(s=1;s<=3;s++){for(a=0;a<=24;a+=8)o<<=1,o|=t>>a+s&1;for(a=0;a<=24;a+=8)o<<=1,o|=e>>a+s&1}for(a=0;a<=24;a+=8)o<<=1,o|=e>>a+s&1;n[r+0]=i>>>0,n[r+1]=o>>>0},t.r28shl=function(e,t){return e<>>28-t};var r=[14,11,17,4,27,23,25,0,13,22,7,18,5,9,16,24,2,20,12,21,1,8,15,26,15,4,25,19,9,1,26,16,5,11,23,8,12,7,17,0,22,3,10,14,6,20,27,24];t.pc2=function(e,t,n,i){for(var o=0,s=0,a=r.length>>>1,u=0;u>>r[u]&1;for(u=a;u>>r[u]&1;n[i+0]=o>>>0,n[i+1]=s>>>0},t.expand=function(e,t,n){var r=0,i=0;r=(1&e)<<5|e>>>27;for(var o=23;o>=15;o-=4)r<<=6,r|=e>>>o&63;for(o=11;o>=3;o-=4)i|=e>>>o&63,i<<=6;i|=(31&e)<<1|e>>>31,t[n+0]=r>>>0,t[n+1]=i>>>0};var i=[14,0,4,15,13,7,1,4,2,14,15,2,11,13,8,1,3,10,10,6,6,12,12,11,5,9,9,5,0,3,7,8,4,15,1,12,14,8,8,2,13,4,6,9,2,1,11,7,15,5,12,11,9,3,7,14,3,10,10,0,5,6,0,13,15,3,1,13,8,4,14,7,6,15,11,2,3,8,4,14,9,12,7,0,2,1,13,10,12,6,0,9,5,11,10,5,0,13,14,8,7,10,11,1,10,3,4,15,13,4,1,2,5,11,8,6,12,7,6,12,9,0,3,5,2,14,15,9,10,13,0,7,9,0,14,9,6,3,3,4,15,6,5,10,1,2,13,8,12,5,7,14,11,12,4,11,2,15,8,1,13,1,6,10,4,13,9,0,8,6,15,9,3,8,0,7,11,4,1,15,2,14,12,3,5,11,10,5,14,2,7,12,7,13,13,8,14,11,3,5,0,6,6,15,9,0,10,3,1,4,2,7,8,2,5,12,11,1,12,10,4,14,15,9,10,3,6,15,9,0,0,6,12,10,11,1,7,13,13,8,15,9,1,4,3,5,14,11,5,12,2,7,8,2,4,14,2,14,12,11,4,2,1,12,7,4,10,7,11,13,6,1,8,5,5,0,3,15,15,10,13,3,0,9,14,8,9,6,4,11,2,8,1,12,11,7,10,1,13,14,7,2,8,13,15,6,9,15,12,0,5,9,6,10,3,4,0,5,14,3,12,10,1,15,10,4,15,2,9,7,2,12,6,9,8,5,0,6,13,1,3,13,4,14,14,0,7,11,5,3,11,8,9,4,14,3,15,2,5,12,2,9,8,5,12,15,3,10,7,11,0,14,4,1,10,7,1,6,13,0,11,8,6,13,4,13,11,0,2,11,14,7,15,4,0,9,8,1,13,10,3,14,12,3,9,5,7,12,5,2,10,15,6,8,1,6,1,6,4,11,11,13,13,8,12,1,3,4,7,10,14,7,10,9,15,5,6,0,8,15,0,14,5,2,9,3,2,12,13,1,2,15,8,13,4,8,6,10,15,3,11,7,1,4,10,12,9,5,3,6,14,11,5,0,0,14,12,9,7,2,7,2,11,1,4,14,1,7,9,4,12,10,14,8,2,13,0,15,6,12,10,9,13,0,15,3,3,5,5,6,8,11];t.substitute=function(e,t){for(var n=0,r=0;r<4;r++){n<<=4,n|=i[64*r+(e>>>18-6*r&63)]}for(r=0;r<4;r++){n<<=4,n|=i[256+64*r+(t>>>18-6*r&63)]}return n>>>0};var o=[16,25,12,11,3,20,4,15,31,17,9,6,27,14,1,22,30,24,8,18,0,5,29,23,13,19,2,26,10,21,28,7];t.permute=function(e){for(var t=0,n=0;n>>o[n]&1;return t>>>0},t.padSplit=function(e,t,n){for(var r=e.toString(2);r.length>>1];n=o.r28shl(n,a),i=o.r28shl(i,a),o.pc2(n,i,e.keys,s)}},u.prototype._update=function(e,t,n,r){var i=this._desState,s=o.readUInt32BE(e,t),a=o.readUInt32BE(e,t+4);o.ip(s,a,i.tmp,0),s=i.tmp[0],a=i.tmp[1],"encrypt"===this.type?this._encrypt(i,s,a,i.tmp,0):this._decrypt(i,s,a,i.tmp,0),s=i.tmp[0],a=i.tmp[1],o.writeUInt32BE(n,s,r),o.writeUInt32BE(n,a,r+4)},u.prototype._pad=function(e,t){for(var n=e.length-t,r=t;r>>0,s=d}o.rip(a,s,r,i)},u.prototype._decrypt=function(e,t,n,r,i){for(var s=n,a=t,u=e.keys.length-2;u>=0;u-=2){var c=e.keys[u],f=e.keys[u+1];o.expand(s,e.tmp,0),c^=e.tmp[0],f^=e.tmp[1];var l=o.substitute(c,f),d=s;s=(a^o.permute(l))>>>0,a=d}o.rip(s,a,r,i)}},function(e,t,n){var r=n(81),i=n(8).Buffer,o=n(186);function s(e){var t=e._cipher.encryptBlockRaw(e._prev);return o(e._prev),t}t.encrypt=function(e,t){var n=Math.ceil(t.length/16),o=e._cache.length;e._cache=i.concat([e._cache,i.allocUnsafe(16*n)]);for(var a=0;ae;)n.ishrn(1);if(n.isEven()&&n.iadd(a),n.testn(1)||n.iadd(u),t.cmp(u)){if(!t.cmp(c))for(;n.mod(f).cmp(l);)n.iadd(h)}else for(;n.mod(o).cmp(d);)n.iadd(h);if(g(p=n.shrn(1))&&g(n)&&m(p)&&m(n)&&s.test(p)&&s.test(n))return n}}},function(e,t,n){var r=n(29),i=n(124);function o(e){this.rand=e||new i.Rand}e.exports=o,o.create=function(e){return new o(e)},o.prototype._randbelow=function(e){var t=e.bitLength(),n=Math.ceil(t/8);do{var i=new r(this.rand.generate(n))}while(i.cmp(e)>=0);return i},o.prototype._randrange=function(e,t){var n=t.sub(e);return e.add(this._randbelow(n))},o.prototype.test=function(e,t,n){var i=e.bitLength(),o=r.mont(e),s=new r(1).toRed(o);t||(t=Math.max(1,i/48|0));for(var a=e.subn(1),u=0;!a.testn(u);u++);for(var c=e.shrn(u),f=a.toRed(o);t>0;t--){var l=this._randrange(new r(2),a);n&&n(l);var d=l.toRed(o).redPow(c);if(0!==d.cmp(s)&&0!==d.cmp(f)){for(var h=1;h0;t--){var f=this._randrange(new r(2),s),l=e.gcd(f);if(0!==l.cmpn(1))return l;var d=f.toRed(i).redPow(u);if(0!==d.cmp(o)&&0!==d.cmp(c)){for(var h=1;h0)if("string"==typeof t||s.objectMode||Object.getPrototypeOf(t)===a.prototype||(t=function(e){return a.from(e)}(t)),r)s.endEmitted?S(e,new _):k(e,s,t,!0);else if(s.ended)S(e,new y);else{if(s.destroyed)return!1;s.reading=!1,s.decoder&&!n?(t=s.decoder.write(t),s.objectMode||0!==t.length?k(e,s,t,!1):T(e,s)):k(e,s,t,!1)}else r||(s.reading=!1,T(e,s));return!s.ended&&(s.lengtht.highWaterMark&&(t.highWaterMark=function(e){return e>=1073741824?e=1073741824:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}function x(e){var t=e._readableState;c("emitReadable",t.needReadable,t.emittedReadable),t.needReadable=!1,t.emittedReadable||(c("emitReadable",t.flowing),t.emittedReadable=!0,r.nextTick(C,e))}function C(e){var t=e._readableState;c("emitReadable_",t.destroyed,t.length,t.ended),t.destroyed||!t.length&&!t.ended||(e.emit("readable"),t.emittedReadable=!1),t.needReadable=!t.flowing&&!t.ended&&t.length<=t.highWaterMark,j(e)}function T(e,t){t.readingMore||(t.readingMore=!0,r.nextTick(P,e,t))}function P(e,t){for(;!t.reading&&!t.ended&&(t.length0,t.resumeScheduled&&!t.paused?t.flowing=!0:e.listenerCount("data")>0&&e.resume()}function R(e){c("readable nexttick read 0"),e.read(0)}function L(e,t){c("resume",t.reading),t.reading||e.read(0),t.resumeScheduled=!1,e.emit("resume"),j(e),t.flowing&&!t.reading&&e.read(0)}function j(e){var t=e._readableState;for(c("flow",t.flowing);t.flowing&&null!==e.read(););}function D(e,t){return 0===t.length?null:(t.objectMode?n=t.buffer.shift():!e||e>=t.length?(n=t.decoder?t.buffer.join(""):1===t.buffer.length?t.buffer.first():t.buffer.concat(t.length),t.buffer.clear()):n=t.buffer.consume(e,t.decoder),n);var n}function U(e){var t=e._readableState;c("endReadable",t.endEmitted),t.endEmitted||(t.ended=!0,r.nextTick(B,t,e))}function B(e,t){if(c("endReadableNT",e.endEmitted,e.length),!e.endEmitted&&0===e.length&&(e.endEmitted=!0,t.readable=!1,t.emit("end"),e.autoDestroy)){var n=t._writableState;(!n||n.autoDestroy&&n.finished)&&t.destroy()}}function F(e,t){for(var n=0,r=e.length;n=t.highWaterMark:t.length>0)||t.ended))return c("read: emitReadable",t.length,t.ended),0===t.length&&t.ended?U(this):x(this),null;if(0===(e=O(e,t))&&t.ended)return 0===t.length&&U(this),null;var r,i=t.needReadable;return c("need readable",i),(0===t.length||t.length-e0?D(e,t):null)?(t.needReadable=t.length<=t.highWaterMark,e=0):(t.length-=e,t.awaitDrain=0),0===t.length&&(t.ended||(t.needReadable=!0),n!==e&&t.ended&&U(this)),null!==r&&this.emit("data",r),r},A.prototype._read=function(e){S(this,new w("_read()"))},A.prototype.pipe=function(e,t){var n=this,i=this._readableState;switch(i.pipesCount){case 0:i.pipes=e;break;case 1:i.pipes=[i.pipes,e];break;default:i.pipes.push(e)}i.pipesCount+=1,c("pipe count=%d opts=%j",i.pipesCount,t);var s=(!t||!1!==t.end)&&e!==r.stdout&&e!==r.stderr?u:g;function a(t,r){c("onunpipe"),t===n&&r&&!1===r.hasUnpiped&&(r.hasUnpiped=!0,c("cleanup"),e.removeListener("close",p),e.removeListener("finish",v),e.removeListener("drain",f),e.removeListener("error",h),e.removeListener("unpipe",a),n.removeListener("end",u),n.removeListener("end",g),n.removeListener("data",d),l=!0,!i.awaitDrain||e._writableState&&!e._writableState.needDrain||f())}function u(){c("onend"),e.end()}i.endEmitted?r.nextTick(s):n.once("end",s),e.on("unpipe",a);var f=function(e){return function(){var t=e._readableState;c("pipeOnDrain",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,0===t.awaitDrain&&o(e,"data")&&(t.flowing=!0,j(e))}}(n);e.on("drain",f);var l=!1;function d(t){c("ondata");var r=e.write(t);c("dest.write",r),!1===r&&((1===i.pipesCount&&i.pipes===e||i.pipesCount>1&&-1!==F(i.pipes,e))&&!l&&(c("false write response, pause",i.awaitDrain),i.awaitDrain++),n.pause())}function h(t){c("onerror",t),g(),e.removeListener("error",h),0===o(e,"error")&&S(e,t)}function p(){e.removeListener("finish",v),g()}function v(){c("onfinish"),e.removeListener("close",p),g()}function g(){c("unpipe"),n.unpipe(e)}return n.on("data",d),function(e,t,n){if("function"==typeof e.prependListener)return e.prependListener(t,n);e._events&&e._events[t]?Array.isArray(e._events[t])?e._events[t].unshift(n):e._events[t]=[n,e._events[t]]:e.on(t,n)}(e,"error",h),e.once("close",p),e.once("finish",v),e.emit("pipe",n),i.flowing||(c("pipe resume"),n.resume()),e},A.prototype.unpipe=function(e){var t=this._readableState,n={hasUnpiped:!1};if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes||(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this,n)),this;if(!e){var r=t.pipes,i=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var o=0;o0,!1!==i.flowing&&this.resume()):"readable"===e&&(i.endEmitted||i.readableListening||(i.readableListening=i.needReadable=!0,i.flowing=!1,i.emittedReadable=!1,c("on readable",i.length,i.reading),i.length?x(this):i.reading||r.nextTick(R,this))),n},A.prototype.addListener=A.prototype.on,A.prototype.removeListener=function(e,t){var n=s.prototype.removeListener.call(this,e,t);return"readable"===e&&r.nextTick(N,this),n},A.prototype.removeAllListeners=function(e){var t=s.prototype.removeAllListeners.apply(this,arguments);return"readable"!==e&&void 0!==e||r.nextTick(N,this),t},A.prototype.resume=function(){var e=this._readableState;return e.flowing||(c("resume"),e.flowing=!e.readableListening,function(e,t){t.resumeScheduled||(t.resumeScheduled=!0,r.nextTick(L,e,t))}(this,e)),e.paused=!1,this},A.prototype.pause=function(){return c("call pause flowing=%j",this._readableState.flowing),!1!==this._readableState.flowing&&(c("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this},A.prototype.wrap=function(e){var t=this,n=this._readableState,r=!1;for(var i in e.on("end",(function(){if(c("wrapped end"),n.decoder&&!n.ended){var e=n.decoder.end();e&&e.length&&t.push(e)}t.push(null)})),e.on("data",(function(i){(c("wrapped data"),n.decoder&&(i=n.decoder.write(i)),n.objectMode&&null==i)||(n.objectMode||i&&i.length)&&(t.push(i)||(r=!0,e.pause()))})),e)void 0===this[i]&&"function"==typeof e[i]&&(this[i]=function(t){return function(){return e[t].apply(e,arguments)}}(i));for(var o=0;o-1))throw new _(e);return this._writableState.defaultEncoding=e,this},Object.defineProperty(A.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}}),Object.defineProperty(A.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),A.prototype._write=function(e,t,n){n(new v("_write()"))},A.prototype._writev=null,A.prototype.end=function(e,t,n){var i=this._writableState;return"function"==typeof e?(n=e,e=null,t=null):"function"==typeof t&&(n=t,t=null),null!=e&&this.write(e,t),i.corked&&(i.corked=1,this.uncork()),i.ending||function(e,t,n){t.ending=!0,T(e,t),n&&(t.finished?r.nextTick(n):e.once("finish",n));t.ended=!0,e.writable=!1}(this,i,n),this},Object.defineProperty(A.prototype,"writableLength",{enumerable:!1,get:function(){return this._writableState.length}}),Object.defineProperty(A.prototype,"destroyed",{enumerable:!1,get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}}),A.prototype.destroy=l.destroy,A.prototype._undestroy=l.undestroy,A.prototype._destroy=function(e,t){t(e)}}).call(this,n(31),n(20))},function(e,t,n){"use strict";e.exports=f;var r=n(70).codes,i=r.ERR_METHOD_NOT_IMPLEMENTED,o=r.ERR_MULTIPLE_CALLBACK,s=r.ERR_TRANSFORM_ALREADY_TRANSFORMING,a=r.ERR_TRANSFORM_WITH_LENGTH_0,u=n(71);function c(e,t){var n=this._transformState;n.transforming=!1;var r=n.writecb;if(null===r)return this.emit("error",new o);n.writechunk=null,n.writecb=null,null!=t&&this.push(t),r(e);var i=this._readableState;i.reading=!1,(i.needReadable||i.length>8,s=255&i;o?n.push(o,s):n.push(s)}return n},r.zero2=i,r.toHex=o,r.encode=function(e,t){return"hex"===t?o(e):e}},function(e,t,n){"use strict";var r=t;r.base=n(95),r.short=n(332),r.mont=n(333),r.edwards=n(334)},function(e,t,n){"use strict";var r=n(51).rotr32;function i(e,t,n){return e&t^~e&n}function o(e,t,n){return e&t^e&n^t&n}function s(e,t,n){return e^t^n}t.ft_1=function(e,t,n,r){return 0===e?i(t,n,r):1===e||3===e?s(t,n,r):2===e?o(t,n,r):void 0},t.ch32=i,t.maj32=o,t.p32=s,t.s0_256=function(e){return r(e,2)^r(e,13)^r(e,22)},t.s1_256=function(e){return r(e,6)^r(e,11)^r(e,25)},t.g0_256=function(e){return r(e,7)^r(e,18)^e>>>3},t.g1_256=function(e){return r(e,17)^r(e,19)^e>>>10}},function(e,t,n){"use strict";var r=n(51),i=n(82),o=n(200),s=n(46),a=r.sum32,u=r.sum32_4,c=r.sum32_5,f=o.ch32,l=o.maj32,d=o.s0_256,h=o.s1_256,p=o.g0_256,v=o.g1_256,g=i.BlockHash,m=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];function b(){if(!(this instanceof b))return new b;g.call(this),this.h=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],this.k=m,this.W=new Array(64)}r.inherits(b,g),e.exports=b,b.blockSize=512,b.outSize=256,b.hmacStrength=192,b.padLength=64,b.prototype._update=function(e,t){for(var n=this.W,r=0;r<16;r++)n[r]=e[t+r];for(;r=49&&c<=54?c-49+10:c>=17&&c<=22?c-17+10:c,s|=u}return r(!(240&s),"Invalid character in "+e),i}function u(e,t,n,i){for(var o=0,s=0,a=Math.min(e.length,n),u=t;u=49?c-49+10:c>=17?c-17+10:c,r(c>=0&&s0?e:t},o.min=function(e,t){return e.cmp(t)<0?e:t},o.prototype._init=function(e,t,n){if("number"==typeof e)return this._initNumber(e,t,n);if("object"==typeof e)return this._initArray(e,t,n);"hex"===t&&(t=16),r(t===(0|t)&&t>=2&&t<=36);var i=0;"-"===(e=e.toString().replace(/\s+/g,""))[0]&&i++,16===t?this._parseHex(e,i):this._parseBase(e,t,i),"-"===e[0]&&(this.negative=1),this._strip(),"le"===n&&this._initArray(this.toArray(),t,n)},o.prototype._initNumber=function(e,t,n){e<0&&(this.negative=1,e=-e),e<67108864?(this.words=[67108863&e],this.length=1):e<4503599627370496?(this.words=[67108863&e,e/67108864&67108863],this.length=2):(r(e<9007199254740992),this.words=[67108863&e,e/67108864&67108863,1],this.length=3),"le"===n&&this._initArray(this.toArray(),t,n)},o.prototype._initArray=function(e,t,n){if(r("number"==typeof e.length),e.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(e.length/3),this.words=new Array(this.length);for(var i=0;i=0;i-=3)s=e[i]|e[i-1]<<8|e[i-2]<<16,this.words[o]|=s<>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);else if("le"===n)for(i=0,o=0;i>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);return this._strip()},o.prototype._parseHex=function(e,t){this.length=Math.ceil((e.length-t)/6),this.words=new Array(this.length);for(var n=0;n=t;n-=6)i=a(e,n,n+6),this.words[r]|=i<>>26-o&4194303,(o+=24)>=26&&(o-=26,r++);n+6!==t&&(i=a(e,t,n+6),this.words[r]|=i<>>26-o&4194303),this._strip()},o.prototype._parseBase=function(e,t,n){this.words=[0],this.length=1;for(var r=0,i=1;i<=67108863;i*=t)r++;r--,i=i/t|0;for(var o=e.length-n,s=o%r,a=Math.min(o,o-s)+n,c=0,f=n;f1&&0===this.words[this.length-1];)this.length--;return this._normSign()},o.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},"undefined"!=typeof Symbol&&"function"==typeof Symbol.for)try{o.prototype[Symbol.for("nodejs.util.inspect.custom")]=f}catch(e){o.prototype.inspect=f}else o.prototype.inspect=f;function f(){return(this.red?""}var l=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],d=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],h=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];o.prototype.toString=function(e,t){var n;if(t=0|t||1,16===(e=e||10)||"hex"===e){n="";for(var i=0,o=0,s=0;s>>24-i&16777215)||s!==this.length-1?l[6-u.length]+u+n:u+n,(i+=2)>=26&&(i-=26,s--)}for(0!==o&&(n=o.toString(16)+n);n.length%t!=0;)n="0"+n;return 0!==this.negative&&(n="-"+n),n}if(e===(0|e)&&e>=2&&e<=36){var c=d[e],f=h[e];n="";var p=this.clone();for(p.negative=0;!p.isZero();){var v=p.modrn(f).toString(e);n=(p=p.idivn(f)).isZero()?v+n:l[c-v.length]+v+n}for(this.isZero()&&(n="0"+n);n.length%t!=0;)n="0"+n;return 0!==this.negative&&(n="-"+n),n}r(!1,"Base should be between 2 and 36")},o.prototype.toNumber=function(){var e=this.words[0];return 2===this.length?e+=67108864*this.words[1]:3===this.length&&1===this.words[2]?e+=4503599627370496+67108864*this.words[1]:this.length>2&&r(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-e:e},o.prototype.toJSON=function(){return this.toString(16,2)},s&&(o.prototype.toBuffer=function(e,t){return this.toArrayLike(s,e,t)}),o.prototype.toArray=function(e,t){return this.toArrayLike(Array,e,t)};function p(e,t,n){n.negative=t.negative^e.negative;var r=e.length+t.length|0;n.length=r,r=r-1|0;var i=0|e.words[0],o=0|t.words[0],s=i*o,a=67108863&s,u=s/67108864|0;n.words[0]=a;for(var c=1;c>>26,l=67108863&u,d=Math.min(c,t.length-1),h=Math.max(0,c-e.length+1);h<=d;h++){var p=c-h|0;f+=(s=(i=0|e.words[p])*(o=0|t.words[h])+l)/67108864|0,l=67108863&s}n.words[c]=0|l,u=0|f}return 0!==u?n.words[c]=0|u:n.length--,n._strip()}o.prototype.toArrayLike=function(e,t,n){this._strip();var i=this.byteLength(),o=n||Math.max(1,i);r(i<=o,"byte array longer than desired length"),r(o>0,"Requested array length <= 0");var s=function(e,t){return e.allocUnsafe?e.allocUnsafe(t):new e(t)}(e,o);return this["_toArrayLike"+("le"===t?"LE":"BE")](s,i),s},o.prototype._toArrayLikeLE=function(e,t){for(var n=0,r=0,i=0,o=0;i>8&255),n>16&255),6===o?(n>24&255),r=0,o=0):(r=s>>>24,o+=2)}if(n=0&&(e[n--]=s>>8&255),n>=0&&(e[n--]=s>>16&255),6===o?(n>=0&&(e[n--]=s>>24&255),r=0,o=0):(r=s>>>24,o+=2)}if(n>=0)for(e[n--]=r;n>=0;)e[n--]=0},Math.clz32?o.prototype._countBits=function(e){return 32-Math.clz32(e)}:o.prototype._countBits=function(e){var t=e,n=0;return t>=4096&&(n+=13,t>>>=13),t>=64&&(n+=7,t>>>=7),t>=8&&(n+=4,t>>>=4),t>=2&&(n+=2,t>>>=2),n+t},o.prototype._zeroBits=function(e){if(0===e)return 26;var t=e,n=0;return 0==(8191&t)&&(n+=13,t>>>=13),0==(127&t)&&(n+=7,t>>>=7),0==(15&t)&&(n+=4,t>>>=4),0==(3&t)&&(n+=2,t>>>=2),0==(1&t)&&n++,n},o.prototype.bitLength=function(){var e=this.words[this.length-1],t=this._countBits(e);return 26*(this.length-1)+t},o.prototype.zeroBits=function(){if(this.isZero())return 0;for(var e=0,t=0;te.length?this.clone().ior(e):e.clone().ior(this)},o.prototype.uor=function(e){return this.length>e.length?this.clone().iuor(e):e.clone().iuor(this)},o.prototype.iuand=function(e){var t;t=this.length>e.length?e:this;for(var n=0;ne.length?this.clone().iand(e):e.clone().iand(this)},o.prototype.uand=function(e){return this.length>e.length?this.clone().iuand(e):e.clone().iuand(this)},o.prototype.iuxor=function(e){var t,n;this.length>e.length?(t=this,n=e):(t=e,n=this);for(var r=0;re.length?this.clone().ixor(e):e.clone().ixor(this)},o.prototype.uxor=function(e){return this.length>e.length?this.clone().iuxor(e):e.clone().iuxor(this)},o.prototype.inotn=function(e){r("number"==typeof e&&e>=0);var t=0|Math.ceil(e/26),n=e%26;this._expand(t),n>0&&t--;for(var i=0;i0&&(this.words[i]=~this.words[i]&67108863>>26-n),this._strip()},o.prototype.notn=function(e){return this.clone().inotn(e)},o.prototype.setn=function(e,t){r("number"==typeof e&&e>=0);var n=e/26|0,i=e%26;return this._expand(n+1),this.words[n]=t?this.words[n]|1<e.length?(n=this,r=e):(n=e,r=this);for(var i=0,o=0;o>>26;for(;0!==i&&o>>26;if(this.length=n.length,0!==i)this.words[this.length]=i,this.length++;else if(n!==this)for(;oe.length?this.clone().iadd(e):e.clone().iadd(this)},o.prototype.isub=function(e){if(0!==e.negative){e.negative=0;var t=this.iadd(e);return e.negative=1,t._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(e),this.negative=1,this._normSign();var n,r,i=this.cmp(e);if(0===i)return this.negative=0,this.length=1,this.words[0]=0,this;i>0?(n=this,r=e):(n=e,r=this);for(var o=0,s=0;s>26,this.words[s]=67108863&t;for(;0!==o&&s>26,this.words[s]=67108863&t;if(0===o&&s>>13,h=0|s[1],p=8191&h,v=h>>>13,g=0|s[2],m=8191&g,b=g>>>13,y=0|s[3],w=8191&y,_=y>>>13,S=0|s[4],E=8191&S,M=S>>>13,A=0|s[5],I=8191&A,k=A>>>13,O=0|s[6],x=8191&O,C=O>>>13,T=0|s[7],P=8191&T,N=T>>>13,R=0|s[8],L=8191&R,j=R>>>13,D=0|s[9],U=8191&D,B=D>>>13,F=0|a[0],z=8191&F,q=F>>>13,K=0|a[1],H=8191&K,V=K>>>13,G=0|a[2],W=8191&G,$=G>>>13,Y=0|a[3],J=8191&Y,Z=Y>>>13,X=0|a[4],Q=8191&X,ee=X>>>13,te=0|a[5],ne=8191&te,re=te>>>13,ie=0|a[6],oe=8191&ie,se=ie>>>13,ae=0|a[7],ue=8191&ae,ce=ae>>>13,fe=0|a[8],le=8191&fe,de=fe>>>13,he=0|a[9],pe=8191&he,ve=he>>>13;n.negative=e.negative^t.negative,n.length=19;var ge=(c+(r=Math.imul(l,z))|0)+((8191&(i=(i=Math.imul(l,q))+Math.imul(d,z)|0))<<13)|0;c=((o=Math.imul(d,q))+(i>>>13)|0)+(ge>>>26)|0,ge&=67108863,r=Math.imul(p,z),i=(i=Math.imul(p,q))+Math.imul(v,z)|0,o=Math.imul(v,q);var me=(c+(r=r+Math.imul(l,H)|0)|0)+((8191&(i=(i=i+Math.imul(l,V)|0)+Math.imul(d,H)|0))<<13)|0;c=((o=o+Math.imul(d,V)|0)+(i>>>13)|0)+(me>>>26)|0,me&=67108863,r=Math.imul(m,z),i=(i=Math.imul(m,q))+Math.imul(b,z)|0,o=Math.imul(b,q),r=r+Math.imul(p,H)|0,i=(i=i+Math.imul(p,V)|0)+Math.imul(v,H)|0,o=o+Math.imul(v,V)|0;var be=(c+(r=r+Math.imul(l,W)|0)|0)+((8191&(i=(i=i+Math.imul(l,$)|0)+Math.imul(d,W)|0))<<13)|0;c=((o=o+Math.imul(d,$)|0)+(i>>>13)|0)+(be>>>26)|0,be&=67108863,r=Math.imul(w,z),i=(i=Math.imul(w,q))+Math.imul(_,z)|0,o=Math.imul(_,q),r=r+Math.imul(m,H)|0,i=(i=i+Math.imul(m,V)|0)+Math.imul(b,H)|0,o=o+Math.imul(b,V)|0,r=r+Math.imul(p,W)|0,i=(i=i+Math.imul(p,$)|0)+Math.imul(v,W)|0,o=o+Math.imul(v,$)|0;var ye=(c+(r=r+Math.imul(l,J)|0)|0)+((8191&(i=(i=i+Math.imul(l,Z)|0)+Math.imul(d,J)|0))<<13)|0;c=((o=o+Math.imul(d,Z)|0)+(i>>>13)|0)+(ye>>>26)|0,ye&=67108863,r=Math.imul(E,z),i=(i=Math.imul(E,q))+Math.imul(M,z)|0,o=Math.imul(M,q),r=r+Math.imul(w,H)|0,i=(i=i+Math.imul(w,V)|0)+Math.imul(_,H)|0,o=o+Math.imul(_,V)|0,r=r+Math.imul(m,W)|0,i=(i=i+Math.imul(m,$)|0)+Math.imul(b,W)|0,o=o+Math.imul(b,$)|0,r=r+Math.imul(p,J)|0,i=(i=i+Math.imul(p,Z)|0)+Math.imul(v,J)|0,o=o+Math.imul(v,Z)|0;var we=(c+(r=r+Math.imul(l,Q)|0)|0)+((8191&(i=(i=i+Math.imul(l,ee)|0)+Math.imul(d,Q)|0))<<13)|0;c=((o=o+Math.imul(d,ee)|0)+(i>>>13)|0)+(we>>>26)|0,we&=67108863,r=Math.imul(I,z),i=(i=Math.imul(I,q))+Math.imul(k,z)|0,o=Math.imul(k,q),r=r+Math.imul(E,H)|0,i=(i=i+Math.imul(E,V)|0)+Math.imul(M,H)|0,o=o+Math.imul(M,V)|0,r=r+Math.imul(w,W)|0,i=(i=i+Math.imul(w,$)|0)+Math.imul(_,W)|0,o=o+Math.imul(_,$)|0,r=r+Math.imul(m,J)|0,i=(i=i+Math.imul(m,Z)|0)+Math.imul(b,J)|0,o=o+Math.imul(b,Z)|0,r=r+Math.imul(p,Q)|0,i=(i=i+Math.imul(p,ee)|0)+Math.imul(v,Q)|0,o=o+Math.imul(v,ee)|0;var _e=(c+(r=r+Math.imul(l,ne)|0)|0)+((8191&(i=(i=i+Math.imul(l,re)|0)+Math.imul(d,ne)|0))<<13)|0;c=((o=o+Math.imul(d,re)|0)+(i>>>13)|0)+(_e>>>26)|0,_e&=67108863,r=Math.imul(x,z),i=(i=Math.imul(x,q))+Math.imul(C,z)|0,o=Math.imul(C,q),r=r+Math.imul(I,H)|0,i=(i=i+Math.imul(I,V)|0)+Math.imul(k,H)|0,o=o+Math.imul(k,V)|0,r=r+Math.imul(E,W)|0,i=(i=i+Math.imul(E,$)|0)+Math.imul(M,W)|0,o=o+Math.imul(M,$)|0,r=r+Math.imul(w,J)|0,i=(i=i+Math.imul(w,Z)|0)+Math.imul(_,J)|0,o=o+Math.imul(_,Z)|0,r=r+Math.imul(m,Q)|0,i=(i=i+Math.imul(m,ee)|0)+Math.imul(b,Q)|0,o=o+Math.imul(b,ee)|0,r=r+Math.imul(p,ne)|0,i=(i=i+Math.imul(p,re)|0)+Math.imul(v,ne)|0,o=o+Math.imul(v,re)|0;var Se=(c+(r=r+Math.imul(l,oe)|0)|0)+((8191&(i=(i=i+Math.imul(l,se)|0)+Math.imul(d,oe)|0))<<13)|0;c=((o=o+Math.imul(d,se)|0)+(i>>>13)|0)+(Se>>>26)|0,Se&=67108863,r=Math.imul(P,z),i=(i=Math.imul(P,q))+Math.imul(N,z)|0,o=Math.imul(N,q),r=r+Math.imul(x,H)|0,i=(i=i+Math.imul(x,V)|0)+Math.imul(C,H)|0,o=o+Math.imul(C,V)|0,r=r+Math.imul(I,W)|0,i=(i=i+Math.imul(I,$)|0)+Math.imul(k,W)|0,o=o+Math.imul(k,$)|0,r=r+Math.imul(E,J)|0,i=(i=i+Math.imul(E,Z)|0)+Math.imul(M,J)|0,o=o+Math.imul(M,Z)|0,r=r+Math.imul(w,Q)|0,i=(i=i+Math.imul(w,ee)|0)+Math.imul(_,Q)|0,o=o+Math.imul(_,ee)|0,r=r+Math.imul(m,ne)|0,i=(i=i+Math.imul(m,re)|0)+Math.imul(b,ne)|0,o=o+Math.imul(b,re)|0,r=r+Math.imul(p,oe)|0,i=(i=i+Math.imul(p,se)|0)+Math.imul(v,oe)|0,o=o+Math.imul(v,se)|0;var Ee=(c+(r=r+Math.imul(l,ue)|0)|0)+((8191&(i=(i=i+Math.imul(l,ce)|0)+Math.imul(d,ue)|0))<<13)|0;c=((o=o+Math.imul(d,ce)|0)+(i>>>13)|0)+(Ee>>>26)|0,Ee&=67108863,r=Math.imul(L,z),i=(i=Math.imul(L,q))+Math.imul(j,z)|0,o=Math.imul(j,q),r=r+Math.imul(P,H)|0,i=(i=i+Math.imul(P,V)|0)+Math.imul(N,H)|0,o=o+Math.imul(N,V)|0,r=r+Math.imul(x,W)|0,i=(i=i+Math.imul(x,$)|0)+Math.imul(C,W)|0,o=o+Math.imul(C,$)|0,r=r+Math.imul(I,J)|0,i=(i=i+Math.imul(I,Z)|0)+Math.imul(k,J)|0,o=o+Math.imul(k,Z)|0,r=r+Math.imul(E,Q)|0,i=(i=i+Math.imul(E,ee)|0)+Math.imul(M,Q)|0,o=o+Math.imul(M,ee)|0,r=r+Math.imul(w,ne)|0,i=(i=i+Math.imul(w,re)|0)+Math.imul(_,ne)|0,o=o+Math.imul(_,re)|0,r=r+Math.imul(m,oe)|0,i=(i=i+Math.imul(m,se)|0)+Math.imul(b,oe)|0,o=o+Math.imul(b,se)|0,r=r+Math.imul(p,ue)|0,i=(i=i+Math.imul(p,ce)|0)+Math.imul(v,ue)|0,o=o+Math.imul(v,ce)|0;var Me=(c+(r=r+Math.imul(l,le)|0)|0)+((8191&(i=(i=i+Math.imul(l,de)|0)+Math.imul(d,le)|0))<<13)|0;c=((o=o+Math.imul(d,de)|0)+(i>>>13)|0)+(Me>>>26)|0,Me&=67108863,r=Math.imul(U,z),i=(i=Math.imul(U,q))+Math.imul(B,z)|0,o=Math.imul(B,q),r=r+Math.imul(L,H)|0,i=(i=i+Math.imul(L,V)|0)+Math.imul(j,H)|0,o=o+Math.imul(j,V)|0,r=r+Math.imul(P,W)|0,i=(i=i+Math.imul(P,$)|0)+Math.imul(N,W)|0,o=o+Math.imul(N,$)|0,r=r+Math.imul(x,J)|0,i=(i=i+Math.imul(x,Z)|0)+Math.imul(C,J)|0,o=o+Math.imul(C,Z)|0,r=r+Math.imul(I,Q)|0,i=(i=i+Math.imul(I,ee)|0)+Math.imul(k,Q)|0,o=o+Math.imul(k,ee)|0,r=r+Math.imul(E,ne)|0,i=(i=i+Math.imul(E,re)|0)+Math.imul(M,ne)|0,o=o+Math.imul(M,re)|0,r=r+Math.imul(w,oe)|0,i=(i=i+Math.imul(w,se)|0)+Math.imul(_,oe)|0,o=o+Math.imul(_,se)|0,r=r+Math.imul(m,ue)|0,i=(i=i+Math.imul(m,ce)|0)+Math.imul(b,ue)|0,o=o+Math.imul(b,ce)|0,r=r+Math.imul(p,le)|0,i=(i=i+Math.imul(p,de)|0)+Math.imul(v,le)|0,o=o+Math.imul(v,de)|0;var Ae=(c+(r=r+Math.imul(l,pe)|0)|0)+((8191&(i=(i=i+Math.imul(l,ve)|0)+Math.imul(d,pe)|0))<<13)|0;c=((o=o+Math.imul(d,ve)|0)+(i>>>13)|0)+(Ae>>>26)|0,Ae&=67108863,r=Math.imul(U,H),i=(i=Math.imul(U,V))+Math.imul(B,H)|0,o=Math.imul(B,V),r=r+Math.imul(L,W)|0,i=(i=i+Math.imul(L,$)|0)+Math.imul(j,W)|0,o=o+Math.imul(j,$)|0,r=r+Math.imul(P,J)|0,i=(i=i+Math.imul(P,Z)|0)+Math.imul(N,J)|0,o=o+Math.imul(N,Z)|0,r=r+Math.imul(x,Q)|0,i=(i=i+Math.imul(x,ee)|0)+Math.imul(C,Q)|0,o=o+Math.imul(C,ee)|0,r=r+Math.imul(I,ne)|0,i=(i=i+Math.imul(I,re)|0)+Math.imul(k,ne)|0,o=o+Math.imul(k,re)|0,r=r+Math.imul(E,oe)|0,i=(i=i+Math.imul(E,se)|0)+Math.imul(M,oe)|0,o=o+Math.imul(M,se)|0,r=r+Math.imul(w,ue)|0,i=(i=i+Math.imul(w,ce)|0)+Math.imul(_,ue)|0,o=o+Math.imul(_,ce)|0,r=r+Math.imul(m,le)|0,i=(i=i+Math.imul(m,de)|0)+Math.imul(b,le)|0,o=o+Math.imul(b,de)|0;var Ie=(c+(r=r+Math.imul(p,pe)|0)|0)+((8191&(i=(i=i+Math.imul(p,ve)|0)+Math.imul(v,pe)|0))<<13)|0;c=((o=o+Math.imul(v,ve)|0)+(i>>>13)|0)+(Ie>>>26)|0,Ie&=67108863,r=Math.imul(U,W),i=(i=Math.imul(U,$))+Math.imul(B,W)|0,o=Math.imul(B,$),r=r+Math.imul(L,J)|0,i=(i=i+Math.imul(L,Z)|0)+Math.imul(j,J)|0,o=o+Math.imul(j,Z)|0,r=r+Math.imul(P,Q)|0,i=(i=i+Math.imul(P,ee)|0)+Math.imul(N,Q)|0,o=o+Math.imul(N,ee)|0,r=r+Math.imul(x,ne)|0,i=(i=i+Math.imul(x,re)|0)+Math.imul(C,ne)|0,o=o+Math.imul(C,re)|0,r=r+Math.imul(I,oe)|0,i=(i=i+Math.imul(I,se)|0)+Math.imul(k,oe)|0,o=o+Math.imul(k,se)|0,r=r+Math.imul(E,ue)|0,i=(i=i+Math.imul(E,ce)|0)+Math.imul(M,ue)|0,o=o+Math.imul(M,ce)|0,r=r+Math.imul(w,le)|0,i=(i=i+Math.imul(w,de)|0)+Math.imul(_,le)|0,o=o+Math.imul(_,de)|0;var ke=(c+(r=r+Math.imul(m,pe)|0)|0)+((8191&(i=(i=i+Math.imul(m,ve)|0)+Math.imul(b,pe)|0))<<13)|0;c=((o=o+Math.imul(b,ve)|0)+(i>>>13)|0)+(ke>>>26)|0,ke&=67108863,r=Math.imul(U,J),i=(i=Math.imul(U,Z))+Math.imul(B,J)|0,o=Math.imul(B,Z),r=r+Math.imul(L,Q)|0,i=(i=i+Math.imul(L,ee)|0)+Math.imul(j,Q)|0,o=o+Math.imul(j,ee)|0,r=r+Math.imul(P,ne)|0,i=(i=i+Math.imul(P,re)|0)+Math.imul(N,ne)|0,o=o+Math.imul(N,re)|0,r=r+Math.imul(x,oe)|0,i=(i=i+Math.imul(x,se)|0)+Math.imul(C,oe)|0,o=o+Math.imul(C,se)|0,r=r+Math.imul(I,ue)|0,i=(i=i+Math.imul(I,ce)|0)+Math.imul(k,ue)|0,o=o+Math.imul(k,ce)|0,r=r+Math.imul(E,le)|0,i=(i=i+Math.imul(E,de)|0)+Math.imul(M,le)|0,o=o+Math.imul(M,de)|0;var Oe=(c+(r=r+Math.imul(w,pe)|0)|0)+((8191&(i=(i=i+Math.imul(w,ve)|0)+Math.imul(_,pe)|0))<<13)|0;c=((o=o+Math.imul(_,ve)|0)+(i>>>13)|0)+(Oe>>>26)|0,Oe&=67108863,r=Math.imul(U,Q),i=(i=Math.imul(U,ee))+Math.imul(B,Q)|0,o=Math.imul(B,ee),r=r+Math.imul(L,ne)|0,i=(i=i+Math.imul(L,re)|0)+Math.imul(j,ne)|0,o=o+Math.imul(j,re)|0,r=r+Math.imul(P,oe)|0,i=(i=i+Math.imul(P,se)|0)+Math.imul(N,oe)|0,o=o+Math.imul(N,se)|0,r=r+Math.imul(x,ue)|0,i=(i=i+Math.imul(x,ce)|0)+Math.imul(C,ue)|0,o=o+Math.imul(C,ce)|0,r=r+Math.imul(I,le)|0,i=(i=i+Math.imul(I,de)|0)+Math.imul(k,le)|0,o=o+Math.imul(k,de)|0;var xe=(c+(r=r+Math.imul(E,pe)|0)|0)+((8191&(i=(i=i+Math.imul(E,ve)|0)+Math.imul(M,pe)|0))<<13)|0;c=((o=o+Math.imul(M,ve)|0)+(i>>>13)|0)+(xe>>>26)|0,xe&=67108863,r=Math.imul(U,ne),i=(i=Math.imul(U,re))+Math.imul(B,ne)|0,o=Math.imul(B,re),r=r+Math.imul(L,oe)|0,i=(i=i+Math.imul(L,se)|0)+Math.imul(j,oe)|0,o=o+Math.imul(j,se)|0,r=r+Math.imul(P,ue)|0,i=(i=i+Math.imul(P,ce)|0)+Math.imul(N,ue)|0,o=o+Math.imul(N,ce)|0,r=r+Math.imul(x,le)|0,i=(i=i+Math.imul(x,de)|0)+Math.imul(C,le)|0,o=o+Math.imul(C,de)|0;var Ce=(c+(r=r+Math.imul(I,pe)|0)|0)+((8191&(i=(i=i+Math.imul(I,ve)|0)+Math.imul(k,pe)|0))<<13)|0;c=((o=o+Math.imul(k,ve)|0)+(i>>>13)|0)+(Ce>>>26)|0,Ce&=67108863,r=Math.imul(U,oe),i=(i=Math.imul(U,se))+Math.imul(B,oe)|0,o=Math.imul(B,se),r=r+Math.imul(L,ue)|0,i=(i=i+Math.imul(L,ce)|0)+Math.imul(j,ue)|0,o=o+Math.imul(j,ce)|0,r=r+Math.imul(P,le)|0,i=(i=i+Math.imul(P,de)|0)+Math.imul(N,le)|0,o=o+Math.imul(N,de)|0;var Te=(c+(r=r+Math.imul(x,pe)|0)|0)+((8191&(i=(i=i+Math.imul(x,ve)|0)+Math.imul(C,pe)|0))<<13)|0;c=((o=o+Math.imul(C,ve)|0)+(i>>>13)|0)+(Te>>>26)|0,Te&=67108863,r=Math.imul(U,ue),i=(i=Math.imul(U,ce))+Math.imul(B,ue)|0,o=Math.imul(B,ce),r=r+Math.imul(L,le)|0,i=(i=i+Math.imul(L,de)|0)+Math.imul(j,le)|0,o=o+Math.imul(j,de)|0;var Pe=(c+(r=r+Math.imul(P,pe)|0)|0)+((8191&(i=(i=i+Math.imul(P,ve)|0)+Math.imul(N,pe)|0))<<13)|0;c=((o=o+Math.imul(N,ve)|0)+(i>>>13)|0)+(Pe>>>26)|0,Pe&=67108863,r=Math.imul(U,le),i=(i=Math.imul(U,de))+Math.imul(B,le)|0,o=Math.imul(B,de);var Ne=(c+(r=r+Math.imul(L,pe)|0)|0)+((8191&(i=(i=i+Math.imul(L,ve)|0)+Math.imul(j,pe)|0))<<13)|0;c=((o=o+Math.imul(j,ve)|0)+(i>>>13)|0)+(Ne>>>26)|0,Ne&=67108863;var Re=(c+(r=Math.imul(U,pe))|0)+((8191&(i=(i=Math.imul(U,ve))+Math.imul(B,pe)|0))<<13)|0;return c=((o=Math.imul(B,ve))+(i>>>13)|0)+(Re>>>26)|0,Re&=67108863,u[0]=ge,u[1]=me,u[2]=be,u[3]=ye,u[4]=we,u[5]=_e,u[6]=Se,u[7]=Ee,u[8]=Me,u[9]=Ae,u[10]=Ie,u[11]=ke,u[12]=Oe,u[13]=xe,u[14]=Ce,u[15]=Te,u[16]=Pe,u[17]=Ne,u[18]=Re,0!==c&&(u[19]=c,n.length++),n};function g(e,t,n){n.negative=t.negative^e.negative,n.length=e.length+t.length;for(var r=0,i=0,o=0;o>>26)|0)>>>26,s&=67108863}n.words[o]=a,r=s,s=i}return 0!==r?n.words[o]=r:n.length--,n._strip()}function m(e,t,n){return g(e,t,n)}function b(e,t){this.x=e,this.y=t}Math.imul||(v=p),o.prototype.mulTo=function(e,t){var n=this.length+e.length;return 10===this.length&&10===e.length?v(this,e,t):n<63?p(this,e,t):n<1024?g(this,e,t):m(this,e,t)},b.prototype.makeRBT=function(e){for(var t=new Array(e),n=o.prototype._countBits(e)-1,r=0;r>=1;return r},b.prototype.permute=function(e,t,n,r,i,o){for(var s=0;s>>=1)i++;return 1<>>=13,n[2*s+1]=8191&o,o>>>=13;for(s=2*t;s>=26,n+=o/67108864|0,n+=s>>>26,this.words[i]=67108863&s}return 0!==n&&(this.words[i]=n,this.length++),t?this.ineg():this},o.prototype.muln=function(e){return this.clone().imuln(e)},o.prototype.sqr=function(){return this.mul(this)},o.prototype.isqr=function(){return this.imul(this.clone())},o.prototype.pow=function(e){var t=function(e){for(var t=new Array(e.bitLength()),n=0;n>>i&1}return t}(e);if(0===t.length)return new o(1);for(var n=this,r=0;r=0);var t,n=e%26,i=(e-n)/26,o=67108863>>>26-n<<26-n;if(0!==n){var s=0;for(t=0;t>>26-n}s&&(this.words[t]=s,this.length++)}if(0!==i){for(t=this.length-1;t>=0;t--)this.words[t+i]=this.words[t];for(t=0;t=0),i=t?(t-t%26)/26:0;var o=e%26,s=Math.min((e-o)/26,this.length),a=67108863^67108863>>>o<s)for(this.length-=s,c=0;c=0&&(0!==f||c>=i);c--){var l=0|this.words[c];this.words[c]=f<<26-o|l>>>o,f=l&a}return u&&0!==f&&(u.words[u.length++]=f),0===this.length&&(this.words[0]=0,this.length=1),this._strip()},o.prototype.ishrn=function(e,t,n){return r(0===this.negative),this.iushrn(e,t,n)},o.prototype.shln=function(e){return this.clone().ishln(e)},o.prototype.ushln=function(e){return this.clone().iushln(e)},o.prototype.shrn=function(e){return this.clone().ishrn(e)},o.prototype.ushrn=function(e){return this.clone().iushrn(e)},o.prototype.testn=function(e){r("number"==typeof e&&e>=0);var t=e%26,n=(e-t)/26,i=1<=0);var t=e%26,n=(e-t)/26;if(r(0===this.negative,"imaskn works only with positive numbers"),this.length<=n)return this;if(0!==t&&n++,this.length=Math.min(n,this.length),0!==t){var i=67108863^67108863>>>t<=67108864;t++)this.words[t]-=67108864,t===this.length-1?this.words[t+1]=1:this.words[t+1]++;return this.length=Math.max(this.length,t+1),this},o.prototype.isubn=function(e){if(r("number"==typeof e),r(e<67108864),e<0)return this.iaddn(-e);if(0!==this.negative)return this.negative=0,this.iaddn(e),this.negative=1,this;if(this.words[0]-=e,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var t=0;t>26)-(u/67108864|0),this.words[i+n]=67108863&o}for(;i>26,this.words[i+n]=67108863&o;if(0===a)return this._strip();for(r(-1===a),a=0,i=0;i>26,this.words[i]=67108863&o;return this.negative=1,this._strip()},o.prototype._wordDiv=function(e,t){var n=(this.length,e.length),r=this.clone(),i=e,s=0|i.words[i.length-1];0!==(n=26-this._countBits(s))&&(i=i.ushln(n),r.iushln(n),s=0|i.words[i.length-1]);var a,u=r.length-i.length;if("mod"!==t){(a=new o(null)).length=u+1,a.words=new Array(a.length);for(var c=0;c=0;l--){var d=67108864*(0|r.words[i.length+l])+(0|r.words[i.length+l-1]);for(d=Math.min(d/s|0,67108863),r._ishlnsubmul(i,d,l);0!==r.negative;)d--,r.negative=0,r._ishlnsubmul(i,1,l),r.isZero()||(r.negative^=1);a&&(a.words[l]=d)}return a&&a._strip(),r._strip(),"div"!==t&&0!==n&&r.iushrn(n),{div:a||null,mod:r}},o.prototype.divmod=function(e,t,n){return r(!e.isZero()),this.isZero()?{div:new o(0),mod:new o(0)}:0!==this.negative&&0===e.negative?(a=this.neg().divmod(e,t),"mod"!==t&&(i=a.div.neg()),"div"!==t&&(s=a.mod.neg(),n&&0!==s.negative&&s.iadd(e)),{div:i,mod:s}):0===this.negative&&0!==e.negative?(a=this.divmod(e.neg(),t),"mod"!==t&&(i=a.div.neg()),{div:i,mod:a.mod}):0!=(this.negative&e.negative)?(a=this.neg().divmod(e.neg(),t),"div"!==t&&(s=a.mod.neg(),n&&0!==s.negative&&s.isub(e)),{div:a.div,mod:s}):e.length>this.length||this.cmp(e)<0?{div:new o(0),mod:this}:1===e.length?"div"===t?{div:this.divn(e.words[0]),mod:null}:"mod"===t?{div:null,mod:new o(this.modrn(e.words[0]))}:{div:this.divn(e.words[0]),mod:new o(this.modrn(e.words[0]))}:this._wordDiv(e,t);var i,s,a},o.prototype.div=function(e){return this.divmod(e,"div",!1).div},o.prototype.mod=function(e){return this.divmod(e,"mod",!1).mod},o.prototype.umod=function(e){return this.divmod(e,"mod",!0).mod},o.prototype.divRound=function(e){var t=this.divmod(e);if(t.mod.isZero())return t.div;var n=0!==t.div.negative?t.mod.isub(e):t.mod,r=e.ushrn(1),i=e.andln(1),o=n.cmp(r);return o<0||1===i&&0===o?t.div:0!==t.div.negative?t.div.isubn(1):t.div.iaddn(1)},o.prototype.modrn=function(e){var t=e<0;t&&(e=-e),r(e<=67108863);for(var n=(1<<26)%e,i=0,o=this.length-1;o>=0;o--)i=(n*i+(0|this.words[o]))%e;return t?-i:i},o.prototype.modn=function(e){return this.modrn(e)},o.prototype.idivn=function(e){var t=e<0;t&&(e=-e),r(e<=67108863);for(var n=0,i=this.length-1;i>=0;i--){var o=(0|this.words[i])+67108864*n;this.words[i]=o/e|0,n=o%e}return this._strip(),t?this.ineg():this},o.prototype.divn=function(e){return this.clone().idivn(e)},o.prototype.egcd=function(e){r(0===e.negative),r(!e.isZero());var t=this,n=e.clone();t=0!==t.negative?t.umod(e):t.clone();for(var i=new o(1),s=new o(0),a=new o(0),u=new o(1),c=0;t.isEven()&&n.isEven();)t.iushrn(1),n.iushrn(1),++c;for(var f=n.clone(),l=t.clone();!t.isZero();){for(var d=0,h=1;0==(t.words[0]&h)&&d<26;++d,h<<=1);if(d>0)for(t.iushrn(d);d-- >0;)(i.isOdd()||s.isOdd())&&(i.iadd(f),s.isub(l)),i.iushrn(1),s.iushrn(1);for(var p=0,v=1;0==(n.words[0]&v)&&p<26;++p,v<<=1);if(p>0)for(n.iushrn(p);p-- >0;)(a.isOdd()||u.isOdd())&&(a.iadd(f),u.isub(l)),a.iushrn(1),u.iushrn(1);t.cmp(n)>=0?(t.isub(n),i.isub(a),s.isub(u)):(n.isub(t),a.isub(i),u.isub(s))}return{a:a,b:u,gcd:n.iushln(c)}},o.prototype._invmp=function(e){r(0===e.negative),r(!e.isZero());var t=this,n=e.clone();t=0!==t.negative?t.umod(e):t.clone();for(var i,s=new o(1),a=new o(0),u=n.clone();t.cmpn(1)>0&&n.cmpn(1)>0;){for(var c=0,f=1;0==(t.words[0]&f)&&c<26;++c,f<<=1);if(c>0)for(t.iushrn(c);c-- >0;)s.isOdd()&&s.iadd(u),s.iushrn(1);for(var l=0,d=1;0==(n.words[0]&d)&&l<26;++l,d<<=1);if(l>0)for(n.iushrn(l);l-- >0;)a.isOdd()&&a.iadd(u),a.iushrn(1);t.cmp(n)>=0?(t.isub(n),s.isub(a)):(n.isub(t),a.isub(s))}return(i=0===t.cmpn(1)?s:a).cmpn(0)<0&&i.iadd(e),i},o.prototype.gcd=function(e){if(this.isZero())return e.abs();if(e.isZero())return this.abs();var t=this.clone(),n=e.clone();t.negative=0,n.negative=0;for(var r=0;t.isEven()&&n.isEven();r++)t.iushrn(1),n.iushrn(1);for(;;){for(;t.isEven();)t.iushrn(1);for(;n.isEven();)n.iushrn(1);var i=t.cmp(n);if(i<0){var o=t;t=n,n=o}else if(0===i||0===n.cmpn(1))break;t.isub(n)}return n.iushln(r)},o.prototype.invm=function(e){return this.egcd(e).a.umod(e)},o.prototype.isEven=function(){return 0==(1&this.words[0])},o.prototype.isOdd=function(){return 1==(1&this.words[0])},o.prototype.andln=function(e){return this.words[0]&e},o.prototype.bincn=function(e){r("number"==typeof e);var t=e%26,n=(e-t)/26,i=1<>>26,a&=67108863,this.words[s]=a}return 0!==o&&(this.words[s]=o,this.length++),this},o.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},o.prototype.cmpn=function(e){var t,n=e<0;if(0!==this.negative&&!n)return-1;if(0===this.negative&&n)return 1;if(this._strip(),this.length>1)t=1;else{n&&(e=-e),r(e<=67108863,"Number is too big");var i=0|this.words[0];t=i===e?0:ie.length)return 1;if(this.length=0;n--){var r=0|this.words[n],i=0|e.words[n];if(r!==i){ri&&(t=1);break}}return t},o.prototype.gtn=function(e){return 1===this.cmpn(e)},o.prototype.gt=function(e){return 1===this.cmp(e)},o.prototype.gten=function(e){return this.cmpn(e)>=0},o.prototype.gte=function(e){return this.cmp(e)>=0},o.prototype.ltn=function(e){return-1===this.cmpn(e)},o.prototype.lt=function(e){return-1===this.cmp(e)},o.prototype.lten=function(e){return this.cmpn(e)<=0},o.prototype.lte=function(e){return this.cmp(e)<=0},o.prototype.eqn=function(e){return 0===this.cmpn(e)},o.prototype.eq=function(e){return 0===this.cmp(e)},o.red=function(e){return new A(e)},o.prototype.toRed=function(e){return r(!this.red,"Already a number in reduction context"),r(0===this.negative,"red works only with positives"),e.convertTo(this)._forceRed(e)},o.prototype.fromRed=function(){return r(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},o.prototype._forceRed=function(e){return this.red=e,this},o.prototype.forceRed=function(e){return r(!this.red,"Already a number in reduction context"),this._forceRed(e)},o.prototype.redAdd=function(e){return r(this.red,"redAdd works only with red numbers"),this.red.add(this,e)},o.prototype.redIAdd=function(e){return r(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,e)},o.prototype.redSub=function(e){return r(this.red,"redSub works only with red numbers"),this.red.sub(this,e)},o.prototype.redISub=function(e){return r(this.red,"redISub works only with red numbers"),this.red.isub(this,e)},o.prototype.redShl=function(e){return r(this.red,"redShl works only with red numbers"),this.red.shl(this,e)},o.prototype.redMul=function(e){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,e),this.red.mul(this,e)},o.prototype.redIMul=function(e){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,e),this.red.imul(this,e)},o.prototype.redSqr=function(){return r(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},o.prototype.redISqr=function(){return r(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},o.prototype.redSqrt=function(){return r(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},o.prototype.redInvm=function(){return r(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},o.prototype.redNeg=function(){return r(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},o.prototype.redPow=function(e){return r(this.red&&!e.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,e)};var y={k256:null,p224:null,p192:null,p25519:null};function w(e,t){this.name=e,this.p=new o(t,16),this.n=this.p.bitLength(),this.k=new o(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function _(){w.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function S(){w.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function E(){w.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function M(){w.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function A(e){if("string"==typeof e){var t=o._prime(e);this.m=t.p,this.prime=t}else r(e.gtn(1),"modulus must be greater than 1"),this.m=e,this.prime=null}function I(e){A.call(this,e),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new o(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}w.prototype._tmp=function(){var e=new o(null);return e.words=new Array(Math.ceil(this.n/13)),e},w.prototype.ireduce=function(e){var t,n=e;do{this.split(n,this.tmp),t=(n=(n=this.imulK(n)).iadd(this.tmp)).bitLength()}while(t>this.n);var r=t0?n.isub(this.p):void 0!==n.strip?n.strip():n._strip(),n},w.prototype.split=function(e,t){e.iushrn(this.n,0,t)},w.prototype.imulK=function(e){return e.imul(this.k)},i(_,w),_.prototype.split=function(e,t){for(var n=Math.min(e.length,9),r=0;r>>22,i=o}i>>>=22,e.words[r-10]=i,0===i&&e.length>10?e.length-=10:e.length-=9},_.prototype.imulK=function(e){e.words[e.length]=0,e.words[e.length+1]=0,e.length+=2;for(var t=0,n=0;n>>=26,e.words[n]=i,t=r}return 0!==t&&(e.words[e.length++]=t),e},o._prime=function(e){if(y[e])return y[e];var t;if("k256"===e)t=new _;else if("p224"===e)t=new S;else if("p192"===e)t=new E;else{if("p25519"!==e)throw new Error("Unknown prime "+e);t=new M}return y[e]=t,t},A.prototype._verify1=function(e){r(0===e.negative,"red works only with positives"),r(e.red,"red works only with red numbers")},A.prototype._verify2=function(e,t){r(0==(e.negative|t.negative),"red works only with positives"),r(e.red&&e.red===t.red,"red works only with red numbers")},A.prototype.imod=function(e){return this.prime?this.prime.ireduce(e)._forceRed(this):(c(e,e.umod(this.m)._forceRed(this)),e)},A.prototype.neg=function(e){return e.isZero()?e.clone():this.m.sub(e)._forceRed(this)},A.prototype.add=function(e,t){this._verify2(e,t);var n=e.add(t);return n.cmp(this.m)>=0&&n.isub(this.m),n._forceRed(this)},A.prototype.iadd=function(e,t){this._verify2(e,t);var n=e.iadd(t);return n.cmp(this.m)>=0&&n.isub(this.m),n},A.prototype.sub=function(e,t){this._verify2(e,t);var n=e.sub(t);return n.cmpn(0)<0&&n.iadd(this.m),n._forceRed(this)},A.prototype.isub=function(e,t){this._verify2(e,t);var n=e.isub(t);return n.cmpn(0)<0&&n.iadd(this.m),n},A.prototype.shl=function(e,t){return this._verify1(e),this.imod(e.ushln(t))},A.prototype.imul=function(e,t){return this._verify2(e,t),this.imod(e.imul(t))},A.prototype.mul=function(e,t){return this._verify2(e,t),this.imod(e.mul(t))},A.prototype.isqr=function(e){return this.imul(e,e.clone())},A.prototype.sqr=function(e){return this.mul(e,e)},A.prototype.sqrt=function(e){if(e.isZero())return e.clone();var t=this.m.andln(3);if(r(t%2==1),3===t){var n=this.m.add(new o(1)).iushrn(2);return this.pow(e,n)}for(var i=this.m.subn(1),s=0;!i.isZero()&&0===i.andln(1);)s++,i.iushrn(1);r(!i.isZero());var a=new o(1).toRed(this),u=a.redNeg(),c=this.m.subn(1).iushrn(1),f=this.m.bitLength();for(f=new o(2*f*f).toRed(this);0!==this.pow(f,c).cmp(u);)f.redIAdd(u);for(var l=this.pow(f,i),d=this.pow(e,i.addn(1).iushrn(1)),h=this.pow(e,i),p=s;0!==h.cmp(a);){for(var v=h,g=0;0!==v.cmp(a);g++)v=v.redSqr();r(g=0;r--){for(var c=t.words[r],f=u-1;f>=0;f--){var l=c>>f&1;i!==n[0]&&(i=this.sqr(i)),0!==l||0!==s?(s<<=1,s|=l,(4===++a||0===r&&0===f)&&(i=this.mul(i,n[s]),a=0,s=0)):a=0}u=26}return i},A.prototype.convertTo=function(e){var t=e.umod(this.m);return t===e?t.clone():t},A.prototype.convertFrom=function(e){var t=e.clone();return t.red=null,t},o.mont=function(e){return new I(e)},i(I,A),I.prototype.convertTo=function(e){return this.imod(e.ushln(this.shift))},I.prototype.convertFrom=function(e){var t=this.imod(e.mul(this.rinv));return t.red=null,t},I.prototype.imul=function(e,t){if(e.isZero()||t.isZero())return e.words[0]=0,e.length=1,e;var n=e.imul(t),r=n.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=n.isub(r).iushrn(this.shift),o=i;return i.cmp(this.m)>=0?o=i.isub(this.m):i.cmpn(0)<0&&(o=i.iadd(this.m)),o._forceRed(this)},I.prototype.mul=function(e,t){if(e.isZero()||t.isZero())return new o(0)._forceRed(this);var n=e.mul(t),r=n.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=n.isub(r).iushrn(this.shift),s=i;return i.cmp(this.m)>=0?s=i.isub(this.m):i.cmpn(0)<0&&(s=i.iadd(this.m)),s._forceRed(this)},I.prototype.invm=function(e){return this.imod(e._invmp(this.m).mul(this.r2))._forceRed(this)}}(e,this)}).call(this,n(57)(e))},function(e,t,n){"use strict";const r=t;r.bignum=n(29),r.define=n(351).define,r.base=n(354),r.constants=n(355),r.decoders=n(207),r.encoders=n(205)},function(e,t,n){"use strict";const r=t;r.der=n(206),r.pem=n(352)},function(e,t,n){"use strict";const r=n(7),i=n(130).Buffer,o=n(131),s=n(133);function a(e){this.enc="der",this.name=e.name,this.entity=e,this.tree=new u,this.tree._init(e.body)}function u(e){o.call(this,"der",e)}function c(e){return e<10?"0"+e:e}e.exports=a,a.prototype.encode=function(e,t){return this.tree._encode(e,t).join()},r(u,o),u.prototype._encodeComposite=function(e,t,n,r){const o=function(e,t,n,r){let i;"seqof"===e?e="seq":"setof"===e&&(e="set");if(s.tagByName.hasOwnProperty(e))i=s.tagByName[e];else{if("number"!=typeof e||(0|e)!==e)return r.error("Unknown tag: "+e);i=e}if(i>=31)return r.error("Multi-octet tag encoding unsupported");t||(i|=32);return i|=s.tagClassByName[n||"universal"]<<6,i}(e,t,n,this.reporter);if(r.length<128){const e=i.alloc(2);return e[0]=o,e[1]=r.length,this._createEncoderBuffer([e,r])}let a=1;for(let e=r.length;e>=256;e>>=8)a++;const u=i.alloc(2+a);u[0]=o,u[1]=128|a;for(let e=1+a,t=r.length;t>0;e--,t>>=8)u[e]=255&t;return this._createEncoderBuffer([u,r])},u.prototype._encodeStr=function(e,t){if("bitstr"===t)return this._createEncoderBuffer([0|e.unused,e.data]);if("bmpstr"===t){const t=i.alloc(2*e.length);for(let n=0;n=40)return this.reporter.error("Second objid identifier OOB");e.splice(0,2,40*e[0]+e[1])}let r=0;for(let t=0;t=128;n>>=7)r++}const o=i.alloc(r);let s=o.length-1;for(let t=e.length-1;t>=0;t--){let n=e[t];for(o[s--]=127&n;(n>>=7)>0;)o[s--]=128|127&n}return this._createEncoderBuffer(o)},u.prototype._encodeTime=function(e,t){let n;const r=new Date(e);return"gentime"===t?n=[c(r.getUTCFullYear()),c(r.getUTCMonth()+1),c(r.getUTCDate()),c(r.getUTCHours()),c(r.getUTCMinutes()),c(r.getUTCSeconds()),"Z"].join(""):"utctime"===t?n=[c(r.getUTCFullYear()%100),c(r.getUTCMonth()+1),c(r.getUTCDate()),c(r.getUTCHours()),c(r.getUTCMinutes()),c(r.getUTCSeconds()),"Z"].join(""):this.reporter.error("Encoding "+t+" time is not supported yet"),this._encodeStr(n,"octstr")},u.prototype._encodeNull=function(){return this._createEncoderBuffer("")},u.prototype._encodeInt=function(e,t){if("string"==typeof e){if(!t)return this.reporter.error("String int or enum given, but no values map");if(!t.hasOwnProperty(e))return this.reporter.error("Values map doesn't contain: "+JSON.stringify(e));e=t[e]}if("number"!=typeof e&&!i.isBuffer(e)){const t=e.toArray();!e.sign&&128&t[0]&&t.unshift(0),e=i.from(t)}if(i.isBuffer(e)){let t=e.length;0===e.length&&t++;const n=i.alloc(t);return e.copy(n),0===e.length&&(n[0]=0),this._createEncoderBuffer(n)}if(e<128)return this._createEncoderBuffer(e);if(e<256)return this._createEncoderBuffer([0,e]);let n=1;for(let t=e;t>=256;t>>=8)n++;const r=new Array(n);for(let t=r.length-1;t>=0;t--)r[t]=255&e,e>>=8;return 128&r[0]&&r.unshift(0),this._createEncoderBuffer(i.from(r))},u.prototype._encodeBool=function(e){return this._createEncoderBuffer(e?255:0)},u.prototype._use=function(e,t){return"function"==typeof e&&(e=e(t)),e._getEncoder("der").tree},u.prototype._skipDefault=function(e,t,n){const r=this._baseState;let i;if(null===r.default)return!1;const o=e.join();if(void 0===r.defaultBuffer&&(r.defaultBuffer=this._encodeValue(r.default,t,n).join()),o.length!==r.defaultBuffer.length)return!1;for(i=0;i>6],i=0==(32&n);if(31==(31&n)){let r=n;for(n=0;128==(128&r);){if(r=e.readUInt8(t),e.isError(r))return r;n<<=7,n|=127&r}}else n&=31;return{cls:r,primitive:i,tag:n,tagStr:a.tag[n]}}function l(e,t,n){let r=e.readUInt8(n);if(e.isError(r))return r;if(!t&&128===r)return null;if(0==(128&r))return r;const i=127&r;if(i>4)return e.error("length octect is too long");r=0;for(let t=0;t>>((3&t)<<3)&255;return i}}},function(e,t){for(var n=[],r=0;r<256;++r)n[r]=(r+256).toString(16).substr(1);e.exports=function(e,t){var r=t||0,i=n;return[i[e[r++]],i[e[r++]],i[e[r++]],i[e[r++]],"-",i[e[r++]],i[e[r++]],"-",i[e[r++]],i[e[r++]],"-",i[e[r++]],i[e[r++]],"-",i[e[r++]],i[e[r++]],i[e[r++]],i[e[r++]],i[e[r++]],i[e[r++]]].join("")}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Sha256=void 0;var r=n(217),i=n(218),o=n(249),s=n(134),a=function(){function e(e){e?(this.operation=function(e){return new Promise((function(t,n){var r=s.locateWindow().msCrypto.subtle.importKey("raw",u(e),i.SHA_256_HMAC_ALGO,!1,["sign"]);r.oncomplete=function(){r.result&&t(r.result),n("ImportKey completed without importing key.")},r.onerror=function(){n("ImportKey failed to import key.")}}))}(e).then((function(e){return s.locateWindow().msCrypto.subtle.sign(i.SHA_256_HMAC_ALGO,e)})),this.operation.catch((function(){}))):this.operation=Promise.resolve(s.locateWindow().msCrypto.subtle.digest("SHA-256"))}return e.prototype.update=function(e){var t=this;r.isEmptyData(e)||(this.operation=this.operation.then((function(n){return n.onerror=function(){t.operation=Promise.reject(new Error("Error encountered updating hash"))},n.process(u(e)),n})),this.operation.catch((function(){})))},e.prototype.digest=function(){return this.operation.then((function(e){return new Promise((function(t,n){e.onerror=function(){n("Error encountered finalizing hash")},e.oncomplete=function(){e.result&&t(new Uint8Array(e.result)),n("Error encountered finalizing hash")},e.finish()}))}))},e}();function u(e){return"string"==typeof e?o.fromUtf8(e):ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength/Uint8Array.BYTES_PER_ELEMENT):new Uint8Array(e)}t.Sha256=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isEmptyData=void 0,t.isEmptyData=function(e){return"string"==typeof e?0===e.length:0===e.byteLength}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.EMPTY_DATA_SHA_256=t.SHA_256_HMAC_ALGO=t.SHA_256_HASH=void 0,t.SHA_256_HASH={name:"SHA-256"},t.SHA_256_HMAC_ALGO={name:"HMAC",hash:t.SHA_256_HASH},t.EMPTY_DATA_SHA_256=new Uint8Array([227,176,196,66,152,252,28,20,154,251,244,200,153,111,185,36,39,174,65,228,100,155,147,76,164,149,153,27,120,82,184,85])},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Sha256=void 0;var r=n(249),i=n(217),o=n(218),s=n(134),a=function(){function e(e){this.toHash=new Uint8Array(0),void 0!==e&&(this.key=new Promise((function(t,n){s.locateWindow().crypto.subtle.importKey("raw",u(e),o.SHA_256_HMAC_ALGO,!1,["sign"]).then(t,n)})),this.key.catch((function(){})))}return e.prototype.update=function(e){if(!i.isEmptyData(e)){var t=u(e),n=new Uint8Array(this.toHash.byteLength+t.byteLength);n.set(this.toHash,0),n.set(t,this.toHash.byteLength),this.toHash=n}},e.prototype.digest=function(){var e=this;return this.key?this.key.then((function(t){return s.locateWindow().crypto.subtle.sign(o.SHA_256_HMAC_ALGO,t,e.toHash).then((function(e){return new Uint8Array(e)}))})):i.isEmptyData(this.toHash)?Promise.resolve(o.EMPTY_DATA_SHA_256):Promise.resolve().then((function(){return s.locateWindow().crypto.subtle.digest(o.SHA_256_HASH,e.toHash)})).then((function(e){return Promise.resolve(new Uint8Array(e))}))},e}();function u(e){return"string"==typeof e?r.fromUtf8(e):ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength/Uint8Array.BYTES_PER_ELEMENT):new Uint8Array(e)}t.Sha256=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.MAX_HASHABLE_LENGTH=t.INIT=t.KEY=t.DIGEST_LENGTH=t.BLOCK_SIZE=void 0,t.BLOCK_SIZE=64,t.DIGEST_LENGTH=32,t.KEY=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),t.INIT=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],t.MAX_HASHABLE_LENGTH=Math.pow(2,53)-1},function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var r=new(n(44).a)("Parser"),i=function(e){var t,n={};if(e.aws_mobile_analytics_app_id){var i={AWSPinpoint:{appId:e.aws_mobile_analytics_app_id,region:e.aws_mobile_analytics_app_region}};n.Analytics=i}return(e.aws_cognito_identity_pool_id||e.aws_user_pools_id)&&(n.Auth={userPoolId:e.aws_user_pools_id,userPoolWebClientId:e.aws_user_pools_web_client_id,region:e.aws_cognito_region,identityPoolId:e.aws_cognito_identity_pool_id,identityPoolRegion:e.aws_cognito_region,mandatorySignIn:"enable"===e.aws_mandatory_sign_in}),t=e.aws_user_files_s3_bucket?{AWSS3:{bucket:e.aws_user_files_s3_bucket,region:e.aws_user_files_s3_bucket_region,dangerouslyConnectToHttpEndpointForTesting:e.aws_user_files_s3_dangerously_connect_to_http_endpoint_for_testing}}:e?e.Storage||e:{},n.Analytics=Object.assign({},n.Analytics,e.Analytics),n.Auth=Object.assign({},n.Auth,e.Auth),n.Storage=Object.assign({},t),r.debug("parse config",e,"to amplifyconfig",n),n},o=function(){function e(){}return e.parseMobilehubConfig=i,e}()},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.BLOCK_SIZE=64,t.DIGEST_LENGTH=32,t.KEY=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),t.INIT=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],t.MAX_HASHABLE_LENGTH=Math.pow(2,53)-1},function(e,t,n){(function(t){var n="object"==typeof t&&t&&t.Object===Object&&t;e.exports=n}).call(this,n(31))},function(e,t,n){var r=n(84),i=n(225);e.exports=function(e){if(!i(e))return!1;var t=r(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t}},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},function(e,t){var n=Function.prototype.toString;e.exports=function(e){if(null!=e){try{return n.call(e)}catch(e){}try{return e+""}catch(e){}}return""}},function(e,t){e.exports=function(e,t){return e===t||e!=e&&t!=t}},function(e,t,n){var r=n(229),i=n(420),o=Object.prototype.hasOwnProperty;e.exports=function(e){if(!r(e))return i(e);var t=[];for(var n in Object(e))o.call(e,n)&&"constructor"!=n&&t.push(n);return t}},function(e,t){var n=Object.prototype;e.exports=function(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||n)}},function(e,t,n){var r=n(422),i=n(137),o=n(423),s=n(424),a=n(425),u=n(84),c=n(226),f=c(r),l=c(i),d=c(o),h=c(s),p=c(a),v=u;(r&&"[object DataView]"!=v(new r(new ArrayBuffer(1)))||i&&"[object Map]"!=v(new i)||o&&"[object Promise]"!=v(o.resolve())||s&&"[object Set]"!=v(new s)||a&&"[object WeakMap]"!=v(new a))&&(v=function(e){var t=u(e),n="[object Object]"==t?e.constructor:void 0,r=n?c(n):"";if(r)switch(r){case f:return"[object DataView]";case l:return"[object Map]";case d:return"[object Promise]";case h:return"[object Set]";case p:return"[object WeakMap]"}return t}),e.exports=v},function(e,t,n){var r=n(426),i=n(85),o=Object.prototype,s=o.hasOwnProperty,a=o.propertyIsEnumerable,u=r(function(){return arguments}())?r:function(e){return i(e)&&s.call(e,"callee")&&!a.call(e,"callee")};e.exports=u},function(e,t,n){var r=n(224),i=n(233);e.exports=function(e){return null!=e&&i(e.length)&&!r(e)}},function(e,t){e.exports=function(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}},function(e,t,n){var r=n(439),i=n(442),o=n(443);e.exports=function(e,t,n,s,a,u){var c=1&n,f=e.length,l=t.length;if(f!=l&&!(c&&l>f))return!1;var d=u.get(e),h=u.get(t);if(d&&h)return d==t&&h==e;var p=-1,v=!0,g=2&n?new r:void 0;for(u.set(e,t),u.set(t,e);++p=200&&e<300}};u.headers={common:{Accept:"application/json, text/plain, */*"}},r.forEach(["delete","get","head"],(function(e){u.headers[e]={}})),r.forEach(["post","put","patch"],(function(e){u.headers[e]=r.merge(o)})),e.exports=u}).call(this,n(20))},function(e,t,n){"use strict";var r=n(45),i=n(471),o=n(473),s=n(236),a=n(474),u=n(477),c=n(478),f=n(240);e.exports=function(e){return new Promise((function(t,n){var l=e.data,d=e.headers;r.isFormData(l)&&delete d["Content-Type"];var h=new XMLHttpRequest;if(e.auth){var p=e.auth.username||"",v=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";d.Authorization="Basic "+btoa(p+":"+v)}var g=a(e.baseURL,e.url);if(h.open(e.method.toUpperCase(),s(g,e.params,e.paramsSerializer),!0),h.timeout=e.timeout,h.onreadystatechange=function(){if(h&&4===h.readyState&&(0!==h.status||h.responseURL&&0===h.responseURL.indexOf("file:"))){var r="getAllResponseHeaders"in h?u(h.getAllResponseHeaders()):null,o={data:e.responseType&&"text"!==e.responseType?h.response:h.responseText,status:h.status,statusText:h.statusText,headers:r,config:e,request:h};i(t,n,o),h=null}},h.onabort=function(){h&&(n(f("Request aborted",e,"ECONNABORTED",h)),h=null)},h.onerror=function(){n(f("Network Error",e,null,h)),h=null},h.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(f(t,e,"ECONNABORTED",h)),h=null},r.isStandardBrowserEnv()){var m=(e.withCredentials||c(g))&&e.xsrfCookieName?o.read(e.xsrfCookieName):void 0;m&&(d[e.xsrfHeaderName]=m)}if("setRequestHeader"in h&&r.forEach(d,(function(e,t){void 0===l&&"content-type"===t.toLowerCase()?delete d[t]:h.setRequestHeader(t,e)})),r.isUndefined(e.withCredentials)||(h.withCredentials=!!e.withCredentials),e.responseType)try{h.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&h.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&h.upload&&h.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then((function(e){h&&(h.abort(),n(e),h=null)})),l||(l=null),h.send(l)}))}},function(e,t,n){"use strict";var r=n(472);e.exports=function(e,t,n,i,o){var s=new Error(e);return r(s,t,n,i,o)}},function(e,t,n){"use strict";var r=n(45);e.exports=function(e,t){t=t||{};var n={},i=["url","method","data"],o=["headers","auth","proxy","params"],s=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],a=["validateStatus"];function u(e,t){return r.isPlainObject(e)&&r.isPlainObject(t)?r.merge(e,t):r.isPlainObject(t)?r.merge({},t):r.isArray(t)?t.slice():t}function c(i){r.isUndefined(t[i])?r.isUndefined(e[i])||(n[i]=u(void 0,e[i])):n[i]=u(e[i],t[i])}r.forEach(i,(function(e){r.isUndefined(t[e])||(n[e]=u(void 0,t[e]))})),r.forEach(o,c),r.forEach(s,(function(i){r.isUndefined(t[i])?r.isUndefined(e[i])||(n[i]=u(void 0,e[i])):n[i]=u(void 0,t[i])})),r.forEach(a,(function(r){r in t?n[r]=u(e[r],t[r]):r in e&&(n[r]=u(void 0,e[r]))}));var f=i.concat(o).concat(s).concat(a),l=Object.keys(e).concat(Object.keys(t)).filter((function(e){return-1===f.indexOf(e)}));return r.forEach(l,c),n}},function(e,t,n){"use strict";function r(e){this.message=e}r.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},r.prototype.__CANCEL__=!0,e.exports=r},function(e,t){var n="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof window.msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto);if(n){var r=new Uint8Array(16);e.exports=function(){return n(r),r}}else{var i=new Array(16);e.exports=function(){for(var e,t=0;t<16;t++)0==(3&t)&&(e=4294967296*Math.random()),i[t]=e>>>((3&t)<<3)&255;return i}}},function(e,t){for(var n=[],r=0;r<256;++r)n[r]=(r+256).toString(16).substr(1);e.exports=function(e,t){var r=t||0,i=n;return[i[e[r++]],i[e[r++]],i[e[r++]],i[e[r++]],"-",i[e[r++]],i[e[r++]],"-",i[e[r++]],i[e[r++]],"-",i[e[r++]],i[e[r++]],"-",i[e[r++]],i[e[r++]],i[e[r++]],i[e[r++]],i[e[r++]],i[e[r++]]].join("")}},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var r=function(){function e(){}return e.createPredicateBuilder=function(t){var n=t.name,r=new Set(Object.keys(t.fields)),i=new Proxy({},{get:function(t,i,o){var s=i;if(!r.has(s))throw new Error("Invalid field for model. field: "+s+", model: "+n);return function(t){return e.sortPredicateGroupsMap.get(o).push({field:s,sortDirection:t}),o}}});return e.sortPredicateGroupsMap.set(i,[]),i},e.isValidPredicate=function(t){return e.sortPredicateGroupsMap.has(t)},e.getPredicates=function(t,n){if(void 0===n&&(n=!0),n&&!e.isValidPredicate(t))throw new Error("The predicate is not valid");return e.sortPredicateGroupsMap.get(t)},e.createFromExisting=function(t,n){if(n&&t)return n(e.createPredicateBuilder(t))},e.sortPredicateGroupsMap=new WeakMap,e}()},function(e,t,n){(function(e){var n,r,i,o;function s(e){return(s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}o=function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==s(e)&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";function r(e){for(var n in e)t.hasOwnProperty(n)||(t[n]=e[n])}Object.defineProperty(t,"__esModule",{value:!0}),r(n(1)),r(n(2)),r(n(3)),r(n(4)),r(n(5)),r(n(6)),r(n(7)),r(n(8)),r(n(9)),r(n(10)),r(n(11)),r(n(12)),r(n(13))},function(e,t,n){e.exports={a:"Anchor__a___1_Iz8"}},function(e,t,n){e.exports={button:"Button__button___vS7Mv",signInButton:"Button__signInButton___3bUH-",googleSignInButton:"Button__googleSignInButton___1YiCu",signInButtonIcon:"Button__signInButtonIcon___ihN75",auth0SignInButton:"Button__auth0SignInButton___znnCj",facebookSignInButton:"Button__facebookSignInButton___34Txh",amazonSignInButton:"Button__amazonSignInButton___2EMtl",oAuthSignInButton:"Button__oAuthSignInButton___3UGOl",signInButtonContent:"Button__signInButtonContent___xqTXJ"}},function(e,t,n){e.exports={formContainer:"Form__formContainer___1GA3x",formSection:"Form__formSection___1PPvW",formField:"Form__formField___38Ikl",formRow:"Form__formRow___2mwRs"}},function(e,t,n){e.exports={hint:"Hint__hint___2XngB"}},function(e,t,n){e.exports={input:"Input__input___3e_bf",inputLabel:"Input__inputLabel___3VF0S",label:"Input__label___23sO8",radio:"Input__radio___2hllK"}},function(e,t,n){e.exports={navBar:"Nav__navBar___xtCFA",navRight:"Nav__navRight___1QG2J",nav:"Nav__nav___2Dx2Y",navItem:"Nav__navItem___1LtFQ"}},function(e,t,n){e.exports={photoPickerButton:"PhotoPicker__photoPickerButton___2XdVn",photoPlaceholder:"PhotoPicker__photoPlaceholder___2JXO4",photoPlaceholderIcon:"PhotoPicker__photoPlaceholderIcon___3Et71"}},function(e,t,n){e.exports={container:"Section__container___3YYTG",actionRow:"Section__actionRow___2LWSU",sectionHeader:"Section__sectionHeader___2djyg",sectionHeaderHint:"Section__sectionHeaderHint___3Wxdc",sectionBody:"Section__sectionBody___ihqqd",sectionHeaderContent:"Section__sectionHeaderContent___1UCqa",sectionFooter:"Section__sectionFooter___1T54C",sectionFooterPrimaryContent:"Section__sectionFooterPrimaryContent___2r9ZX",sectionFooterSecondaryContent:"Section__sectionFooterSecondaryContent___Nj41Q"}},function(e,t,n){e.exports={selectInput:"SelectInput__selectInput___3efO4"}},function(e,t,n){e.exports={strike:"Strike__strike___1XV1b",strikeContent:"Strike__strikeContent___10gLb"}},function(e,t,n){e.exports={toast:"Toast__toast___XXr3v",toastClose:"Toast__toastClose___18lU4"}},function(e,t,n){e.exports={totpQrcode:"Totp__totpQrcode___1crLx"}},function(e,t,n){e.exports={sumerianSceneContainer:"XR__sumerianSceneContainer___3nVMt",sumerianScene:"XR__sumerianScene___2Tt7-",loadingOverlay:"XR__loadingOverlay___IbqcI",loadingContainer:"XR__loadingContainer___2Itxb",loadingLogo:"XR__loadingLogo___Ub7xQ",loadingSceneName:"XR__loadingSceneName___3__ne",loadingBar:"XR__loadingBar___2vcke",loadingBarFill:"XR__loadingBarFill___3M-D9",sceneErrorText:"XR__sceneErrorText___2y0tp",sceneBar:"XR__sceneBar___2ShrP",sceneName:"XR__sceneName___1ApHr",sceneActions:"XR__sceneActions___7plGs",actionButton:"XR__actionButton___2poIM",tooltip:"XR__tooltip___UYyhn",actionIcon:"XR__actionIcon___2qnd2",autoShowTooltip:"XR__autoShowTooltip___V1QH7"}}])},"object"==s(t)&&"object"==s(e)?e.exports=o():(r=[],void 0===(i="function"==typeof(n=o)?n.apply(t,r):n)||(e.exports=i))}).call(this,n(57)(e))},function(e,t,n){"use strict";n.d(t,"a",(function(){return d}));var r=n(52),i=n(63),o=n(89),s=n(19),a=n(146),u=n(258),c=function(){return(c=Object.assign||function(e){for(var t,n=1,r=arguments.length;n2&&void 0!==arguments[2]?arguments[2]:i,r=void 0,u=Array.isArray(e),c=[e],f=-1,l=[],d=void 0,h=void 0,p=void 0,v=[],g=[],m=e;do{var b=++f===c.length,y=b&&0!==l.length;if(b){if(h=0===g.length?void 0:v[v.length-1],d=p,p=g.pop(),y){if(u)d=d.slice();else{var w={};for(var _ in d)d.hasOwnProperty(_)&&(w[_]=d[_]);d=w}for(var S=0,E=0;E0||m(0,"line in locationOffset is 1-indexed and must be positive"),this.locationOffset.column>0||m(0,"column in locationOffset is 1-indexed and must be positive")};function _(e,t,n){return new r.a("Syntax Error: ".concat(n),void 0,e,[t])}function S(e){for(var t=e.split(/\r\n|[\n\r]/g),n=null,r=1;r0&&M(t[0]);)t.shift();for(;t.length>0&&M(t[t.length-1]);)t.pop();return t.join("\n")}function E(e){for(var t=0;t",EOF:"",BANG:"!",DOLLAR:"$",AMP:"&",PAREN_L:"(",PAREN_R:")",SPREAD:"...",COLON:":",EQUALS:"=",AT:"@",BRACKET_L:"[",BRACKET_R:"]",BRACE_L:"{",PIPE:"|",BRACE_R:"}",NAME:"Name",INT:"Int",FLOAT:"Float",STRING:"String",BLOCK_STRING:"BlockString",COMMENT:"Comment"});function x(e){var t=e.value;return t?"".concat(e.kind,' "').concat(t,'"'):e.kind}var C=String.prototype.charCodeAt,T=String.prototype.slice;function P(e,t,n,r,i,o,s){this.kind=e,this.start=t,this.end=n,this.line=r,this.column=i,this.value=s,this.prev=o,this.next=null}function N(e){return isNaN(e)?O.EOF:e<127?JSON.stringify(String.fromCharCode(e)):'"\\u'.concat(("00"+e.toString(16).toUpperCase()).slice(-4),'"')}function R(e,t){var n=e.source,r=n.body,i=r.length,o=function(e,t,n){var r=e.length,i=t;for(;i=i)return new P(O.EOF,i,i,s,a,t);var u=C.call(r,o);switch(u){case 33:return new P(O.BANG,o,o+1,s,a,t);case 35:return function(e,t,n,r,i){var o,s=e.body,a=t;do{o=C.call(s,++a)}while(null!==o&&(o>31||9===o));return new P(O.COMMENT,t,a,n,r,i,T.call(s,t+1,a))}(n,o,s,a,t);case 36:return new P(O.DOLLAR,o,o+1,s,a,t);case 38:return new P(O.AMP,o,o+1,s,a,t);case 40:return new P(O.PAREN_L,o,o+1,s,a,t);case 41:return new P(O.PAREN_R,o,o+1,s,a,t);case 46:if(46===C.call(r,o+1)&&46===C.call(r,o+2))return new P(O.SPREAD,o,o+3,s,a,t);break;case 58:return new P(O.COLON,o,o+1,s,a,t);case 61:return new P(O.EQUALS,o,o+1,s,a,t);case 64:return new P(O.AT,o,o+1,s,a,t);case 91:return new P(O.BRACKET_L,o,o+1,s,a,t);case 93:return new P(O.BRACKET_R,o,o+1,s,a,t);case 123:return new P(O.BRACE_L,o,o+1,s,a,t);case 124:return new P(O.PIPE,o,o+1,s,a,t);case 125:return new P(O.BRACE_R,o,o+1,s,a,t);case 65:case 66:case 67:case 68:case 69:case 70:case 71:case 72:case 73:case 74:case 75:case 76:case 77:case 78:case 79:case 80:case 81:case 82:case 83:case 84:case 85:case 86:case 87:case 88:case 89:case 90:case 95:case 97:case 98:case 99:case 100:case 101:case 102:case 103:case 104:case 105:case 106:case 107:case 108:case 109:case 110:case 111:case 112:case 113:case 114:case 115:case 116:case 117:case 118:case 119:case 120:case 121:case 122:return function(e,t,n,r,i){var o=e.body,s=o.length,a=t+1,u=0;for(;a!==s&&null!==(u=C.call(o,a))&&(95===u||u>=48&&u<=57||u>=65&&u<=90||u>=97&&u<=122);)++a;return new P(O.NAME,t,a,n,r,i,T.call(o,t,a))}(n,o,s,a,t);case 45:case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return function(e,t,n,r,i,o){var s=e.body,a=n,u=t,c=!1;45===a&&(a=C.call(s,++u));if(48===a){if((a=C.call(s,++u))>=48&&a<=57)throw _(e,u,"Invalid number, unexpected digit after 0: ".concat(N(a),"."))}else u=L(e,u,a),a=C.call(s,u);46===a&&(c=!0,a=C.call(s,++u),u=L(e,u,a),a=C.call(s,u));69!==a&&101!==a||(c=!0,43!==(a=C.call(s,++u))&&45!==a||(a=C.call(s,++u)),u=L(e,u,a));return new P(c?O.FLOAT:O.INT,t,u,r,i,o,T.call(s,t,u))}(n,o,u,s,a,t);case 34:return 34===C.call(r,o+1)&&34===C.call(r,o+2)?function(e,t,n,r,i){var o=e.body,s=t+3,a=s,u=0,c="";for(;s=48&&o<=57){do{o=C.call(r,++i)}while(o>=48&&o<=57);return i}throw _(e,i,"Invalid number, expected digit but got: ".concat(N(o),"."))}function j(e){return e>=48&&e<=57?e-48:e>=65&&e<=70?e-55:e>=97&&e<=102?e-87:-1}P.prototype.toJSON=P.prototype.inspect=function(){return{kind:this.kind,value:this.value,line:this.line,column:this.column}};var D=Object.freeze({NAME:"Name",DOCUMENT:"Document",OPERATION_DEFINITION:"OperationDefinition",VARIABLE_DEFINITION:"VariableDefinition",SELECTION_SET:"SelectionSet",FIELD:"Field",ARGUMENT:"Argument",FRAGMENT_SPREAD:"FragmentSpread",INLINE_FRAGMENT:"InlineFragment",FRAGMENT_DEFINITION:"FragmentDefinition",VARIABLE:"Variable",INT:"IntValue",FLOAT:"FloatValue",STRING:"StringValue",BOOLEAN:"BooleanValue",NULL:"NullValue",ENUM:"EnumValue",LIST:"ListValue",OBJECT:"ObjectValue",OBJECT_FIELD:"ObjectField",DIRECTIVE:"Directive",NAMED_TYPE:"NamedType",LIST_TYPE:"ListType",NON_NULL_TYPE:"NonNullType",SCHEMA_DEFINITION:"SchemaDefinition",OPERATION_TYPE_DEFINITION:"OperationTypeDefinition",SCALAR_TYPE_DEFINITION:"ScalarTypeDefinition",OBJECT_TYPE_DEFINITION:"ObjectTypeDefinition",FIELD_DEFINITION:"FieldDefinition",INPUT_VALUE_DEFINITION:"InputValueDefinition",INTERFACE_TYPE_DEFINITION:"InterfaceTypeDefinition",UNION_TYPE_DEFINITION:"UnionTypeDefinition",ENUM_TYPE_DEFINITION:"EnumTypeDefinition",ENUM_VALUE_DEFINITION:"EnumValueDefinition",INPUT_OBJECT_TYPE_DEFINITION:"InputObjectTypeDefinition",DIRECTIVE_DEFINITION:"DirectiveDefinition",SCHEMA_EXTENSION:"SchemaExtension",SCALAR_TYPE_EXTENSION:"ScalarTypeExtension",OBJECT_TYPE_EXTENSION:"ObjectTypeExtension",INTERFACE_TYPE_EXTENSION:"InterfaceTypeExtension",UNION_TYPE_EXTENSION:"UnionTypeExtension",ENUM_TYPE_EXTENSION:"EnumTypeExtension",INPUT_OBJECT_TYPE_EXTENSION:"InputObjectTypeExtension"}),U=Object.freeze({QUERY:"QUERY",MUTATION:"MUTATION",SUBSCRIPTION:"SUBSCRIPTION",FIELD:"FIELD",FRAGMENT_DEFINITION:"FRAGMENT_DEFINITION",FRAGMENT_SPREAD:"FRAGMENT_SPREAD",INLINE_FRAGMENT:"INLINE_FRAGMENT",VARIABLE_DEFINITION:"VARIABLE_DEFINITION",SCHEMA:"SCHEMA",SCALAR:"SCALAR",OBJECT:"OBJECT",FIELD_DEFINITION:"FIELD_DEFINITION",ARGUMENT_DEFINITION:"ARGUMENT_DEFINITION",INTERFACE:"INTERFACE",UNION:"UNION",ENUM:"ENUM",ENUM_VALUE:"ENUM_VALUE",INPUT_OBJECT:"INPUT_OBJECT",INPUT_FIELD_DEFINITION:"INPUT_FIELD_DEFINITION"});function B(e,t){var n="string"==typeof e?new w(e):e;if(!(n instanceof w))throw new TypeError("Must provide Source. Received: ".concat(g(n)));return function(e){var t=e.token;return{kind:D.DOCUMENT,definitions:Te(e,O.SOF,z,O.EOF),loc:Ee(e,t)}}(A(n,t||{}))}function F(e){var t=ke(e,O.NAME);return{kind:D.NAME,value:t.value,loc:Ee(e,t)}}function z(e){if(Ae(e,O.NAME))switch(e.token.value){case"query":case"mutation":case"subscription":case"fragment":return q(e);case"schema":case"scalar":case"type":case"interface":case"union":case"enum":case"input":case"directive":return ce(e);case"extend":return function(e){var t=e.lookahead();if(t.kind===O.NAME)switch(t.value){case"schema":return function(e){var t=e.token;Oe(e,"extend"),Oe(e,"schema");var n=oe(e,!0),r=Ae(e,O.BRACE_L)?Te(e,O.BRACE_L,de,O.BRACE_R):[];if(0===n.length&&0===r.length)throw xe(e);return{kind:D.SCHEMA_EXTENSION,directives:n,operationTypes:r,loc:Ee(e,t)}}(e);case"scalar":return function(e){var t=e.token;Oe(e,"extend"),Oe(e,"scalar");var n=F(e),r=oe(e,!0);if(0===r.length)throw xe(e);return{kind:D.SCALAR_TYPE_EXTENSION,name:n,directives:r,loc:Ee(e,t)}}(e);case"type":return function(e){var t=e.token;Oe(e,"extend"),Oe(e,"type");var n=F(e),r=he(e),i=oe(e,!0),o=pe(e);if(0===r.length&&0===i.length&&0===o.length)throw xe(e);return{kind:D.OBJECT_TYPE_EXTENSION,name:n,interfaces:r,directives:i,fields:o,loc:Ee(e,t)}}(e);case"interface":return function(e){var t=e.token;Oe(e,"extend"),Oe(e,"interface");var n=F(e),r=oe(e,!0),i=pe(e);if(0===r.length&&0===i.length)throw xe(e);return{kind:D.INTERFACE_TYPE_EXTENSION,name:n,directives:r,fields:i,loc:Ee(e,t)}}(e);case"union":return function(e){var t=e.token;Oe(e,"extend"),Oe(e,"union");var n=F(e),r=oe(e,!0),i=be(e);if(0===r.length&&0===i.length)throw xe(e);return{kind:D.UNION_TYPE_EXTENSION,name:n,directives:r,types:i,loc:Ee(e,t)}}(e);case"enum":return function(e){var t=e.token;Oe(e,"extend"),Oe(e,"enum");var n=F(e),r=oe(e,!0),i=ye(e);if(0===r.length&&0===i.length)throw xe(e);return{kind:D.ENUM_TYPE_EXTENSION,name:n,directives:r,values:i,loc:Ee(e,t)}}(e);case"input":return function(e){var t=e.token;Oe(e,"extend"),Oe(e,"input");var n=F(e),r=oe(e,!0),i=_e(e);if(0===r.length&&0===i.length)throw xe(e);return{kind:D.INPUT_OBJECT_TYPE_EXTENSION,name:n,directives:r,fields:i,loc:Ee(e,t)}}(e)}throw xe(e,t)}(e)}else{if(Ae(e,O.BRACE_L))return q(e);if(fe(e))return ce(e)}throw xe(e)}function q(e){if(Ae(e,O.NAME))switch(e.token.value){case"query":case"mutation":case"subscription":return K(e);case"fragment":return function(e){var t=e.token;if(Oe(e,"fragment"),e.options.experimentalFragmentVariables)return{kind:D.FRAGMENT_DEFINITION,name:Q(e),variableDefinitions:V(e),typeCondition:(Oe(e,"on"),ue(e)),directives:oe(e,!1),selectionSet:$(e),loc:Ee(e,t)};return{kind:D.FRAGMENT_DEFINITION,name:Q(e),typeCondition:(Oe(e,"on"),ue(e)),directives:oe(e,!1),selectionSet:$(e),loc:Ee(e,t)}}(e)}else if(Ae(e,O.BRACE_L))return K(e);throw xe(e)}function K(e){var t=e.token;if(Ae(e,O.BRACE_L))return{kind:D.OPERATION_DEFINITION,operation:"query",name:void 0,variableDefinitions:[],directives:[],selectionSet:$(e),loc:Ee(e,t)};var n,r=H(e);return Ae(e,O.NAME)&&(n=F(e)),{kind:D.OPERATION_DEFINITION,operation:r,name:n,variableDefinitions:V(e),directives:oe(e,!1),selectionSet:$(e),loc:Ee(e,t)}}function H(e){var t=ke(e,O.NAME);switch(t.value){case"query":return"query";case"mutation":return"mutation";case"subscription":return"subscription"}throw xe(e,t)}function V(e){return Ae(e,O.PAREN_L)?Te(e,O.PAREN_L,G,O.PAREN_R):[]}function G(e){var t=e.token;return e.options.experimentalVariableDefinitionDirectives?{kind:D.VARIABLE_DEFINITION,variable:W(e),type:(ke(e,O.COLON),ae(e)),defaultValue:Ie(e,O.EQUALS)?ee(e,!0):void 0,directives:oe(e,!0),loc:Ee(e,t)}:{kind:D.VARIABLE_DEFINITION,variable:W(e),type:(ke(e,O.COLON),ae(e)),defaultValue:Ie(e,O.EQUALS)?ee(e,!0):void 0,loc:Ee(e,t)}}function W(e){var t=e.token;return ke(e,O.DOLLAR),{kind:D.VARIABLE,name:F(e),loc:Ee(e,t)}}function $(e){var t=e.token;return{kind:D.SELECTION_SET,selections:Te(e,O.BRACE_L,Y,O.BRACE_R),loc:Ee(e,t)}}function Y(e){return Ae(e,O.SPREAD)?function(e){var t,n=e.token;if(ke(e,O.SPREAD),Ae(e,O.NAME)&&"on"!==e.token.value)return{kind:D.FRAGMENT_SPREAD,name:Q(e),directives:oe(e,!1),loc:Ee(e,n)};"on"===e.token.value&&(e.advance(),t=ue(e));return{kind:D.INLINE_FRAGMENT,typeCondition:t,directives:oe(e,!1),selectionSet:$(e),loc:Ee(e,n)}}(e):function(e){var t,n,r=e.token,i=F(e);Ie(e,O.COLON)?(t=i,n=F(e)):n=i;return{kind:D.FIELD,alias:t,name:n,arguments:J(e,!1),directives:oe(e,!1),selectionSet:Ae(e,O.BRACE_L)?$(e):void 0,loc:Ee(e,r)}}(e)}function J(e,t){var n=t?X:Z;return Ae(e,O.PAREN_L)?Te(e,O.PAREN_L,n,O.PAREN_R):[]}function Z(e){var t=e.token;return{kind:D.ARGUMENT,name:F(e),value:(ke(e,O.COLON),ee(e,!1)),loc:Ee(e,t)}}function X(e){var t=e.token;return{kind:D.ARGUMENT,name:F(e),value:(ke(e,O.COLON),ne(e)),loc:Ee(e,t)}}function Q(e){if("on"===e.token.value)throw xe(e);return F(e)}function ee(e,t){var n=e.token;switch(n.kind){case O.BRACKET_L:return function(e,t){var n=e.token,r=t?ne:re;return{kind:D.LIST,values:Ce(e,O.BRACKET_L,r,O.BRACKET_R),loc:Ee(e,n)}}(e,t);case O.BRACE_L:return function(e,t){var n=e.token;ke(e,O.BRACE_L);var r=[];for(;!Ie(e,O.BRACE_R);)r.push(ie(e,t));return{kind:D.OBJECT,fields:r,loc:Ee(e,n)}}(e,t);case O.INT:return e.advance(),{kind:D.INT,value:n.value,loc:Ee(e,n)};case O.FLOAT:return e.advance(),{kind:D.FLOAT,value:n.value,loc:Ee(e,n)};case O.STRING:case O.BLOCK_STRING:return te(e);case O.NAME:return"true"===n.value||"false"===n.value?(e.advance(),{kind:D.BOOLEAN,value:"true"===n.value,loc:Ee(e,n)}):"null"===n.value?(e.advance(),{kind:D.NULL,loc:Ee(e,n)}):(e.advance(),{kind:D.ENUM,value:n.value,loc:Ee(e,n)});case O.DOLLAR:if(!t)return W(e)}throw xe(e)}function te(e){var t=e.token;return e.advance(),{kind:D.STRING,value:t.value,block:t.kind===O.BLOCK_STRING,loc:Ee(e,t)}}function ne(e){return ee(e,!0)}function re(e){return ee(e,!1)}function ie(e,t){var n=e.token;return{kind:D.OBJECT_FIELD,name:F(e),value:(ke(e,O.COLON),ee(e,t)),loc:Ee(e,n)}}function oe(e,t){for(var n=[];Ae(e,O.AT);)n.push(se(e,t));return n}function se(e,t){var n=e.token;return ke(e,O.AT),{kind:D.DIRECTIVE,name:F(e),arguments:J(e,t),loc:Ee(e,n)}}function ae(e){var t,n=e.token;return Ie(e,O.BRACKET_L)?(t=ae(e),ke(e,O.BRACKET_R),t={kind:D.LIST_TYPE,type:t,loc:Ee(e,n)}):t=ue(e),Ie(e,O.BANG)?{kind:D.NON_NULL_TYPE,type:t,loc:Ee(e,n)}:t}function ue(e){var t=e.token;return{kind:D.NAMED_TYPE,name:F(e),loc:Ee(e,t)}}function ce(e){var t=fe(e)?e.lookahead():e.token;if(t.kind===O.NAME)switch(t.value){case"schema":return function(e){var t=e.token;Oe(e,"schema");var n=oe(e,!0),r=Te(e,O.BRACE_L,de,O.BRACE_R);return{kind:D.SCHEMA_DEFINITION,directives:n,operationTypes:r,loc:Ee(e,t)}}(e);case"scalar":return function(e){var t=e.token,n=le(e);Oe(e,"scalar");var r=F(e),i=oe(e,!0);return{kind:D.SCALAR_TYPE_DEFINITION,description:n,name:r,directives:i,loc:Ee(e,t)}}(e);case"type":return function(e){var t=e.token,n=le(e);Oe(e,"type");var r=F(e),i=he(e),o=oe(e,!0),s=pe(e);return{kind:D.OBJECT_TYPE_DEFINITION,description:n,name:r,interfaces:i,directives:o,fields:s,loc:Ee(e,t)}}(e);case"interface":return function(e){var t=e.token,n=le(e);Oe(e,"interface");var r=F(e),i=oe(e,!0),o=pe(e);return{kind:D.INTERFACE_TYPE_DEFINITION,description:n,name:r,directives:i,fields:o,loc:Ee(e,t)}}(e);case"union":return function(e){var t=e.token,n=le(e);Oe(e,"union");var r=F(e),i=oe(e,!0),o=be(e);return{kind:D.UNION_TYPE_DEFINITION,description:n,name:r,directives:i,types:o,loc:Ee(e,t)}}(e);case"enum":return function(e){var t=e.token,n=le(e);Oe(e,"enum");var r=F(e),i=oe(e,!0),o=ye(e);return{kind:D.ENUM_TYPE_DEFINITION,description:n,name:r,directives:i,values:o,loc:Ee(e,t)}}(e);case"input":return function(e){var t=e.token,n=le(e);Oe(e,"input");var r=F(e),i=oe(e,!0),o=_e(e);return{kind:D.INPUT_OBJECT_TYPE_DEFINITION,description:n,name:r,directives:i,fields:o,loc:Ee(e,t)}}(e);case"directive":return function(e){var t=e.token,n=le(e);Oe(e,"directive"),ke(e,O.AT);var r=F(e),i=ge(e);Oe(e,"on");var o=function(e){Ie(e,O.PIPE);var t=[];do{t.push(Se(e))}while(Ie(e,O.PIPE));return t}(e);return{kind:D.DIRECTIVE_DEFINITION,description:n,name:r,arguments:i,locations:o,loc:Ee(e,t)}}(e)}throw xe(e,t)}function fe(e){return Ae(e,O.STRING)||Ae(e,O.BLOCK_STRING)}function le(e){if(fe(e))return te(e)}function de(e){var t=e.token,n=H(e);ke(e,O.COLON);var r=ue(e);return{kind:D.OPERATION_TYPE_DEFINITION,operation:n,type:r,loc:Ee(e,t)}}function he(e){var t=[];if("implements"===e.token.value){e.advance(),Ie(e,O.AMP);do{t.push(ue(e))}while(Ie(e,O.AMP)||e.options.allowLegacySDLImplementsInterfaces&&Ae(e,O.NAME))}return t}function pe(e){return e.options.allowLegacySDLEmptyFields&&Ae(e,O.BRACE_L)&&e.lookahead().kind===O.BRACE_R?(e.advance(),e.advance(),[]):Ae(e,O.BRACE_L)?Te(e,O.BRACE_L,ve,O.BRACE_R):[]}function ve(e){var t=e.token,n=le(e),r=F(e),i=ge(e);ke(e,O.COLON);var o=ae(e),s=oe(e,!0);return{kind:D.FIELD_DEFINITION,description:n,name:r,arguments:i,type:o,directives:s,loc:Ee(e,t)}}function ge(e){return Ae(e,O.PAREN_L)?Te(e,O.PAREN_L,me,O.PAREN_R):[]}function me(e){var t=e.token,n=le(e),r=F(e);ke(e,O.COLON);var i,o=ae(e);Ie(e,O.EQUALS)&&(i=ne(e));var s=oe(e,!0);return{kind:D.INPUT_VALUE_DEFINITION,description:n,name:r,type:o,defaultValue:i,directives:s,loc:Ee(e,t)}}function be(e){var t=[];if(Ie(e,O.EQUALS)){Ie(e,O.PIPE);do{t.push(ue(e))}while(Ie(e,O.PIPE))}return t}function ye(e){return Ae(e,O.BRACE_L)?Te(e,O.BRACE_L,we,O.BRACE_R):[]}function we(e){var t=e.token,n=le(e),r=F(e),i=oe(e,!0);return{kind:D.ENUM_VALUE_DEFINITION,description:n,name:r,directives:i,loc:Ee(e,t)}}function _e(e){return Ae(e,O.BRACE_L)?Te(e,O.BRACE_L,me,O.BRACE_R):[]}function Se(e){var t=e.token,n=F(e);if(U.hasOwnProperty(n.value))return n;throw xe(e,t)}function Ee(e,t){if(!e.options.noLocation)return new Me(t,e.lastToken,e.source)}function Me(e,t,n){this.start=e.start,this.end=t.end,this.startToken=e,this.endToken=t,this.source=n}function Ae(e,t){return e.token.kind===t}function Ie(e,t){var n=e.token.kind===t;return n&&e.advance(),n}function ke(e,t){var n=e.token;if(n.kind===t)return e.advance(),n;throw _(e.source,n.start,"Expected ".concat(t,", found ").concat(x(n)))}function Oe(e,t){var n=e.token;if(n.kind===O.NAME&&n.value===t)return e.advance(),n;throw _(e.source,n.start,'Expected "'.concat(t,'", found ').concat(x(n)))}function xe(e,t){var n=t||e.token;return _(e.source,n.start,"Unexpected ".concat(x(n)))}function Ce(e,t,n,r){ke(e,t);for(var i=[];!Ie(e,r);)i.push(n(e));return i}function Te(e,t,n,r){ke(e,t);for(var i=[n(e)];!Ie(e,r);)i.push(n(e));return i}Me.prototype.toJSON=Me.prototype.inspect=function(){return{start:this.start,end:this.end}};var Pe=n(44),Ne=n(89),Re=n(5),Le=n(103),je=n(19),De=n(34),Ue=n(42),Be=n(26),Fe=n(254),ze=function(){return(ze=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},Ge=new Pe.a("GraphQLAPI"),We=function(e,t){return void 0===t&&(t={}),{query:e,variables:t}},$e=function(){function e(e){this._api=null,this.Auth=Ue.a,this.Cache=Be.a,this.Credentials=Ne.a,this._options=e,Ge.debug("API Options",this._options)}return e.prototype.getModuleName=function(){return"GraphQLAPI"},e.prototype.configure=function(e){var t=e||{},n=t.API,r=void 0===n?{}:n,i=He(t,["API"]),o=ze(ze({},i),r);return Ge.debug("configure GraphQL API",{opt:o}),o.aws_project_region&&(o=Object.assign({},o,{region:o.aws_project_region,header:{}})),void 0!==o.graphql_headers&&"function"!=typeof o.graphql_headers&&(Ge.warn("graphql_headers should be a function"),o.graphql_headers=void 0),this._options=Object.assign({},this._options,o),this.createInstance(),this._options},e.prototype.createInstance=function(){return Ge.debug("create Rest instance"),this._options?(this._api=new Fe.a(this._options),this._api.Credentials=this.Credentials,!0):Promise.reject("API not configured")},e.prototype._headerBasedAuth=function(e){return qe(this,void 0,void 0,(function(){var t,n,r,i,o,s,a,u;return Ke(this,(function(c){switch(c.label){case 0:switch(t=this._options,n=t.aws_appsync_authenticationType,r=t.aws_appsync_apiKey,i={},e||n||"AWS_IAM"){case"API_KEY":return[3,1];case"AWS_IAM":return[3,2];case"OPENID_CONNECT":return[3,4];case"AMAZON_COGNITO_USER_POOLS":return[3,9]}return[3,11];case 1:if(!r)throw new Error("No api-key configured");return i={Authorization:null,"X-Api-Key":r},[3,12];case 2:return[4,this._ensureCredentials()];case 3:if(!c.sent())throw new Error("No credentials");return[3,12];case 4:return o=void 0,[4,Be.a.getItem("federatedInfo")];case 5:return(s=c.sent())?(o=s.token,[3,8]):[3,6];case 6:return[4,Ue.a.currentAuthenticatedUser()];case 7:(a=c.sent())&&(o=a.token),c.label=8;case 8:if(!o)throw new Error("No federated jwt");return i={Authorization:o},[3,12];case 9:return[4,this.Auth.currentSession()];case 10:return u=c.sent(),i={Authorization:u.getAccessToken().getJwtToken()},[3,12];case 11:return i={Authorization:null},[3,12];case 12:return[2,i]}}))}))},e.prototype.getGraphqlOperationType=function(e){var t=B(e);return Ve(t.definitions,1)[0].operation},e.prototype.graphql=function(e,t){var n=e.query,r=e.variables,i=void 0===r?{}:r,o=e.authMode,s=B("string"==typeof n?n:u(n)),a=Ve(s.definitions.filter((function(e){return"OperationDefinition"===e.kind})),1)[0],c=(void 0===a?{}:a).operation;switch(c){case"query":case"mutation":var f=this._api.getCancellableToken(),l={cancellableToken:f},d=this._graphql({query:s,variables:i,authMode:o},t,l);return this._api.updateRequestToBeCancellable(d,f),d;case"subscription":return this._graphqlSubscribe({query:s,variables:i,authMode:o},t)}throw new Error("invalid operation type: "+c)},e.prototype._graphql=function(e,t,n){var i=e.query,o=e.variables,s=e.authMode;return void 0===t&&(t={}),void 0===n&&(n={}),qe(this,void 0,void 0,(function(){var e,a,c,f,l,d,h,p,v,g,m,b,y,w,_,S,E,M,A,I,k;return Ke(this,(function(O){switch(O.label){case 0:return this._api?[3,2]:[4,this.createInstance()];case 1:O.sent(),O.label=2;case 2:return e=this._options,a=e.aws_appsync_region,c=e.aws_appsync_graphqlEndpoint,f=e.graphql_headers,l=void 0===f?function(){return{}}:f,d=e.graphql_endpoint,h=e.graphql_endpoint_iam_region,v=[{}],(g=!d)?[4,this._headerBasedAuth(s)]:[3,4];case 3:g=O.sent(),O.label=4;case 4:return m=[ze.apply(void 0,v.concat([g]))],(b=d)?h?[4,this._headerBasedAuth(s)]:[3,6]:[3,8];case 5:return y=O.sent(),[3,7];case 6:y={Authorization:null},O.label=7;case 7:b=y,O.label=8;case 8:return w=[ze.apply(void 0,m.concat([b]))],[4,l({query:i,variables:o})];case 9:if(p=ze.apply(void 0,[ze.apply(void 0,[ze.apply(void 0,w.concat([O.sent()])),t]),!d&&(k={},k["x-amz-user-agent"]=Re.a.userAgent,k)]),_={query:u(i),variables:o},S=Object.assign({headers:p,body:_,signerServiceInfo:{service:d?"execute-api":"appsync",region:d?h:a}},n),!(E=d||c))throw{data:{},errors:[new r.a("No graphql endpoint provided.")]};O.label=10;case 10:return O.trys.push([10,12,,13]),[4,this._api.post(E,S)];case 11:return M=O.sent(),[3,13];case 12:if(A=O.sent(),this._api.isCancel(A))throw A;return M={data:{},errors:[new r.a(A.message)]},[3,13];case 13:if((I=M.errors)&&I.length)throw M;return[2,M]}}))}))},e.prototype.isCancel=function(e){return this._api.isCancel(e)},e.prototype.cancel=function(e,t){return this._api.cancel(e,t)},e.prototype._graphqlSubscribe=function(e,t){var n=e.query,r=e.variables,i=e.authMode;void 0===t&&(t={});var o=this._options,s=o.aws_appsync_region,a=o.aws_appsync_graphqlEndpoint,c=o.aws_appsync_authenticationType,f=o.aws_appsync_apiKey,l=o.graphql_headers,d=void 0===l?function(){return{}}:l,h=i||c||"AWS_IAM";if(De.b&&"function"==typeof De.b.subscribe)return De.b.subscribe("",{provider:Le.b,appSyncGraphqlEndpoint:a,authenticationType:h,apiKey:f,query:u(n),region:s,variables:r,graphql_headers:d,additionalHeaders:t});throw Ge.debug("No pubsub module applied for subscription"),new Error("No pubsub module applied for subscription")},e.prototype._ensureCredentials=function(){var e=this;return this.Credentials.get().then((function(t){if(!t)return!1;var n=e.Credentials.shear(t);return Ge.debug("set credentials for api",n),!0})).catch((function(e){return Ge.warn("ensure credentials error",e),!1}))},e}(),Ye=new $e(null);je.a.register(Ye)},function(e,t,n){"use strict";n.r(t),n.d(t,"fromUtf8",(function(){return r})),n.d(t,"toUtf8",(function(){return i}));var r=function(e){return"function"==typeof TextEncoder?function(e){return(new TextEncoder).encode(e)}(e):function(e){for(var t=[],n=0,r=e.length;n>6|192,63&i|128);else if(n+1>18|240,o>>12&63|128,o>>6&63|128,63&o|128)}else t.push(i>>12|224,i>>6&63|128,63&i|128)}return Uint8Array.from(t)}(e)},i=function(e){return"function"==typeof TextDecoder?function(e){return new TextDecoder("utf-8").decode(e)}(e):function(e){for(var t="",n=0,r=e.length;n0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0){var s=n.substring(0,i),a=n.substring(i+r.length);n=s+t[o]+a}return n},S=[0,6,77,81,73,115,100,112,3],E=[0,4,77,81,84,84,4],M=function(e,t){for(var n in this.type=e,t)t.hasOwnProperty(n)&&(this[n]=t[n])};function A(e,t){var n,r=t,f=e[t],d=f>>4,p=f&=15;t+=1;var v=0,g=1;do{if(t==e.length)return[null,r];v+=(127&(n=e[t++]))*g,g*=128}while(0!=(128&n));var m=t+v;if(m>e.length)return[null,r];var b=new M(d);switch(d){case i:1&e[t++]&&(b.sessionPresent=!0),b.returnCode=e[t++];break;case o:var y=p>>1&3,w=O(e,t),_=T(e,t+=2,w);t+=w,y>0&&(b.messageIdentifier=O(e,t),t+=2);var S=new L(e.subarray(t,m));1==(1&p)&&(S.retained=!0),8==(8&p)&&(S.duplicate=!0),S.qos=y,S.destinationName=_,b.payloadMessage=S;break;case s:case a:case u:case c:case h:b.messageIdentifier=O(e,t);break;case l:b.messageIdentifier=O(e,t),t+=2,b.returnCode=e.subarray(t,m)}return[b,m]}function I(e,t,n){return t[n++]=e>>8,t[n++]=e%256,n}function k(e,t,n,r){return C(e,n,r=I(t,n,r)),r+t}function O(e,t){return 256*e[t]+e[t+1]}function x(e){for(var t=0,n=0;n2047?(55296<=r&&r<=56319&&(n++,t++),t+=3):r>127?t+=2:t++}return t}function C(e,t,n){for(var r=n,i=0;i>6&31|192,t[r++]=63&o|128):o<=65535?(t[r++]=o>>12&15|224,t[r++]=o>>6&63|128,t[r++]=63&o|128):(t[r++]=o>>18&7|240,t[r++]=o>>12&63|128,t[r++]=o>>6&63|128,t[r++]=63&o|128)}return t}function T(e,t,n){for(var r,i="",o=t;o65535&&(r-=65536,i+=String.fromCharCode(55296+(r>>10)),r=56320+(1023&r)),i+=String.fromCharCode(r)}return i}M.prototype.encode=function(){var e,t=(15&this.type)<<4,n=0,i=[],s=0;switch(void 0!==this.messageIdentifier&&(n+=2),this.type){case r:switch(this.mqttVersion){case 3:n+=S.length+3;break;case 4:n+=E.length+3}n+=x(this.clientId)+2,void 0!==this.willMessage&&(n+=x(this.willMessage.destinationName)+2,(e=this.willMessage.payloadBytes)instanceof Uint8Array||(e=new Uint8Array(c)),n+=e.byteLength+2),void 0!==this.userName&&(n+=x(this.userName)+2),void 0!==this.password&&(n+=x(this.password)+2);break;case f:t|=2;for(var a=0;a>=7)>0&&(r|=128),t[n++]=r}while(e>0&&n<4);return t}(n),h=l.length+1,p=new ArrayBuffer(n+h),v=new Uint8Array(p);if(v[0]=t,v.set(l,1),this.type==o)h=k(this.payloadMessage.destinationName,s,v,h);else if(this.type==r){switch(this.mqttVersion){case 3:v.set(S,h),h+=S.length;break;case 4:v.set(E,h),h+=E.length}var g=0;this.cleanSession&&(g=2),void 0!==this.willMessage&&(g|=4,g|=this.willMessage.qos<<3,this.willMessage.retained&&(g|=32)),void 0!==this.userName&&(g|=128),void 0!==this.password&&(g|=64),v[h++]=g,h=I(this.keepAliveInterval,v,h)}switch(void 0!==this.messageIdentifier&&(h=I(this.messageIdentifier,v,h)),this.type){case r:h=k(this.clientId,x(this.clientId),v,h),void 0!==this.willMessage&&(h=k(this.willMessage.destinationName,x(this.willMessage.destinationName),v,h),h=I(e.byteLength,v,h),v.set(e,h),h+=e.byteLength),void 0!==this.userName&&(h=k(this.userName,x(this.userName),v,h)),void 0!==this.password&&(h=k(this.password,x(this.password),v,h));break;case o:v.set(c,h);break;case f:for(a=0;a0&&(this.timeout=setTimeout(r(this),this._keepAliveInterval))},this.cancel=function(){clearTimeout(this.timeout)}},N=function(e,t,n,r){t||(t=30),this.timeout=setTimeout(function(e,t,n){return function(){return e.apply(t,n)}}(n,e,r),1e3*t),this.cancel=function(){clearTimeout(this.timeout)}},R=function(t,r,i,o,s){if(!("WebSocket"in e)||null===e.WebSocket)throw new Error(_(y.UNSUPPORTED,["WebSocket"]));if(!("ArrayBuffer"in e)||null===e.ArrayBuffer)throw new Error(_(y.UNSUPPORTED,["ArrayBuffer"]));for(var a in this._trace("Paho.Client",t,r,i,o,s),this.host=r,this.port=i,this.path=o,this.uri=t,this.clientId=s,this._wsuri=null,this._localKey=r+":"+i+("/mqtt"!=o?":"+o:"")+":"+s+":",this._msg_queue=[],this._buffered_msg_queue=[],this._sentMessages={},this._receivedMessages={},this._notify_msg_sent={},this._message_identifier=1,this._sequence=0,n)0!==a.indexOf("Sent:"+this._localKey)&&0!==a.indexOf("Received:"+this._localKey)||this.restore(a)};R.prototype.host=null,R.prototype.port=null,R.prototype.path=null,R.prototype.uri=null,R.prototype.clientId=null,R.prototype.socket=null,R.prototype.connected=!1,R.prototype.maxMessageIdentifier=65536,R.prototype.connectOptions=null,R.prototype.hostIndex=null,R.prototype.onConnected=null,R.prototype.onConnectionLost=null,R.prototype.onMessageDelivered=null,R.prototype.onMessageArrived=null,R.prototype.traceFunction=null,R.prototype._msg_queue=null,R.prototype._buffered_msg_queue=null,R.prototype._connectTimeout=null,R.prototype.sendPinger=null,R.prototype.receivePinger=null,R.prototype._reconnectInterval=1,R.prototype._reconnecting=!1,R.prototype._reconnectTimeout=null,R.prototype.disconnectedPublishing=!1,R.prototype.disconnectedBufferSize=5e3,R.prototype.receiveBuffer=null,R.prototype._traceBuffer=null,R.prototype._MAX_TRACE_ENTRIES=100,R.prototype.connect=function(e){var t=this._traceMask(e,"password");if(this._trace("Client.connect",t,this.socket,this.connected),this.connected)throw new Error(_(y.INVALID_STATE,["already connected"]));if(this.socket)throw new Error(_(y.INVALID_STATE,["already connected"]));this._reconnecting&&(this._reconnectTimeout.cancel(),this._reconnectTimeout=null,this._reconnecting=!1),this.connectOptions=e,this._reconnectInterval=1,this._reconnecting=!1,e.uris?(this.hostIndex=0,this._doConnect(e.uris[0])):this._doConnect(this.uri)},R.prototype.subscribe=function(e,t){if(this._trace("Client.subscribe",e,t),!this.connected)throw new Error(_(y.INVALID_STATE,["not connected"]));var n=new M(f);n.topics=e.constructor===Array?e:[e],void 0===t.qos&&(t.qos=0),n.requestedQos=[];for(var r=0;r0?this._requires_ack(t):this.onMessageDelivered&&(this._notify_msg_sent[t]=this.onMessageDelivered(t.payloadMessage)),this._schedule_message(t);else{if(!this._reconnecting||!this.disconnectedPublishing)throw new Error(_(y.INVALID_STATE,["not connected"]));if(Object.keys(this._sentMessages).length+this._buffered_msg_queue.length>this.disconnectedBufferSize)throw new Error(_(y.BUFFER_FULL,[this.disconnectedBufferSize]));e.qos>0?this._requires_ack(t):(t.sequence=++this._sequence,this._buffered_msg_queue.unshift(t))}},R.prototype.disconnect=function(){if(this._trace("Client.disconnect"),this._reconnecting&&(this._reconnectTimeout.cancel(),this._reconnectTimeout=null,this._reconnecting=!1),!this.socket)throw new Error(_(y.INVALID_STATE,["not connecting or connected"]));var e=new M(g);this._notify_msg_sent[e]=b(this._disconnected,this),this._schedule_message(e)},R.prototype.getTraceLog=function(){if(null!==this._traceBuffer){for(var e in this._trace("Client.getTraceLog",new Date),this._trace("Client.getTraceLog in flight messages",this._sentMessages.length),this._sentMessages)this._trace("_sentMessages ",e,this._sentMessages[e]);for(var e in this._receivedMessages)this._trace("_receivedMessages ",e,this._receivedMessages[e]);return this._traceBuffer}},R.prototype.startTrace=function(){null===this._traceBuffer&&(this._traceBuffer=[]),this._trace("Client.startTrace",new Date,"@VERSION@-@BUILDLEVEL@")},R.prototype.stopTrace=function(){delete this._traceBuffer},R.prototype._doConnect=function(e){if(this.connectOptions.useSSL){var t=e.split(":");t[0]="wss",e=t.join(":")}this._wsuri=e,this.connected=!1,this.connectOptions.mqttVersion<4?this.socket=new WebSocket(e,["mqttv3.1"]):this.socket=new WebSocket(e,["mqtt"]),this.socket.binaryType="arraybuffer",this.socket.onopen=b(this._on_socket_open,this),this.socket.onmessage=b(this._on_socket_message,this),this.socket.onerror=b(this._on_socket_error,this),this.socket.onclose=b(this._on_socket_close,this),this.sendPinger=new P(this,this.connectOptions.keepAliveInterval),this.receivePinger=new P(this,this.connectOptions.keepAliveInterval),this._connectTimeout&&(this._connectTimeout.cancel(),this._connectTimeout=null),this._connectTimeout=new N(this,this.connectOptions.timeout,this._disconnected,[y.CONNECT_TIMEOUT.code,_(y.CONNECT_TIMEOUT)])},R.prototype._schedule_message=function(e){this._msg_queue.unshift(e),this.connected&&this._process_queue()},R.prototype.store=function(e,t){var r={type:t.type,messageIdentifier:t.messageIdentifier,version:1};switch(t.type){case o:t.pubRecReceived&&(r.pubRecReceived=!0),r.payloadMessage={};for(var i="",s=t.payloadMessage.payloadBytes,a=0;a=2;){var f=parseInt(s.substring(0,2),16);s=s.substring(2,s.length),u[c++]=f}var l=new L(u);l.qos=r.payloadMessage.qos,l.destinationName=r.payloadMessage.destinationName,r.payloadMessage.duplicate&&(l.duplicate=!0),r.payloadMessage.retained&&(l.retained=!0),i.payloadMessage=l;break;default:throw Error(_(y.INVALID_STORED_DATA,[e,t]))}0===e.indexOf("Sent:"+this._localKey)?(i.payloadMessage.duplicate=!0,this._sentMessages[i.messageIdentifier]=i):0===e.indexOf("Received:"+this._localKey)&&(this._receivedMessages[i.messageIdentifier]=i)},R.prototype._process_queue=function(){for(var e=null;e=this._msg_queue.pop();)this._socket_send(e),this._notify_msg_sent[e]&&(this._notify_msg_sent[e](),delete this._notify_msg_sent[e])},R.prototype._requires_ack=function(e){var t=Object.keys(this._sentMessages).length;if(t>this.maxMessageIdentifier)throw Error("Too many messages:"+t);for(;void 0!==this._sentMessages[this._message_identifier];)this._message_identifier++;e.messageIdentifier=this._message_identifier,this._sentMessages[e.messageIdentifier]=e,e.type===o&&this.store("Sent:",e),this._message_identifier===this.maxMessageIdentifier&&(this._message_identifier=1)},R.prototype._on_socket_open=function(){var e=new M(r,this.connectOptions);e.clientId=this.clientId,this._socket_send(e)},R.prototype._on_socket_message=function(e){this._trace("Client._on_socket_message",e.data);for(var t=this._deframeMessages(e.data),n=0;n0)for(var m=null;m=this._buffered_msg_queue.pop();)d.push(m),this.onMessageDelivered&&(this._notify_msg_sent[m]=this.onMessageDelivered(m.payloadMessage));d=d.sort((function(e,t){return e.sequence-t.sequence}));for(var b=0,S=d.length;b65535)throw new Error(_(y.INVALID_ARGUMENT,[r,"clientId"]));var f=new R(i,e,t,n,r);Object.defineProperties(this,{host:{get:function(){return e},set:function(){throw new Error(_(y.UNSUPPORTED_OPERATION))}},port:{get:function(){return t},set:function(){throw new Error(_(y.UNSUPPORTED_OPERATION))}},path:{get:function(){return n},set:function(){throw new Error(_(y.UNSUPPORTED_OPERATION))}},uri:{get:function(){return i},set:function(){throw new Error(_(y.UNSUPPORTED_OPERATION))}},clientId:{get:function(){return f.clientId},set:function(){throw new Error(_(y.UNSUPPORTED_OPERATION))}},onConnected:{get:function(){return f.onConnected},set:function(e){if("function"!=typeof e)throw new Error(_(y.INVALID_TYPE,[typeof e,"onConnected"]));f.onConnected=e}},disconnectedPublishing:{get:function(){return f.disconnectedPublishing},set:function(e){f.disconnectedPublishing=e}},disconnectedBufferSize:{get:function(){return f.disconnectedBufferSize},set:function(e){f.disconnectedBufferSize=e}},onConnectionLost:{get:function(){return f.onConnectionLost},set:function(e){if("function"!=typeof e)throw new Error(_(y.INVALID_TYPE,[typeof e,"onConnectionLost"]));f.onConnectionLost=e}},onMessageDelivered:{get:function(){return f.onMessageDelivered},set:function(e){if("function"!=typeof e)throw new Error(_(y.INVALID_TYPE,[typeof e,"onMessageDelivered"]));f.onMessageDelivered=e}},onMessageArrived:{get:function(){return f.onMessageArrived},set:function(e){if("function"!=typeof e)throw new Error(_(y.INVALID_TYPE,[typeof e,"onMessageArrived"]));f.onMessageArrived=e}},trace:{get:function(){return f.traceFunction},set:function(e){if("function"!=typeof e)throw new Error(_(y.INVALID_TYPE,[typeof e,"onTrace"]));f.traceFunction=e}}}),this.connect=function(e){if(m(e=e||{},{timeout:"number",userName:"string",password:"string",willMessage:"object",keepAliveInterval:"number",cleanSession:"boolean",useSSL:"boolean",invocationContext:"object",onSuccess:"function",onFailure:"function",hosts:"object",ports:"object",reconnect:"boolean",mqttVersion:"number",mqttVersionExplicit:"boolean",uris:"object"}),void 0===e.keepAliveInterval&&(e.keepAliveInterval=60),e.mqttVersion>4||e.mqttVersion<3)throw new Error(_(y.INVALID_ARGUMENT,[e.mqttVersion,"connectOptions.mqttVersion"]));if(void 0===e.mqttVersion?(e.mqttVersionExplicit=!1,e.mqttVersion=4):e.mqttVersionExplicit=!0,void 0!==e.password&&void 0===e.userName)throw new Error(_(y.INVALID_ARGUMENT,[e.password,"connectOptions.password"]));if(e.willMessage){if(!(e.willMessage instanceof L))throw new Error(_(y.INVALID_TYPE,[e.willMessage,"connectOptions.willMessage"]));if(e.willMessage.stringPayload=null,void 0===e.willMessage.destinationName)throw new Error(_(y.INVALID_TYPE,[typeof e.willMessage.destinationName,"connectOptions.willMessage.destinationName"]))}if(void 0===e.cleanSession&&(e.cleanSession=!0),e.hosts){if(!(e.hosts instanceof Array))throw new Error(_(y.INVALID_ARGUMENT,[e.hosts,"connectOptions.hosts"]));if(e.hosts.length<1)throw new Error(_(y.INVALID_ARGUMENT,[e.hosts,"connectOptions.hosts"]));for(var t=!1,r=0;r=3&&(i.qos=n),arguments.length>=4&&(i.retained=r),f.send(i)},this.publish=function(e,t,n,r){var i;if(0===arguments.length)throw new Error("Invalid argument.length");if(1==arguments.length){if(!(e instanceof L)&&"string"!=typeof e)throw new Error("Invalid argument:"+typeof e);if(void 0===(i=e).destinationName)throw new Error(_(y.INVALID_ARGUMENT,[i.destinationName,"Message.destinationName"]));f.send(i)}else(i=new L(t)).destinationName=e,arguments.length>=3&&(i.qos=n),arguments.length>=4&&(i.retained=r),f.send(i)},this.disconnect=function(){f.disconnect()},this.getTraceLog=function(){return f.getTraceLog()},this.startTrace=function(){f.startTrace()},this.stopTrace=function(){f.stopTrace()},this.isConnected=function(){return f.connected}},Message:L}}(void 0!==t?t:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},e.exports=n()}).call(this,n(31))},function(e,t,n){"use strict";var r,i,o=n(486);function s(e,t,n){if(e._observer)a(e._observer,t,n);else if(e._observers){var r=[];e._observers.forEach((function(e){r.push(e)})),r.forEach((function(e){a(e,t,n)}))}}function a(e,t,n){if(!e.closed)switch(t){case"next":return e.next(n);case"error":return e.error(n);case"complete":return e.complete(n)}}function u(e){return e._observer||e._observers&&e._observers.size>0}function c(e){var t=this;this._observer=null,this._observers=null,this._observable=new o((function(n){return function(e,t){!u(e)&&t&&t.start&&t.start()}(t,e),function(e,t){e._observers?e._observers.add(t):e._observer?(e._observers=new Set,e._observers.add(e._observer),e._observers.add(t),e._observer=null):e._observer=t}(t,n),function(){!function(e,t){e._observers?e._observers.delete(t):e._observer===t&&(e._observer=null)}(t,n),function(e,t){!u(e)&&t&&t.pause&&t.pause()}(t,e)}}))}r=c.prototype,i={get observable(){return this._observable},get observed(){return u(this)},next:function(e){s(this,"next",e)},error:function(e){s(this,"error",e)},complete:function(e){s(this,"complete",e)}},Object.keys(i).forEach((function(e){var t=Object.getOwnPropertyDescriptor(i,e);t.enumerable=!1,Object.defineProperty(r,e,t)})),e.exports=c},function(e,t,n){"use strict";n.d(t,"a",(function(){return Nt}));var r=n(44),i=n(33),o=n(88),s=n(19);function a(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r3?t.i-4:t.i:Array.isArray(e)?1:g(e)?2:m(e)?3:0}function d(e,t){return 2===l(e)?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function h(e,t){return 2===l(e)?e.get(t):e[t]}function p(e,t,n){var r=l(e);2===r?e.set(t,n):3===r?(e.delete(t),e.add(n)):e[t]=n}function v(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}function g(e){return G&&e instanceof Map}function m(e){return W&&e instanceof Set}function b(e){return e.o||e.t}function y(e){if(Array.isArray(e))return Array.prototype.slice.call(e);var t=Q(e);delete t[Z];for(var n=X(t),r=0;r1&&(e.set=e.add=e.clear=e.delete=_),Object.freeze(e),t&&f(e,(function(e,t){return w(t,!0)}),!0)),e}function _(){a(2)}function S(e){return null==e||"object"!=typeof e||Object.isFrozen(e)}function E(e){var t=ee[e];return t||a(18,e),t}function M(e,t){ee[e]||(ee[e]=t)}function A(){return H}function I(e,t){t&&(E("Patches"),e.u=[],e.s=[],e.v=t)}function k(e){O(e),e.p.forEach(C),e.p=null}function O(e){e===H&&(H=e.l)}function x(e){return H={p:[],l:H,h:e,m:!0,_:0}}function C(e){var t=e[Z];0===t.i||1===t.i?t.j():t.g=!0}function T(e,t){t._=t.p.length;var n=t.p[0],r=void 0!==e&&e!==n;return t.h.O||E("ES5").S(t,e,r),r?(n[Z].P&&(k(t),a(4)),c(e)&&(e=P(t,e),t.l||R(t,e)),t.u&&E("Patches").M(n[Z],e,t.u,t.s)):e=P(t,n,[]),k(t),t.u&&t.v(t.u,t.s),e!==Y?e:void 0}function P(e,t,n){if(S(t))return t;var r=t[Z];if(!r)return f(t,(function(i,o){return N(e,r,t,i,o,n)}),!0),t;if(r.A!==e)return t;if(!r.P)return R(e,r.t,!0),r.t;if(!r.I){r.I=!0,r.A._--;var i=4===r.i||5===r.i?r.o=y(r.k):r.o;f(3===r.i?new Set(i):i,(function(t,o){return N(e,r,i,t,o,n)})),R(e,i,!1),n&&e.u&&E("Patches").R(r,n,e.u,e.s)}return r.o}function N(e,t,n,r,i,o){if(u(i)){var s=P(e,i,o&&t&&3!==t.i&&!d(t.D,r)?o.concat(r):void 0);if(p(n,r,s),!u(s))return;e.m=!1}if(c(i)&&!S(i)){if(!e.h.N&&e._<1)return;P(e,i),t&&t.A.l||R(e,i)}}function R(e,t,n){void 0===n&&(n=!1),e.h.N&&e.m&&w(t,n)}function L(e,t){var n=e[Z];return(n?b(n):e)[t]}function j(e,t){if(t in e)for(var n=Object.getPrototypeOf(e);n;){var r=Object.getOwnPropertyDescriptor(n,t);if(r)return r;n=Object.getPrototypeOf(n)}}function D(e){e.P||(e.P=!0,e.l&&D(e.l))}function U(e){e.o||(e.o=y(e.t))}function B(e,t,n){var r=g(t)?E("MapSet").T(t,n):m(t)?E("MapSet").F(t,n):e.O?function(e,t){var n=Array.isArray(e),r={i:n?1:0,A:t?t.A:A(),P:!1,I:!1,D:{},l:t,t:e,k:null,o:null,j:null,C:!1},i=r,o=te;n&&(i=[r],o=ne);var s=Proxy.revocable(i,o),a=s.revoke,u=s.proxy;return r.k=u,r.j=a,u}(t,n):E("ES5").J(t,n);return(n?n.A:A()).p.push(r),r}function F(e){return u(e)||a(22,e),function e(t){if(!c(t))return t;var n,r=t[Z],i=l(t);if(r){if(!r.P&&(r.i<4||!E("ES5").K(r)))return r.t;r.I=!0,n=z(t,i),r.I=!1}else n=z(t,i);return f(n,(function(t,i){r&&h(r.t,t)===i||p(n,t,e(i))})),3===i?new Set(n):n}(e)}function z(e,t){switch(t){case 2:return new Map(e);case 3:return Array.from(e)}return y(e)}function q(){function e(t){if(!c(t))return t;if(Array.isArray(t))return t.map(e);if(g(t))return new Map(Array.from(t.entries()).map((function(t){return[t[0],e(t[1])]})));if(m(t))return new Set(Array.from(t).map(e));var n=Object.create(Object.getPrototypeOf(t));for(var r in t)n[r]=e(t[r]);return n}function t(t){return u(t)?e(t):t}var n="add";M("Patches",{$:function(t,r){return r.forEach((function(r){for(var i=r.path,o=r.op,s=t,u=0;u1?o-1:0),a=1;a1?n-1:0),o=1;o=0;n--){var r=t[n];if(0===r.path.length&&"replace"===r.op){e=r.value;break}}var i=E("Patches").$;return u(e)?i(e,t):this.produce(e,(function(e){return i(e,t.slice(n+1))}))},e}()),oe=(ie.produce,ie.produceWithPatches.bind(ie),ie.setAutoFreeze.bind(ie)),se=(ie.setUseProxies.bind(ie),ie.applyPatches.bind(ie),ie.createDraft.bind(ie),ie.finishDraft.bind(ie),n(109),n(14)),ae=n(9),ue=n(245),ce=function(){function e(){this._queue=[],this._pending=!1}return e.prototype.isLocked=function(){return this._pending},e.prototype.acquire=function(){var e=this,t=new Promise((function(t){return e._queue.push(t)}));return this._pending||this._dispatchNext(),t},e.prototype.runExclusive=function(e){return this.acquire().then((function(t){var n;try{n=e()}catch(e){throw t(),e}return Promise.resolve(n).then((function(e){return t(),e}),(function(e){throw t(),e}))}))},e.prototype._dispatchNext=function(){this._queue.length>0?(this._pending=!0,this._queue.shift()(this._dispatchNext.bind(this))):this._pending=!1},e}(),fe=n(257),le=n.n(fe),de=n(4),he=n(3),pe=function(){return Object(i.b)().isBrowser&&window.indexedDB||Object(i.c)()&&self.indexedDB?n(495).default:new(0,n(496).AsyncStorageAdapter)},ve=function(){return(ve=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},we=new r.a("DataStore"),_e=function(){function e(e,t,n,r,i,o){this.schema=e,this.namespaceResolver=t,this.getModelConstructorByModelName=n,this.modelInstanceCreator=r,this.adapter=i,this.sessionId=o,this.adapter=pe(),this.pushStream=new le.a}return e.getNamespace=function(){return{name:he.b,relationships:{},enums:{},models:{},nonModels:{}}},e.prototype.init=function(){return ge(this,void 0,void 0,(function(){var e,t;return me(this,(function(n){switch(n.label){case 0:return void 0===this.initialized?[3,2]:[4,this.initialized];case 1:return n.sent(),[2];case 2:return we.debug("Starting Storage"),this.initialized=new Promise((function(n,r){e=n,t=r})),this.adapter.setUp(this.schema,this.namespaceResolver,this.modelInstanceCreator,this.getModelConstructorByModelName,this.sessionId).then(e,t),[4,this.initialized];case 3:return n.sent(),[2]}}))}))},e.prototype.save=function(e,t,n,r){return ge(this,void 0,void 0,(function(){var i,o=this;return me(this,(function(s){switch(s.label){case 0:return[4,this.init()];case 1:return s.sent(),[4,this.adapter.save(e,t)];case 2:return(i=s.sent()).forEach((function(e){var i,s=ye(e,2),a=s[0],u=s[1];if(u===de.c.UPDATE&&r&&r.length){i={},r.map((function(e){return e.path&&e.path[0]})).forEach((function(e){i[e]=a[e]}));var c=a.id,f=a._version,l=a._lastChangedAt,d=a._deleted;i=ve(ve({},i),{id:c,_version:f,_lastChangedAt:l,_deleted:d})}var h=i||a,p=Object.getPrototypeOf(a).constructor;o.pushStream.next({model:p,opType:u,element:h,mutator:n,condition:ae.a.getPredicates(t,!1)})})),[2,i]}}))}))},e.prototype.delete=function(e,t,n){return ge(this,void 0,void 0,(function(){var r,i,o,s,a=this;return me(this,(function(u){switch(u.label){case 0:return[4,this.init()];case 1:return u.sent(),[4,this.adapter.delete(e,t)];case 2:return s=ye.apply(void 0,[u.sent(),2]),i=s[0],r=s[1],o=new Set(i.map((function(e){return e.id}))),Object(he.s)(e)||Array.isArray(r)||(r=[r]),r.forEach((function(r){var i,s=Object.getPrototypeOf(r).constructor;Object(he.s)(e)||(i=o.has(r.id)?ae.a.getPredicates(t,!1):void 0),a.pushStream.next({model:s,opType:de.c.DELETE,element:r,mutator:n,condition:i})})),[2,[i,r]]}}))}))},e.prototype.query=function(e,t,n){return ge(this,void 0,void 0,(function(){return me(this,(function(r){switch(r.label){case 0:return[4,this.init()];case 1:return r.sent(),[4,this.adapter.query(e,t,n)];case 2:return[2,r.sent()]}}))}))},e.prototype.queryOne=function(e,t){return void 0===t&&(t=de.d.FIRST),ge(this,void 0,void 0,(function(){return me(this,(function(n){switch(n.label){case 0:return[4,this.init()];case 1:return n.sent(),[4,this.adapter.queryOne(e,t)];case 2:return[2,n.sent()]}}))}))},e.prototype.observe=function(e,t,n){var r=!e,i=ae.a.getPredicates(t,!1)||{},o=i.predicates,s=i.type,a=!!o,u=this.pushStream.observable.filter((function(e){var t=e.mutator;return!n||t!==n})).map((function(e){e.mutator;return be(e,["mutator"])}));return r||(u=u.filter((function(t){var n=t.model,r=t.element;return e===n&&(!a||Object(he.y)(r,s,o))}))),u},e.prototype.clear=function(e){return void 0===e&&(e=!0),ge(this,void 0,void 0,(function(){return me(this,(function(t){switch(t.label){case 0:return this.initialized=void 0,[4,this.adapter.clear()];case 1:return t.sent(),e&&this.pushStream.complete(),[2]}}))}))},e.prototype.batchSave=function(e,t,n){return ge(this,void 0,void 0,(function(){var r,i=this;return me(this,(function(o){switch(o.label){case 0:return[4,this.init()];case 1:return o.sent(),[4,this.adapter.batchSave(e,t)];case 2:return(r=o.sent()).forEach((function(t){var r=ye(t,2),o=r[0],s=r[1];i.pushStream.next({model:e,opType:s,element:o,mutator:n,condition:void 0})})),[2,r]}}))}))},e}(),Se=function(){function e(e,t,n,r,i,o){this.mutex=new ce,this.storage=new _e(e,t,n,r,i,o)}return e.prototype.runExclusive=function(e){return this.mutex.runExclusive(e.bind(this,this.storage))},e.prototype.save=function(e,t,n,r){return ge(this,void 0,void 0,(function(){return me(this,(function(i){return[2,this.runExclusive((function(i){return i.save(e,t,n,r)}))]}))}))},e.prototype.delete=function(e,t,n){return ge(this,void 0,void 0,(function(){return me(this,(function(r){return[2,this.runExclusive((function(r){if(Object(he.s)(e)){var i=e;return r.delete(i,t,n)}var o=e;return r.delete(o,t,n)}))]}))}))},e.prototype.query=function(e,t,n){return ge(this,void 0,void 0,(function(){return me(this,(function(r){return[2,this.runExclusive((function(r){return r.query(e,t,n)}))]}))}))},e.prototype.queryOne=function(e,t){return void 0===t&&(t=de.d.FIRST),ge(this,void 0,void 0,(function(){return me(this,(function(n){return[2,this.runExclusive((function(n){return n.queryOne(e,t)}))]}))}))},e.getNamespace=function(){return _e.getNamespace()},e.prototype.observe=function(e,t,n){return this.storage.observe(e,t,n)},e.prototype.clear=function(){return ge(this,void 0,void 0,(function(){return me(this,(function(e){switch(e.label){case 0:return[4,this.storage.clear()];case 1:return e.sent(),[2]}}))}))},e.prototype.batchSave=function(e,t){return this.storage.batchSave(e,t)},e.prototype.init=function(){return ge(this,void 0,void 0,(function(){return me(this,(function(e){return[2,this.storage.init()]}))}))},e}(),Ee=n(34),Me=function(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},Ae=(new(function(){function e(){}return e.prototype.networkMonitor=function(t){if(Object(i.b)().isNode)return se.a.from([{online:!0}]);var n=Object(i.c)()?self:window;return new se.a((function(t){t.next({online:n.navigator.onLine});var r=function(){return t.next({online:!0})},i=function(){return t.next({online:!1})};return n.addEventListener("online",r),n.addEventListener("offline",i),e._observers.push(t),function(){n.removeEventListener("online",r),n.removeEventListener("offline",i),e._observers=e._observers.filter((function(e){return e!==t}))}}))},e._observerOverride=function(t){var n,r,i=function(n){if(n.closed)return e._observers=e._observers.filter((function(e){return e!==n})),"continue";n.next(t)};try{for(var o=Me(e._observers),s=o.next();!s.done;s=o.next()){i(s.value)}}catch(e){n={error:e}}finally{try{s&&!s.done&&(r=o.return)&&r.call(o)}finally{if(n)throw n.error}}},e._observers=[],e}())).networkMonitor(),Ie=function(){return(Ie=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},Te=function(){function e(e,t){this.outbox=e,this.ownSymbol=t}return e.prototype.merge=function(e,t){return Oe(this,void 0,void 0,(function(){var n,r,i,o,s;return xe(this,(function(a){switch(a.label){case 0:return[4,this.outbox.getForModel(e,t)];case 1:return r=a.sent(),i=t._deleted,0!==r.length?[3,5]:i?(n=de.c.DELETE,[4,e.delete(t,void 0,this.ownSymbol)]):[3,3];case 2:return a.sent(),[3,5];case 3:return[4,e.save(t,void 0,this.ownSymbol)];case 4:o=Ce.apply(void 0,[a.sent(),1]),s=Ce(o[0],2),n=s[1],a.label=5;case 5:return[2,n]}}))}))},e.prototype.mergePage=function(e,t,n){return Oe(this,void 0,void 0,(function(){return xe(this,(function(r){switch(r.label){case 0:return[4,e.batchSave(t,n,this.ownSymbol)];case 1:return[2,r.sent()]}}))}))},e}(),Pe=n(13),Ne=function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function s(e){try{u(r.next(e))}catch(e){o(e)}}function a(e){try{u(r.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}u((r=r.apply(e,t||[])).next())}))},Re=function(e,t){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(i=s.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},je=function(){function e(e,t,n,r){this.schema=e,this.namespaceResolver=t,this.MutationEvent=n,this.ownSymbol=r}return e.prototype.enqueue=function(e,t){return Ne(this,void 0,void 0,(function(){var n=this;return Re(this,(function(r){return e.runExclusive((function(e){return Ne(n,void 0,void 0,(function(){var n,r,i,o,s,a,u,c=this;return Re(this,(function(f){switch(f.label){case 0:return n=this.schema.namespaces[he.c].models.MutationEvent,r=ae.a.createFromExisting(n,(function(e){return e.modelId("eq",t.modelId).id("ne",c.inProgressMutationEventId)})),[4,e.query(this.MutationEvent,r)];case 1:return i=Le.apply(void 0,[f.sent(),1]),void 0!==(o=i[0])?[3,3]:[4,e.save(t,void 0,this.ownSymbol)];case 2:return f.sent(),[2];case 3:return s=t.operation,o.operation!==Pe.a.CREATE?[3,8]:s!==Pe.a.DELETE?[3,5]:[4,e.delete(this.MutationEvent,r)];case 4:return f.sent(),[3,7];case 5:return[4,e.save(this.MutationEvent.copyOf(o,(function(e){e.data=t.data})),void 0,this.ownSymbol)];case 6:f.sent(),f.label=7;case 7:return[3,12];case 8:return a=t.condition,u=JSON.parse(a),0!==Object.keys(u).length?[3,10]:[4,e.delete(this.MutationEvent,r)];case 9:f.sent(),f.label=10;case 10:return[4,e.save(t,void 0,this.ownSymbol)];case 11:f.sent(),f.label=12;case 12:return[2]}}))}))})),[2]}))}))},e.prototype.dequeue=function(e){return Ne(this,void 0,void 0,(function(){var t;return Re(this,(function(n){switch(n.label){case 0:return[4,this.peek(e)];case 1:return t=n.sent(),[4,e.delete(t)];case 2:return n.sent(),this.inProgressMutationEventId=void 0,[2,t]}}))}))},e.prototype.peek=function(e){return Ne(this,void 0,void 0,(function(){var t;return Re(this,(function(n){switch(n.label){case 0:return[4,e.queryOne(this.MutationEvent,de.d.FIRST)];case 1:return t=n.sent(),this.inProgressMutationEventId=t?t.id:void 0,[2,t]}}))}))},e.prototype.getForModel=function(e,t){return Ne(this,void 0,void 0,(function(){var n;return Re(this,(function(r){switch(r.label){case 0:return n=this.schema.namespaces[he.c].models.MutationEvent,[4,e.query(this.MutationEvent,ae.a.createFromExisting(n,(function(e){return e.modelId("eq",t.id)})))];case 1:return[2,r.sent()]}}))}))},e.prototype.getModelIds=function(e){return Ne(this,void 0,void 0,(function(){var t,n;return Re(this,(function(r){switch(r.label){case 0:return[4,e.query(this.MutationEvent)];case 1:return t=r.sent(),n=new Set,t.forEach((function(e){var t=e.modelId;return n.add(t)})),[2,n]}}))}))},e}(),De=n(52),Ue=n(514),Be=function(){return(Be=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},He=new r.a("DataStore"),Ve=function(){function e(e,t,n,r,i,o,s,a){this.schema=e,this.storage=t,this.userClasses=n,this.outbox=r,this.modelInstanceCreator=i,this.MutationEvent=o,this.conflictHandler=s,this.errorHandler=a,this.typeQuery=new WeakMap,this.processing=!1,this.generateQueries()}return e.prototype.generateQueries=function(){var e=this;Object.values(this.schema.namespaces).forEach((function(t){Object.values(t.models).filter((function(e){return e.syncable})).forEach((function(n){var r=Ke(Object(Pe.b)(t,n,"CREATE"),1)[0],i=Ke(Object(Pe.b)(t,n,"UPDATE"),1)[0],o=Ke(Object(Pe.b)(t,n,"DELETE"),1)[0];e.typeQuery.set(n,[r,i,o])}))}))},e.prototype.isReady=function(){return void 0!==this.observer},e.prototype.start=function(){var e=this;return new se.a((function(t){return e.observer=t,e.resume(),function(){e.pause()}}))},e.prototype.resume=function(){return Fe(this,void 0,void 0,(function(){var e,t,n,r,i,o,s,a,u,c,f,l,d,h,p;return ze(this,(function(v){switch(v.label){case 0:if(this.processing||!this.isReady())return[2];this.processing=!0,t=he.d,v.label=1;case 1:return(n=this.processing)?[4,this.outbox.peek(this.storage)]:[3,3];case 2:n=void 0!==(e=v.sent()),v.label=3;case 3:if(!n)return[3,12];r=e.model,i=e.operation,o=e.data,s=e.condition,a=this.userClasses[r],u=void 0,c=void 0,f=void 0,v.label=4;case 4:return v.trys.push([4,6,,7]),[4,this.jitteredRetry(t,r,i,o,s,a,this.MutationEvent,e)];case 5:return p=Ke.apply(void 0,[v.sent(),3]),u=p[0],c=p[1],f=p[2],[3,7];case 6:return"Offline"===(l=v.sent()).message||"RetryMutation"===l.message?[3,1]:[3,7];case 7:return void 0!==u?[3,9]:(He.debug("done retrying"),[4,this.outbox.dequeue(this.storage)]);case 8:return v.sent(),[3,1];case 9:return d=u.data[c],[4,this.outbox.dequeue(this.storage)];case 10:return v.sent(),[4,this.outbox.peek(this.storage)];case 11:return h=void 0!==v.sent(),this.observer.next({operation:i,modelDefinition:f,model:d,hasMore:h}),[3,1];case 12:return this.pause(),[2]}}))}))},e.prototype.jitteredRetry=function(e,t,n,r,i,o,s,a){return Fe(this,void 0,void 0,(function(){var u=this;return ze(this,(function(c){switch(c.label){case 0:return[4,Object(Ue.b)((function(t,n,r,i,o,s,a){return Fe(u,void 0,void 0,(function(){var u,c,f,l,d,h,p,v,g,m,b,y,w,_,S,E,M,A,I,k,O;return ze(this,(function(x){switch(x.label){case 0:u=Ke(this.createQueryVariables(e,t,n,r,i),5),c=u[0],f=u[1],l=u[2],d=u[3],h=u[4],p={query:c,variables:f},v=0,g=this.opTypeFromTransformerOperation(n),x.label=1;case 1:return x.trys.push([1,3,,13]),[4,De.a.graphql(p)];case 2:return[2,[x.sent(),d,h]];case 3:if(!((m=x.sent()).errors&&m.errors.length>0))return[3,12];if(b=Ke(m.errors,1),"Network Error"===(y=b[0]).message){if(!this.processing)throw new Ue.a("Offline");throw new Error("Network Error")}return"ConflictUnhandled"!==y.errorType?[3,11]:(v++,w=void 0,v>10?(w=de.a,[3,7]):[3,4]);case 4:return x.trys.push([4,6,,7]),[4,this.conflictHandler({modelConstructor:o,localModel:this.modelInstanceCreator(o,f.input),remoteModel:this.modelInstanceCreator(o,y.data),operation:g,attempts:v})];case 5:return w=x.sent(),[3,7];case 6:return _=x.sent(),He.warn("conflict trycatch",_),[3,13];case 7:return w!==de.a?[3,9]:(S=Ke(Object(Pe.b)(this.schema.namespaces[e],h,"GET"),1),E=Ke(S[0],3),M=E[1],A=E[2],[4,De.a.graphql({query:A,variables:{id:f.input.id}})]);case 8:return[2,[x.sent(),M,h]];case 9:return I=this.schema.namespaces[e],k=Object(Pe.d)(I.relationships,h,g,o,w,l,s,this.modelInstanceCreator,a.id),[4,this.storage.save(k)];case 10:throw x.sent(),new Ue.a("RetryMutation");case 11:try{this.errorHandler({localModel:this.modelInstanceCreator(o,f.input),message:y.message,operation:n,errorType:y.errorType,errorInfo:y.errorInfo,remoteModel:y.data?this.modelInstanceCreator(o,y.data):null})}catch(e){He.warn("failed to execute errorHandler",e)}finally{return[2,y.data?[{data:(O={},O[d]=y.data,O)},d,h]:[]]}x.label=12;case 12:return[3,13];case 13:if(p)return[3,1];x.label=14;case 14:return[2]}}))}))}),[t,n,r,i,o,s,a])];case 1:return[2,c.sent()]}}))}))},e.prototype.createQueryVariables=function(e,t,n,r,i){var o=this.schema.namespaces[e].models[t],s=this.typeQuery.get(o),a=Ke(s.find((function(e){return Ke(e,1)[0]===n})),3),u=a[1],c=a[2],f=JSON.parse(r),l=f._version,d=qe(f,["_version"]),h=n===Pe.a.DELETE?{id:d.id}:Object.values(o.fields).filter((function(e){var t=e.name,r=e.type,i=e.association;return Object(de.h)(r)?!(!Object(de.m)(i)||"BELONGS_TO"!==i.connectionType):n!==Pe.a.UPDATE||d.hasOwnProperty(t)})).map((function(e){var t=e.name,n=e.type,r=e.association,i=t,o=d[t];return Object(de.h)(n)&&Object(de.m)(r)&&(i=r.targetName,o=d[i]),[i,o]})).reduce((function(e,t){var n=Ke(t,2),r=n[0],i=n[1];return e[r]=i,e}),{}),p=Be(Be({},h),{_version:l}),v=JSON.parse(i);return[c,Be({input:p},n===Pe.a.CREATE?{}:{condition:Object.keys(v).length>0?v:null}),v,u,o]},e.prototype.opTypeFromTransformerOperation=function(e){switch(e){case Pe.a.CREATE:return de.c.INSERT;case Pe.a.DELETE:return de.c.DELETE;case Pe.a.UPDATE:return de.c.UPDATE;case Pe.a.GET:break;default:Object(he.f)(e)}},e.prototype.pause=function(){this.processing=!1},e}(),Ge=n(154),We=function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function s(e){try{u(r.next(e))}catch(e){o(e)}}function a(e){try{u(r.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}u((r=r.apply(e,t||[])).next())}))},$e=function(e,t){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(i=s.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},Je=function(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},Ze=new r.a("DataStore"),Xe=function(){function e(e,t,n,r){void 0===t&&(t=1e4),void 0===n&&(n=1e3),this.schema=e,this.maxRecordsToSync=t,this.syncPageSize=n,this.syncPredicates=r,this.typeQuery=new WeakMap,this.generateQueries()}return e.prototype.generateQueries=function(){var e=this;Object.values(this.schema.namespaces).forEach((function(t){Object.values(t.models).filter((function(e){return e.syncable})).forEach((function(n){var r=Ye(Object(Pe.b)(t,n,"LIST"),1),i=Ye(r[0]).slice(1);e.typeQuery.set(n,i)}))}))},e.prototype.graphqlFilterFromPredicate=function(e){if(!this.syncPredicates)return null;var t=ae.a.getPredicates(this.syncPredicates.get(e),!1);return t?Object(Pe.h)(t):null},e.prototype.retrievePage=function(e,t,n,r,i){return void 0===r&&(r=null),We(this,void 0,void 0,(function(){var o,s,a,u,c,f,l,d,h;return $e(this,(function(p){switch(p.label){case 0:return o=Ye(this.typeQuery.get(e),2),s=o[0],a=o[1],u={limit:r,nextToken:n,lastSync:t,filter:i},[4,this.jitteredRetry(a,u,s)];case 1:return c=p.sent().data,f=c[s],l=f.items,d=f.nextToken,h=f.startedAt,[2,{nextToken:d,startedAt:h,items:l}]}}))}))},e.prototype.jitteredRetry=function(e,t,n){return We(this,void 0,void 0,(function(){var r=this;return $e(this,(function(i){switch(i.label){case 0:return[4,Object(Ue.b)((function(e,t){return We(r,void 0,void 0,(function(){var r,i;return $e(this,(function(o){switch(o.label){case 0:return o.trys.push([0,2,,3]),[4,De.a.graphql({query:e,variables:t})];case 1:return[2,o.sent()];case 2:if(r=o.sent(),r.errors.some((function(e){return"Unauthorized"===e.errorType})))return(i=r).data[n].items=i.data[n].items.filter((function(e){return null!==e})),Ze.warn("queryError","User is unauthorized, some items could not be returned."),[2,i];throw r;case 3:return[2]}}))}))}),[e,t])];case 1:return[2,i.sent()]}}))}))},e.prototype.start=function(e){var t=this,n=!0,r=void 0!==this.maxRecordsToSync?this.maxRecordsToSync:1e4,i=void 0!==this.syncPageSize?this.syncPageSize:1e3,o=new Map;return new se.a((function(s){var a=Object.values(t.schema.namespaces).reduce((function(t,n){var r,i;try{for(var o=Je(Array.from(n.modelTopologicalOrdering.keys())),s=o.next();!s.done;s=o.next()){var a=s.value,u=e.get(n.models[a]);t.set(n.models[a],u)}}catch(e){r={error:e}}finally{try{s&&!s.done&&(i=o.return)&&i.call(o)}finally{if(r)throw r.error}}return t}),new Map),u=Array.from(a.entries()).filter((function(e){return Ye(e,1)[0].syncable})).map((function(e){var a=Ye(e,2),u=a[0],c=Ye(a[1],2),f=c[0],l=c[1];return We(t,void 0,void 0,(function(){var e,t,a,c,d,h,p,v,g,m=this;return $e(this,(function(b){switch(b.label){case 0:return e=!1,t=null,a=null,c=null,d=0,h=this.graphqlFilterFromPredicate(u),p=this.schema.namespaces[f].modelTopologicalOrdering.get(u.name),v=p.map((function(e){return o.get(f+"_"+e)})),g=new Promise((function(o){return We(m,void 0,void 0,(function(){var p,g;return $e(this,(function(m){switch(m.label){case 0:return[4,Promise.all(v)];case 1:m.sent(),m.label=2;case 2:return n?(p=Math.min(r-d,i),[4,this.retrievePage(u,l,t,p,h)]):[2];case 3:g=m.sent(),c=g.items,t=g.nextToken,a=g.startedAt,d+=c.length,e=null===t||d>=r,s.next({namespace:f,modelDefinition:u,items:c,done:e,startedAt:a,isFullSync:!l}),m.label=4;case 4:if(!e)return[3,2];m.label=5;case 5:return o(),[2]}}))}))})),o.set(f+"_"+u.name,g),[4,g];case 1:return b.sent(),[2]}}))}))}));return Promise.all(u).then((function(){s.complete()})),function(){n=!1}}))},e}(),Qe=function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function s(e){try{u(r.next(e))}catch(e){o(e)}}function a(e){try{u(r.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}u((r=r.apply(e,t||[])).next())}))},et=function(e,t){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(i=s.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},nt=function(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},rt=function(){for(var e=[],t=0;t0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s};oe(!0),q();var ht,pt,vt,gt,mt,bt=new r.a("DataStore"),yt=(Object(he.v)(Date.now()),i.a.browserOrNode().isNode),wt=new WeakMap,_t=new WeakMap,St=function(e){var t=wt.get(e);return ht.namespaces[t].models[e.name]},Et=function(e){return Object(he.s)(e)&&wt.has(e)},Mt=function(e){return wt.get(e)},At=new WeakSet;function It(e,t){return At.add(t),new e(t)}var kt;function Ot(e){return"string"==typeof e}function xt(e){var t=e.localModel,n=e.modelConstructor,r=e.remoteModel._version;return It(n,ut(ut({},t),{_version:r}))}function Ct(e){bt.warn(e)}function Tt(e,t){var n;switch(e){case he.a:n=pt[t];break;case he.d:n=vt[t];break;case he.c:n=gt[t];break;case he.b:n=mt[t];break;default:Object(he.f)(e)}if(Et(n))return n;var r="Model name is not valid for namespace. modelName: "+t+", namespace: "+e;throw bt.error(r),new Error(r)}function Pt(e,t){return ct(this,void 0,void 0,(function(){var n,r,i=this;return ft(this,(function(o){switch(o.label){case 0:return n=pt.Setting,r=ht.namespaces[he.a].models.Setting,[4,e.runExclusive((function(e){return ct(i,void 0,void 0,(function(){var i,o;return ft(this,(function(s){switch(s.label){case 0:return[4,e.query(n,ae.a.createFromExisting(r,(function(e){return e.key("eq","schemaVersion")})),{page:0,limit:1})];case 1:return i=dt.apply(void 0,[s.sent(),1]),void 0===(o=i[0])||void 0===o.value?[3,4]:JSON.parse(o.value)===t?[3,3]:[4,e.clear(!1)];case 2:s.sent(),s.label=3;case 3:return[3,6];case 4:return[4,e.save(It(n,{key:"schemaVersion",value:JSON.stringify(t)}))];case 5:s.sent(),s.label=6;case 6:return[2]}}))}))}))];case 1:return o.sent(),[2]}}))}))}var Nt=new(function(){function e(){var e=this;this.amplifyConfig={},this.syncPredicates=new WeakMap,this.start=function(){return ct(e,void 0,void 0,(function(){var e,t,n,r=this;return ft(this,(function(i){switch(i.label){case 0:return void 0!==this.initialized?[3,1]:(bt.debug("Starting DataStore"),this.initialized=new Promise((function(e,t){r.initResolve=e,r.initReject=t})),[3,3]);case 1:return[4,this.initialized];case 2:return i.sent(),[2];case 3:return this.storage=new Se(ht,Mt,Tt,It,void 0,this.sessionId),[4,this.storage.init()];case 4:return i.sent(),[4,Pt(this.storage,ht.version)];case 5:return i.sent(),(e=this.amplifyConfig.aws_appsync_graphqlEndpoint)?(bt.debug("GraphQL endpoint available",e),t=this,[4,this.processSyncExpressions()]):[3,7];case 6:return t.syncPredicates=i.sent(),this.sync=new at(ht,Mt,gt,vt,this.storage,It,this.maxRecordsToSync,this.syncPageSize,this.conflictHandler,this.errorHandler,this.syncPredicates,this.amplifyConfig),n=1e3*this.fullSyncInterval*60,kt=this.sync.start({fullSyncInterval:n}).subscribe({next:function(e){var t=e.type,n=e.data;t===(yt?re.SYNC_ENGINE_SYNC_QUERIES_READY:re.SYNC_ENGINE_STORAGE_SUBSCRIBED)&&r.initResolve(),o.a.dispatch("datastore",{event:t,data:n})},error:function(e){bt.warn("Sync error",e),r.initReject()}}),[3,8];case 7:bt.warn("Data won't be synchronized. No GraphQL endpoint configured. Did you forget `Amplify.configure(awsconfig)`?",{config:this.amplifyConfig}),this.initResolve(),i.label=8;case 8:return[4,this.initialized];case 9:return i.sent(),[2]}}))}))},this.query=function(t,n,r){return ct(e,void 0,void 0,(function(){var e,i,o,s,a;return ft(this,(function(u){switch(u.label){case 0:return[4,this.start()];case 1:if(u.sent(),!Et(t))throw e="Constructor is not for a valid model",bt.error(e,{modelConstructor:t}),new Error(e);return"string"==typeof n&&void 0!==r&&bt.warn("Pagination is ignored when querying by id"),i=St(t),o=Ot(n)?ae.a.createForId(i,n):Object(ae.c)(n)?void 0:ae.a.createFromExisting(i,n),s=this.processPagination(i,r),bt.debug("params ready",{modelConstructor:t,predicate:ae.a.getPredicates(o,!1),pagination:ut(ut({},s),{sort:ue.a.getPredicates(s.sort,!1)})}),[4,this.storage.query(t,o,s)];case 2:return a=u.sent(),[2,Ot(n)?a[0]:a]}}))}))},this.save=function(t,n){return ct(e,void 0,void 0,(function(){var e,r,i,o,s,a,u=this;return ft(this,(function(c){switch(c.label){case 0:return[4,this.start()];case 1:if(c.sent(),e=_t.get(t),r=t?t.constructor:void 0,!Et(r))throw i="Object is not an instance of a valid model",bt.error(i,{model:t}),new Error(i);return o=St(r),s=ae.a.createFromExisting(o,n),[4,this.storage.runExclusive((function(n){return ct(u,void 0,void 0,(function(){return ft(this,(function(i){switch(i.label){case 0:return[4,n.save(t,s,void 0,e)];case 1:return i.sent(),[2,n.query(r,ae.a.createForId(o,t.id))]}}))}))}))];case 2:return a=dt.apply(void 0,[c.sent(),1]),[2,a[0]]}}))}))},this.setConflictHandler=function(t){var n=t.DataStore;return n?n.conflictHandler:e.conflictHandler===xt&&t.conflictHandler?t.conflictHandler:e.conflictHandler||xt},this.setErrorHandler=function(t){var n=t.DataStore;return n?n.errorHandler:e.errorHandler===Ct&&t.errorHandler?t.errorHandler:e.errorHandler||Ct},this.delete=function(t,n){return ct(e,void 0,void 0,(function(){var e,r,i,o,s,a,u,c,f;return ft(this,(function(l){switch(l.label){case 0:return[4,this.start()];case 1:if(l.sent(),!t)throw u="Model or Model Constructor required",bt.error(u,{modelOrConstructor:t}),new Error(u);if(!Et(t))return[3,3];if(o=t,!n)throw u="Id to delete or criteria required. Do you want to delete all? Pass Predicates.ALL",bt.error(u,{idOrCriteria:n}),new Error(u);if("string"==typeof n)e=ae.a.createForId(St(o),n);else if(!(e=ae.a.createFromExisting(St(o),n))||!ae.a.isValidPredicate(e))throw u="Criteria required. Do you want to delete all? Pass Predicates.ALL",bt.error(u,{condition:e}),new Error(u);return[4,this.storage.delete(o,e)];case 2:return r=dt.apply(void 0,[l.sent(),1]),[2,r[0]];case 3:if(i=t,o=Object.getPrototypeOf(i||{}).constructor,!Et(o))throw u="Object is not an instance of a valid model",bt.error(u,{model:i}),new Error(u);if(s=St(o),a=ae.a.createForId(s,i.id),n){if("function"!=typeof n)throw u="Invalid criteria",bt.error(u,{idOrCriteria:n}),new Error(u);e=n(a)}else e=a;return[4,this.storage.delete(i,e)];case 4:return c=dt.apply(void 0,[l.sent(),1]),f=dt(c[0],1),[2,f[0]]}}))}))},this.observe=function(t,n){var r,i=t&&Et(t)?t:void 0;if(t&&void 0===i){var o=t,s=o&&Object.getPrototypeOf(o).constructor;if(Et(s))return n&&bt.warn("idOrCriteria is ignored when using a model instance",{model:o,idOrCriteria:n}),e.observe(s,o.id);var a="The model is not an instance of a PersistentModelConstructor";throw bt.error(a,{model:o}),new Error(a)}if(void 0!==n&&void 0===i){a="Cannot provide criteria without a modelConstructor";throw bt.error(a,n),new Error(a)}if(i&&!Et(i)){a="Constructor is not for a valid model";throw bt.error(a,{modelConstructor:i}),new Error(a)}return r="string"==typeof n?ae.a.createForId(St(i),n):i&&ae.a.createFromExisting(St(i),n),new se.a((function(t){var n;return ct(e,void 0,void 0,(function(){return ft(this,(function(e){switch(e.label){case 0:return[4,this.start()];case 1:return e.sent(),n=this.storage.observe(i,r).filter((function(e){var t=e.model;return Mt(t)===he.d})).subscribe(t),[2]}}))})),function(){n&&n.unsubscribe()}}))},this.configure=function(t){void 0===t&&(t={});var n=t.DataStore,r=(t.conflictHandler,t.errorHandler,t.maxRecordsToSync),i=t.syncPageSize,o=t.fullSyncInterval,s=t.syncExpressions,a=lt(t,["DataStore","conflictHandler","errorHandler","maxRecordsToSync","syncPageSize","fullSyncInterval","syncExpressions"]);e.amplifyConfig=ut(ut({},a),e.amplifyConfig),e.conflictHandler=e.setConflictHandler(t),e.errorHandler=e.setErrorHandler(t),e.syncExpressions=n&&n.syncExpressions||e.syncExpressions||s,e.maxRecordsToSync=n&&n.maxRecordsToSync||e.maxRecordsToSync||r,e.syncPageSize=n&&n.syncPageSize||e.syncPageSize||i,e.fullSyncInterval=n&&n.fullSyncInterval||e.fullSyncInterval||o||1440,e.sessionId=e.retrieveSessionId()},this.clear=function(){return ct(this,void 0,void 0,(function(){return ft(this,(function(e){switch(e.label){case 0:return void 0===this.storage?[2]:(kt&&!kt.closed&&kt.unsubscribe(),[4,this.storage.clear()]);case 1:return e.sent(),this.sync&&this.sync.unsubscribeConnectivity(),this.initialized=void 0,this.storage=void 0,this.sync=void 0,this.syncPredicates=new WeakMap,[2]}}))}))},this.stop=function(){return ct(this,void 0,void 0,(function(){return ft(this,(function(e){switch(e.label){case 0:return void 0===this.initialized?[3,2]:[4,this.start()];case 1:e.sent(),e.label=2;case 2:return kt&&!kt.closed&&kt.unsubscribe(),this.sync&&this.sync.unsubscribeConnectivity(),this.initialized=void 0,this.sync=void 0,[2]}}))}))}}return e.prototype.getModuleName=function(){return"DataStore"},e.prototype.processPagination=function(e,t){var n,r=t||{},i=r.limit,o=r.page,s=r.sort;if(void 0!==o&&void 0===i)throw new Error("Limit is required when requesting a page");if(void 0!==o){if("number"!=typeof o)throw new Error("Page should be a number");if(o<0)throw new Error("Page can't be negative")}if(void 0!==i){if("number"!=typeof i)throw new Error("Limit should be a number");if(i<0)throw new Error("Limit can't be negative")}return s&&(n=ue.a.createFromExisting(e,t.sort)),{limit:i,page:o,sort:n}},e.prototype.processSyncExpressions=function(){return ct(this,void 0,void 0,(function(){var e,t=this;return ft(this,(function(n){switch(n.label){case 0:return this.syncExpressions&&this.syncExpressions.length?[4,Promise.all(this.syncExpressions.map((function(e){return ct(t,void 0,void 0,(function(){var t,n,r,i,o,s;return ft(this,(function(a){switch(a.label){case 0:return[4,e];case 1:return t=a.sent(),n=t.modelConstructor,r=t.conditionProducer,i=St(n),[4,this.unwrapPromise(r)];case 2:return o=a.sent(),Object(ae.c)(o)?[2,[i,null]]:(s=this.createFromCondition(i,o),[2,[i,s]])}}))}))})))]:[2,new WeakMap];case 1:return e=n.sent(),[2,this.weakMapFromEntries(e)]}}))}))},e.prototype.createFromCondition=function(e,t){try{return ae.a.createFromExisting(e,t)}catch(e){throw bt.error("Error creating Sync Predicate"),e}},e.prototype.unwrapPromise=function(e){return ct(this,void 0,void 0,(function(){var t;return ft(this,(function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,e()];case 1:return[2,n.sent()];case 2:if((t=n.sent())instanceof TypeError)return[2,e];throw t;case 3:return[2]}}))}))},e.prototype.weakMapFromEntries=function(e){return e.reduce((function(e,t){var n=dt(t,2),r=n[0],i=n[1];if(e.has(r)){var o=r.name;return bt.warn("You can only utilize one Sync Expression per model.\n Subsequent sync expressions for the "+o+" model will be ignored."),e}return i&&e.set(r,i),e}),new WeakMap)},e.prototype.retrieveSessionId=function(){try{var e=sessionStorage.getItem("datastoreSessionId");if(e){var t=this.amplifyConfig.aws_appsync_graphqlEndpoint.split("/")[2];return e+"-"+dt(t.split("."),1)[0]}}catch(e){return}},e}());s.a.register(Nt)},,,,,,,,,,,function(e,t,n){"use strict";t.byteLength=function(e){var t=c(e),n=t[0],r=t[1];return 3*(n+r)/4-r},t.toByteArray=function(e){var t,n,r=c(e),s=r[0],a=r[1],u=new o(function(e,t,n){return 3*(t+n)/4-n}(0,s,a)),f=0,l=a>0?s-4:s;for(n=0;n>16&255,u[f++]=t>>8&255,u[f++]=255&t;2===a&&(t=i[e.charCodeAt(n)]<<2|i[e.charCodeAt(n+1)]>>4,u[f++]=255&t);1===a&&(t=i[e.charCodeAt(n)]<<10|i[e.charCodeAt(n+1)]<<4|i[e.charCodeAt(n+2)]>>2,u[f++]=t>>8&255,u[f++]=255&t);return u},t.fromByteArray=function(e){for(var t,n=e.length,i=n%3,o=[],s=0,a=n-i;sa?a:s+16383));1===i?(t=e[n-1],o.push(r[t>>2]+r[t<<4&63]+"==")):2===i&&(t=(e[n-2]<<8)+e[n-1],o.push(r[t>>10]+r[t>>4&63]+r[t<<2&63]+"="));return o.join("")};for(var r=[],i=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",a=0,u=s.length;a0)throw new Error("Invalid string. Length must be a multiple of 4");var n=e.indexOf("=");return-1===n&&(n=t),[n,n===t?0:4-n%4]}function f(e,t,n){for(var i,o,s=[],a=t;a>18&63]+r[o>>12&63]+r[o>>6&63]+r[63&o]);return s.join("")}i["-".charCodeAt(0)]=62,i["_".charCodeAt(0)]=63},function(e,t){ -/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */ -t.read=function(e,t,n,r,i){var o,s,a=8*i-r-1,u=(1<>1,f=-7,l=n?i-1:0,d=n?-1:1,h=e[t+l];for(l+=d,o=h&(1<<-f)-1,h>>=-f,f+=a;f>0;o=256*o+e[t+l],l+=d,f-=8);for(s=o&(1<<-f)-1,o>>=-f,f+=r;f>0;s=256*s+e[t+l],l+=d,f-=8);if(0===o)o=1-c;else{if(o===u)return s?NaN:1/0*(h?-1:1);s+=Math.pow(2,r),o-=c}return(h?-1:1)*s*Math.pow(2,o-r)},t.write=function(e,t,n,r,i,o){var s,a,u,c=8*o-i-1,f=(1<>1,d=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:o-1,p=r?1:-1,v=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,s=f):(s=Math.floor(Math.log(t)/Math.LN2),t*(u=Math.pow(2,-s))<1&&(s--,u*=2),(t+=s+l>=1?d/u:d*Math.pow(2,1-l))*u>=2&&(s++,u/=2),s+l>=f?(a=0,s=f):s+l>=1?(a=(t*u-1)*Math.pow(2,i),s+=l):(a=t*Math.pow(2,l-1)*Math.pow(2,i),s=0));i>=8;e[n+h]=255&a,h+=p,a/=256,i-=8);for(s=s<0;e[n+h]=255&s,h+=p,s/=256,c-=8);e[n+h-p]|=128*v}},function(e,t,n){var r,i,o,s;e.exports=(r=n(32),o=(i=r).lib.Base,s=i.enc.Utf8,void(i.algo.HMAC=o.extend({init:function(e,t){e=this._hasher=new e.init,"string"==typeof t&&(t=s.parse(t));var n=e.blockSize,r=4*n;t.sigBytes>r&&(t=e.finalize(t)),t.clamp();for(var i=this._oKey=t.clone(),o=this._iKey=t.clone(),a=i.words,u=o.words,c=0;c0?this.tail.next=t:this.head=t,this.tail=t,++this.length}},{key:"unshift",value:function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length}},{key:"shift",value:function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(e){if(0===this.length)return"";for(var t=this.head,n=""+t.data;t=t.next;)n+=e+t.data;return n}},{key:"concat",value:function(e){if(0===this.length)return s.alloc(0);for(var t,n,r,i=s.allocUnsafe(e>>>0),o=this.head,a=0;o;)t=o.data,n=i,r=a,s.prototype.copy.call(t,n,r),a+=o.data.length,o=o.next;return i}},{key:"consume",value:function(e,t){var n;return ei.length?i.length:e;if(o===i.length?r+=i:r+=i.slice(0,e),0==(e-=o)){o===i.length?(++n,t.next?this.head=t.next:this.head=this.tail=null):(this.head=t,t.data=i.slice(o));break}++n}return this.length-=n,r}},{key:"_getBuffer",value:function(e){var t=s.allocUnsafe(e),n=this.head,r=1;for(n.data.copy(t),e-=n.data.length;n=n.next;){var i=n.data,o=e>i.length?i.length:e;if(i.copy(t,t.length-e,0,o),0==(e-=o)){o===i.length?(++r,n.next?this.head=n.next:this.head=this.tail=null):(this.head=n,n.data=i.slice(o));break}++r}return this.length-=r,t}},{key:u,value:function(e,t){return a(this,function(e){for(var t=1;t0,(function(e){r||(r=e),e&&s.forEach(c),o||(s.forEach(c),i(r))}))}));return t.reduce(f)}},function(e,t,n){var r=n(7),i=n(69),o=n(8).Buffer,s=[1518500249,1859775393,-1894007588,-899497514],a=new Array(80);function u(){this.init(),this._w=a,i.call(this,64,56)}function c(e){return e<<30|e>>>2}function f(e,t,n,r){return 0===e?t&n|~t&r:2===e?t&n|t&r|n&r:t^n^r}r(u,i),u.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},u.prototype._update=function(e){for(var t,n=this._w,r=0|this._a,i=0|this._b,o=0|this._c,a=0|this._d,u=0|this._e,l=0;l<16;++l)n[l]=e.readInt32BE(4*l);for(;l<80;++l)n[l]=n[l-3]^n[l-8]^n[l-14]^n[l-16];for(var d=0;d<80;++d){var h=~~(d/20),p=0|((t=r)<<5|t>>>27)+f(h,i,o,a)+u+n[d]+s[h];u=a,a=o,o=c(i),i=r,r=p}this._a=r+this._a|0,this._b=i+this._b|0,this._c=o+this._c|0,this._d=a+this._d|0,this._e=u+this._e|0},u.prototype._hash=function(){var e=o.allocUnsafe(20);return e.writeInt32BE(0|this._a,0),e.writeInt32BE(0|this._b,4),e.writeInt32BE(0|this._c,8),e.writeInt32BE(0|this._d,12),e.writeInt32BE(0|this._e,16),e},e.exports=u},function(e,t,n){var r=n(7),i=n(69),o=n(8).Buffer,s=[1518500249,1859775393,-1894007588,-899497514],a=new Array(80);function u(){this.init(),this._w=a,i.call(this,64,56)}function c(e){return e<<5|e>>>27}function f(e){return e<<30|e>>>2}function l(e,t,n,r){return 0===e?t&n|~t&r:2===e?t&n|t&r|n&r:t^n^r}r(u,i),u.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},u.prototype._update=function(e){for(var t,n=this._w,r=0|this._a,i=0|this._b,o=0|this._c,a=0|this._d,u=0|this._e,d=0;d<16;++d)n[d]=e.readInt32BE(4*d);for(;d<80;++d)n[d]=(t=n[d-3]^n[d-8]^n[d-14]^n[d-16])<<1|t>>>31;for(var h=0;h<80;++h){var p=~~(h/20),v=c(r)+l(p,i,o,a)+u+n[h]+s[p]|0;u=a,a=o,o=f(i),i=r,r=v}this._a=r+this._a|0,this._b=i+this._b|0,this._c=o+this._c|0,this._d=a+this._d|0,this._e=u+this._e|0},u.prototype._hash=function(){var e=o.allocUnsafe(20);return e.writeInt32BE(0|this._a,0),e.writeInt32BE(0|this._b,4),e.writeInt32BE(0|this._c,8),e.writeInt32BE(0|this._d,12),e.writeInt32BE(0|this._e,16),e},e.exports=u},function(e,t,n){var r=n(7),i=n(169),o=n(69),s=n(8).Buffer,a=new Array(64);function u(){this.init(),this._w=a,o.call(this,64,56)}r(u,i),u.prototype.init=function(){return this._a=3238371032,this._b=914150663,this._c=812702999,this._d=4144912697,this._e=4290775857,this._f=1750603025,this._g=1694076839,this._h=3204075428,this},u.prototype._hash=function(){var e=s.allocUnsafe(28);return e.writeInt32BE(this._a,0),e.writeInt32BE(this._b,4),e.writeInt32BE(this._c,8),e.writeInt32BE(this._d,12),e.writeInt32BE(this._e,16),e.writeInt32BE(this._f,20),e.writeInt32BE(this._g,24),e},e.exports=u},function(e,t,n){var r=n(7),i=n(170),o=n(69),s=n(8).Buffer,a=new Array(160);function u(){this.init(),this._w=a,o.call(this,128,112)}r(u,i),u.prototype.init=function(){return this._ah=3418070365,this._bh=1654270250,this._ch=2438529370,this._dh=355462360,this._eh=1731405415,this._fh=2394180231,this._gh=3675008525,this._hh=1203062813,this._al=3238371032,this._bl=914150663,this._cl=812702999,this._dl=4144912697,this._el=4290775857,this._fl=1750603025,this._gl=1694076839,this._hl=3204075428,this},u.prototype._hash=function(){var e=s.allocUnsafe(48);function t(t,n,r){e.writeInt32BE(t,r),e.writeInt32BE(n,r+4)}return t(this._ah,this._al,0),t(this._bh,this._bl,8),t(this._ch,this._cl,16),t(this._dh,this._dl,24),t(this._eh,this._el,32),t(this._fh,this._fl,40),e},e.exports=u},function(e,t,n){e.exports=i;var r=n(49).EventEmitter;function i(){r.call(this)}n(7)(i,r),i.Readable=n(118),i.Writable=n(292),i.Duplex=n(293),i.Transform=n(294),i.PassThrough=n(295),i.Stream=i,i.prototype.pipe=function(e,t){var n=this;function i(t){e.writable&&!1===e.write(t)&&n.pause&&n.pause()}function o(){n.readable&&n.resume&&n.resume()}n.on("data",i),e.on("drain",o),e._isStdio||t&&!1===t.end||(n.on("end",a),n.on("close",u));var s=!1;function a(){s||(s=!0,e.end())}function u(){s||(s=!0,"function"==typeof e.destroy&&e.destroy())}function c(e){if(f(),0===r.listenerCount(this,"error"))throw e}function f(){n.removeListener("data",i),e.removeListener("drain",o),n.removeListener("end",a),n.removeListener("close",u),n.removeListener("error",c),e.removeListener("error",c),n.removeListener("end",f),n.removeListener("close",f),e.removeListener("close",f)}return n.on("error",c),e.on("error",c),n.on("end",f),n.on("close",f),e.on("close",f),e.emit("pipe",n),e}},function(e,t){},function(e,t,n){"use strict";var r=n(119).Buffer,i=n(288);e.exports=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.head=null,this.tail=null,this.length=0}return e.prototype.push=function(e){var t={data:e,next:null};this.length>0?this.tail.next=t:this.head=t,this.tail=t,++this.length},e.prototype.unshift=function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length},e.prototype.shift=function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}},e.prototype.clear=function(){this.head=this.tail=null,this.length=0},e.prototype.join=function(e){if(0===this.length)return"";for(var t=this.head,n=""+t.data;t=t.next;)n+=e+t.data;return n},e.prototype.concat=function(e){if(0===this.length)return r.alloc(0);if(1===this.length)return this.head.data;for(var t,n,i,o=r.allocUnsafe(e>>>0),s=this.head,a=0;s;)t=s.data,n=o,i=a,t.copy(n,i),a+=s.data.length,s=s.next;return o},e}(),i&&i.inspect&&i.inspect.custom&&(e.exports.prototype[i.inspect.custom]=function(){var e=i.inspect({length:this.length});return this.constructor.name+" "+e})},function(e,t){},function(e,t,n){(function(e){var r=void 0!==e&&e||"undefined"!=typeof self&&self||window,i=Function.prototype.apply;function o(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new o(i.call(setTimeout,r,arguments),clearTimeout)},t.setInterval=function(){return new o(i.call(setInterval,r,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},o.prototype.unref=o.prototype.ref=function(){},o.prototype.close=function(){this._clearFn.call(r,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(290),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(31))},function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var r,i,o,s,a,u=1,c={},f=!1,l=e.document,d=Object.getPrototypeOf&&Object.getPrototypeOf(e);d=d&&d.setTimeout?d:e,"[object process]"==={}.toString.call(e.process)?r=function(e){t.nextTick((function(){p(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((o=new MessageChannel).port1.onmessage=function(e){p(e.data)},r=function(e){o.port2.postMessage(e)}):l&&"onreadystatechange"in l.createElement("script")?(i=l.documentElement,r=function(e){var t=l.createElement("script");t.onreadystatechange=function(){p(e),t.onreadystatechange=null,i.removeChild(t),t=null},i.appendChild(t)}):r=function(e){setTimeout(p,0,e)}:(s="setImmediate$"+Math.random()+"$",a=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(s)&&p(+t.data.slice(s.length))},e.addEventListener?e.addEventListener("message",a,!1):e.attachEvent("onmessage",a),r=function(t){e.postMessage(s+t,"*")}),d.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n64?t=e(t):t.length<64&&(t=i.concat([t,s],64));for(var n=this._ipad=i.allocUnsafe(64),r=this._opad=i.allocUnsafe(64),a=0;a<64;a++)n[a]=54^t[a],r[a]=92^t[a];this._hash=[n]}r(a,o),a.prototype._update=function(e){this._hash.push(e)},a.prototype._final=function(){var e=this._alg(i.concat(this._hash));return this._alg(i.concat([this._opad,e]))},e.exports=a},function(e,t,n){e.exports=n(177)},function(e,t,n){(function(t,r){var i,o=n(8).Buffer,s=n(179),a=n(180),u=n(181),c=n(182),f=t.crypto&&t.crypto.subtle,l={sha:"SHA-1","sha-1":"SHA-1",sha1:"SHA-1",sha256:"SHA-256","sha-256":"SHA-256",sha384:"SHA-384","sha-384":"SHA-384","sha-512":"SHA-512",sha512:"SHA-512"},d=[];function h(e,t,n,r,i){return f.importKey("raw",e,{name:"PBKDF2"},!1,["deriveBits"]).then((function(e){return f.deriveBits({name:"PBKDF2",salt:t,iterations:n,hash:{name:i}},e,r<<3)})).then((function(e){return o.from(e)}))}e.exports=function(e,n,p,v,g,m){"function"==typeof g&&(m=g,g=void 0);var b=l[(g=g||"sha1").toLowerCase()];if(!b||"function"!=typeof t.Promise)return r.nextTick((function(){var t;try{t=u(e,n,p,v,g)}catch(e){return m(e)}m(null,t)}));if(s(p,v),e=c(e,a,"Password"),n=c(n,a,"Salt"),"function"!=typeof m)throw new Error("No callback provided to pbkdf2");!function(e,t){e.then((function(e){r.nextTick((function(){t(null,e)}))}),(function(e){r.nextTick((function(){t(e)}))}))}(function(e){if(t.process&&!t.process.browser)return Promise.resolve(!1);if(!f||!f.importKey||!f.deriveBits)return Promise.resolve(!1);if(void 0!==d[e])return d[e];var n=h(i=i||o.alloc(8),i,10,128,e).then((function(){return!0})).catch((function(){return!1}));return d[e]=n,n}(b).then((function(t){return t?h(e,n,p,v,b):u(e,n,p,v,g)})),m)}}).call(this,n(31),n(20))},function(e,t,n){var r=n(300),i=n(122),o=n(123),s=n(313),a=n(94);function u(e,t,n){if(e=e.toLowerCase(),o[e])return i.createCipheriv(e,t,n);if(s[e])return new r({key:t,iv:n,mode:e});throw new TypeError("invalid suite type")}function c(e,t,n){if(e=e.toLowerCase(),o[e])return i.createDecipheriv(e,t,n);if(s[e])return new r({key:t,iv:n,mode:e,decrypt:!0});throw new TypeError("invalid suite type")}t.createCipher=t.Cipher=function(e,t){var n,r;if(e=e.toLowerCase(),o[e])n=o[e].key,r=o[e].iv;else{if(!s[e])throw new TypeError("invalid suite type");n=8*s[e].key,r=s[e].iv}var i=a(t,!1,n,r);return u(e,i.key,i.iv)},t.createCipheriv=t.Cipheriv=u,t.createDecipher=t.Decipher=function(e,t){var n,r;if(e=e.toLowerCase(),o[e])n=o[e].key,r=o[e].iv;else{if(!s[e])throw new TypeError("invalid suite type");n=8*s[e].key,r=s[e].iv}var i=a(t,!1,n,r);return c(e,i.key,i.iv)},t.createDecipheriv=t.Decipheriv=c,t.listCiphers=t.getCiphers=function(){return Object.keys(s).concat(i.getCiphers())}},function(e,t,n){var r=n(56),i=n(301),o=n(7),s=n(8).Buffer,a={"des-ede3-cbc":i.CBC.instantiate(i.EDE),"des-ede3":i.EDE,"des-ede-cbc":i.CBC.instantiate(i.EDE),"des-ede":i.EDE,"des-cbc":i.CBC.instantiate(i.DES),"des-ecb":i.DES};function u(e){r.call(this);var t,n=e.mode.toLowerCase(),i=a[n];t=e.decrypt?"decrypt":"encrypt";var o=e.key;s.isBuffer(o)||(o=s.from(o)),"des-ede"!==n&&"des-ede-cbc"!==n||(o=s.concat([o,o.slice(0,8)]));var u=e.iv;s.isBuffer(u)||(u=s.from(u)),this._des=i.create({key:o,iv:u,type:t})}a.des=a["des-cbc"],a.des3=a["des-ede3-cbc"],e.exports=u,o(u,r),u.prototype._update=function(e){return s.from(this._des.update(e))},u.prototype._final=function(){return s.from(this._des.final())}},function(e,t,n){"use strict";t.utils=n(183),t.Cipher=n(121),t.DES=n(184),t.CBC=n(302),t.EDE=n(303)},function(e,t,n){"use strict";var r=n(46),i=n(7),o={};function s(e){r.equal(e.length,8,"Invalid IV length"),this.iv=new Array(8);for(var t=0;t15){var e=this.cache.slice(0,16);return this.cache=this.cache.slice(16),e}return null},d.prototype.flush=function(){for(var e=16-this.cache.length,t=o.allocUnsafe(e),n=-1;++n>s%8,e._prev=o(e._prev,n?r:i);return a}function o(e,t){var n=e.length,i=-1,o=r.allocUnsafe(e.length);for(e=r.concat([e,r.from([t])]);++i>7;return o}t.encrypt=function(e,t,n){for(var o=t.length,s=r.allocUnsafe(o),a=-1;++a>>0,0),t.writeUInt32BE(e[1]>>>0,4),t.writeUInt32BE(e[2]>>>0,8),t.writeUInt32BE(e[3]>>>0,12),t}function s(e){this.h=e,this.state=r.alloc(16,0),this.cache=r.allocUnsafe(0)}s.prototype.ghash=function(e){for(var t=-1;++t0;t--)r[t]=r[t]>>>1|(1&r[t-1])<<31;r[0]=r[0]>>>1,n&&(r[0]=r[0]^225<<24)}this.state=o(i)},s.prototype.update=function(e){var t;for(this.cache=r.concat([this.cache,e]);this.cache.length>=16;)t=this.cache.slice(0,16),this.cache=this.cache.slice(16),this.ghash(t)},s.prototype.final=function(e,t){return this.cache.length&&this.ghash(r.concat([this.cache,i],16)),this.ghash(o([0,e,0,t])),this.state},e.exports=s},function(e,t,n){var r=n(188),i=n(8).Buffer,o=n(123),s=n(189),a=n(56),u=n(93),c=n(94);function f(e,t,n){a.call(this),this._cache=new l,this._last=void 0,this._cipher=new u.AES(t),this._prev=i.from(n),this._mode=e,this._autopadding=!0}function l(){this.cache=i.allocUnsafe(0)}function d(e,t,n){var a=o[e.toLowerCase()];if(!a)throw new TypeError("invalid suite type");if("string"==typeof n&&(n=i.from(n)),"GCM"!==a.mode&&n.length!==a.iv)throw new TypeError("invalid iv length "+n.length);if("string"==typeof t&&(t=i.from(t)),t.length!==a.key/8)throw new TypeError("invalid key length "+t.length);return"stream"===a.type?new s(a.module,t,n,!0):"auth"===a.type?new r(a.module,t,n,!0):new f(a.module,t,n)}n(7)(f,a),f.prototype._update=function(e){var t,n;this._cache.add(e);for(var r=[];t=this._cache.get(this._autopadding);)n=this._mode.decrypt(this,t),r.push(n);return i.concat(r)},f.prototype._final=function(){var e=this._cache.flush();if(this._autopadding)return function(e){var t=e[15];if(t<1||t>16)throw new Error("unable to decrypt data");var n=-1;for(;++n16)return t=this.cache.slice(0,16),this.cache=this.cache.slice(16),t}else if(this.cache.length>=16)return t=this.cache.slice(0,16),this.cache=this.cache.slice(16),t;return null},l.prototype.flush=function(){if(this.cache.length)return this.cache},t.createDecipher=function(e,t){var n=o[e.toLowerCase()];if(!n)throw new TypeError("invalid suite type");var r=c(t,!1,n.key,n.iv);return d(e,r.key,r.iv)},t.createDecipheriv=d},function(e,t){t["des-ecb"]={key:8,iv:0},t["des-cbc"]=t.des={key:8,iv:8},t["des-ede3-cbc"]=t.des3={key:24,iv:8},t["des-ede3"]={key:24,iv:0},t["des-ede-cbc"]={key:16,iv:8},t["des-ede"]={key:16,iv:0}},function(e,t,n){(function(e){var r=n(190),i=n(317),o=n(318);var s={binary:!0,hex:!0,base64:!0};t.DiffieHellmanGroup=t.createDiffieHellmanGroup=t.getDiffieHellman=function(t){var n=new e(i[t].prime,"hex"),r=new e(i[t].gen,"hex");return new o(n,r)},t.createDiffieHellman=t.DiffieHellman=function t(n,i,a,u){return e.isBuffer(i)||void 0===s[i]?t(n,"binary",i,a):(i=i||"binary",u=u||"binary",a=a||new e([2]),e.isBuffer(a)||(a=new e(a,u)),"number"==typeof n?new o(r(n,a),a,!0):(e.isBuffer(n)||(n=new e(n,i)),new o(n,a,!0)))}}).call(this,n(6).Buffer)},function(e,t){},function(e,t){},function(e){e.exports=JSON.parse('{"modp1":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff"},"modp2":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff"},"modp5":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff"},"modp14":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff"},"modp15":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff"},"modp16":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffff"},"modp17":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff"},"modp18":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffff"}}')},function(e,t,n){(function(t){var r=n(29),i=new(n(191)),o=new r(24),s=new r(11),a=new r(10),u=new r(3),c=new r(7),f=n(190),l=n(66);function d(e,n){return n=n||"utf8",t.isBuffer(e)||(e=new t(e,n)),this._pub=new r(e),this}function h(e,n){return n=n||"utf8",t.isBuffer(e)||(e=new t(e,n)),this._priv=new r(e),this}e.exports=v;var p={};function v(e,t,n){this.setGenerator(t),this.__prime=new r(e),this._prime=r.mont(this.__prime),this._primeLen=e.length,this._pub=void 0,this._priv=void 0,this._primeCode=void 0,n?(this.setPublicKey=d,this.setPrivateKey=h):this._primeCode=8}function g(e,n){var r=new t(e.toArray());return n?r.toString(n):r}Object.defineProperty(v.prototype,"verifyError",{enumerable:!0,get:function(){return"number"!=typeof this._primeCode&&(this._primeCode=function(e,t){var n=t.toString("hex"),r=[n,e.toString(16)].join("_");if(r in p)return p[r];var l,d=0;if(e.isEven()||!f.simpleSieve||!f.fermatTest(e)||!i.test(e))return d+=1,d+="02"===n||"05"===n?8:4,p[r]=d,d;switch(i.test(e.shrn(1))||(d+=2),n){case"02":e.mod(o).cmp(s)&&(d+=8);break;case"05":(l=e.mod(a)).cmp(u)&&l.cmp(c)&&(d+=8);break;default:d+=4}return p[r]=d,d}(this.__prime,this.__gen)),this._primeCode}}),v.prototype.generateKeys=function(){return this._priv||(this._priv=new r(l(this._primeLen))),this._pub=this._gen.toRed(this._prime).redPow(this._priv).fromRed(),this.getPublicKey()},v.prototype.computeSecret=function(e){var n=(e=(e=new r(e)).toRed(this._prime)).redPow(this._priv).fromRed(),i=new t(n.toArray()),o=this.getPrime();if(i.length0?this.tail.next=t:this.head=t,this.tail=t,++this.length}},{key:"unshift",value:function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length}},{key:"shift",value:function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(e){if(0===this.length)return"";for(var t=this.head,n=""+t.data;t=t.next;)n+=e+t.data;return n}},{key:"concat",value:function(e){if(0===this.length)return s.alloc(0);for(var t,n,r,i=s.allocUnsafe(e>>>0),o=this.head,a=0;o;)t=o.data,n=i,r=a,s.prototype.copy.call(t,n,r),a+=o.data.length,o=o.next;return i}},{key:"consume",value:function(e,t){var n;return ei.length?i.length:e;if(o===i.length?r+=i:r+=i.slice(0,e),0==(e-=o)){o===i.length?(++n,t.next?this.head=t.next:this.head=this.tail=null):(this.head=t,t.data=i.slice(o));break}++n}return this.length-=n,r}},{key:"_getBuffer",value:function(e){var t=s.allocUnsafe(e),n=this.head,r=1;for(n.data.copy(t),e-=n.data.length;n=n.next;){var i=n.data,o=e>i.length?i.length:e;if(i.copy(t,t.length-e,0,o),0==(e-=o)){o===i.length?(++r,n.next?this.head=n.next:this.head=this.tail=null):(this.head=n,n.data=i.slice(o));break}++r}return this.length-=r,t}},{key:u,value:function(e,t){return a(this,function(e){for(var t=1;t0,(function(e){r||(r=e),e&&s.forEach(c),o||(s.forEach(c),i(r))}))}));return t.reduce(f)}},function(e,t,n){var r=n(8).Buffer,i=n(175),o=n(126),s=n(127).ec,a=n(203),u=n(96),c=n(209);function f(e,t,n,o){if((e=r.from(e.toArray())).length0&&n.ishrn(r),n}function d(e,t,n){var o,s;do{for(o=r.alloc(0);8*o.length=49&&c<=54?c-49+10:c>=17&&c<=22?c-17+10:c,s|=u}return r(!(240&s),"Invalid character in "+e),i}function u(e,t,n,i){for(var o=0,s=0,a=Math.min(e.length,n),u=t;u=49?c-49+10:c>=17?c-17+10:c,r(c>=0&&s0?e:t},o.min=function(e,t){return e.cmp(t)<0?e:t},o.prototype._init=function(e,t,n){if("number"==typeof e)return this._initNumber(e,t,n);if("object"==typeof e)return this._initArray(e,t,n);"hex"===t&&(t=16),r(t===(0|t)&&t>=2&&t<=36);var i=0;"-"===(e=e.toString().replace(/\s+/g,""))[0]&&i++,16===t?this._parseHex(e,i):this._parseBase(e,t,i),"-"===e[0]&&(this.negative=1),this._strip(),"le"===n&&this._initArray(this.toArray(),t,n)},o.prototype._initNumber=function(e,t,n){e<0&&(this.negative=1,e=-e),e<67108864?(this.words=[67108863&e],this.length=1):e<4503599627370496?(this.words=[67108863&e,e/67108864&67108863],this.length=2):(r(e<9007199254740992),this.words=[67108863&e,e/67108864&67108863,1],this.length=3),"le"===n&&this._initArray(this.toArray(),t,n)},o.prototype._initArray=function(e,t,n){if(r("number"==typeof e.length),e.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(e.length/3),this.words=new Array(this.length);for(var i=0;i=0;i-=3)s=e[i]|e[i-1]<<8|e[i-2]<<16,this.words[o]|=s<>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);else if("le"===n)for(i=0,o=0;i>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);return this._strip()},o.prototype._parseHex=function(e,t){this.length=Math.ceil((e.length-t)/6),this.words=new Array(this.length);for(var n=0;n=t;n-=6)i=a(e,n,n+6),this.words[r]|=i<>>26-o&4194303,(o+=24)>=26&&(o-=26,r++);n+6!==t&&(i=a(e,t,n+6),this.words[r]|=i<>>26-o&4194303),this._strip()},o.prototype._parseBase=function(e,t,n){this.words=[0],this.length=1;for(var r=0,i=1;i<=67108863;i*=t)r++;r--,i=i/t|0;for(var o=e.length-n,s=o%r,a=Math.min(o,o-s)+n,c=0,f=n;f1&&0===this.words[this.length-1];)this.length--;return this._normSign()},o.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},"undefined"!=typeof Symbol&&"function"==typeof Symbol.for)try{o.prototype[Symbol.for("nodejs.util.inspect.custom")]=f}catch(e){o.prototype.inspect=f}else o.prototype.inspect=f;function f(){return(this.red?""}var l=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],d=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],h=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];o.prototype.toString=function(e,t){var n;if(t=0|t||1,16===(e=e||10)||"hex"===e){n="";for(var i=0,o=0,s=0;s>>24-i&16777215)||s!==this.length-1?l[6-u.length]+u+n:u+n,(i+=2)>=26&&(i-=26,s--)}for(0!==o&&(n=o.toString(16)+n);n.length%t!=0;)n="0"+n;return 0!==this.negative&&(n="-"+n),n}if(e===(0|e)&&e>=2&&e<=36){var c=d[e],f=h[e];n="";var p=this.clone();for(p.negative=0;!p.isZero();){var v=p.modrn(f).toString(e);n=(p=p.idivn(f)).isZero()?v+n:l[c-v.length]+v+n}for(this.isZero()&&(n="0"+n);n.length%t!=0;)n="0"+n;return 0!==this.negative&&(n="-"+n),n}r(!1,"Base should be between 2 and 36")},o.prototype.toNumber=function(){var e=this.words[0];return 2===this.length?e+=67108864*this.words[1]:3===this.length&&1===this.words[2]?e+=4503599627370496+67108864*this.words[1]:this.length>2&&r(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-e:e},o.prototype.toJSON=function(){return this.toString(16,2)},s&&(o.prototype.toBuffer=function(e,t){return this.toArrayLike(s,e,t)}),o.prototype.toArray=function(e,t){return this.toArrayLike(Array,e,t)};function p(e,t,n){n.negative=t.negative^e.negative;var r=e.length+t.length|0;n.length=r,r=r-1|0;var i=0|e.words[0],o=0|t.words[0],s=i*o,a=67108863&s,u=s/67108864|0;n.words[0]=a;for(var c=1;c>>26,l=67108863&u,d=Math.min(c,t.length-1),h=Math.max(0,c-e.length+1);h<=d;h++){var p=c-h|0;f+=(s=(i=0|e.words[p])*(o=0|t.words[h])+l)/67108864|0,l=67108863&s}n.words[c]=0|l,u=0|f}return 0!==u?n.words[c]=0|u:n.length--,n._strip()}o.prototype.toArrayLike=function(e,t,n){this._strip();var i=this.byteLength(),o=n||Math.max(1,i);r(i<=o,"byte array longer than desired length"),r(o>0,"Requested array length <= 0");var s=function(e,t){return e.allocUnsafe?e.allocUnsafe(t):new e(t)}(e,o);return this["_toArrayLike"+("le"===t?"LE":"BE")](s,i),s},o.prototype._toArrayLikeLE=function(e,t){for(var n=0,r=0,i=0,o=0;i>8&255),n>16&255),6===o?(n>24&255),r=0,o=0):(r=s>>>24,o+=2)}if(n=0&&(e[n--]=s>>8&255),n>=0&&(e[n--]=s>>16&255),6===o?(n>=0&&(e[n--]=s>>24&255),r=0,o=0):(r=s>>>24,o+=2)}if(n>=0)for(e[n--]=r;n>=0;)e[n--]=0},Math.clz32?o.prototype._countBits=function(e){return 32-Math.clz32(e)}:o.prototype._countBits=function(e){var t=e,n=0;return t>=4096&&(n+=13,t>>>=13),t>=64&&(n+=7,t>>>=7),t>=8&&(n+=4,t>>>=4),t>=2&&(n+=2,t>>>=2),n+t},o.prototype._zeroBits=function(e){if(0===e)return 26;var t=e,n=0;return 0==(8191&t)&&(n+=13,t>>>=13),0==(127&t)&&(n+=7,t>>>=7),0==(15&t)&&(n+=4,t>>>=4),0==(3&t)&&(n+=2,t>>>=2),0==(1&t)&&n++,n},o.prototype.bitLength=function(){var e=this.words[this.length-1],t=this._countBits(e);return 26*(this.length-1)+t},o.prototype.zeroBits=function(){if(this.isZero())return 0;for(var e=0,t=0;te.length?this.clone().ior(e):e.clone().ior(this)},o.prototype.uor=function(e){return this.length>e.length?this.clone().iuor(e):e.clone().iuor(this)},o.prototype.iuand=function(e){var t;t=this.length>e.length?e:this;for(var n=0;ne.length?this.clone().iand(e):e.clone().iand(this)},o.prototype.uand=function(e){return this.length>e.length?this.clone().iuand(e):e.clone().iuand(this)},o.prototype.iuxor=function(e){var t,n;this.length>e.length?(t=this,n=e):(t=e,n=this);for(var r=0;re.length?this.clone().ixor(e):e.clone().ixor(this)},o.prototype.uxor=function(e){return this.length>e.length?this.clone().iuxor(e):e.clone().iuxor(this)},o.prototype.inotn=function(e){r("number"==typeof e&&e>=0);var t=0|Math.ceil(e/26),n=e%26;this._expand(t),n>0&&t--;for(var i=0;i0&&(this.words[i]=~this.words[i]&67108863>>26-n),this._strip()},o.prototype.notn=function(e){return this.clone().inotn(e)},o.prototype.setn=function(e,t){r("number"==typeof e&&e>=0);var n=e/26|0,i=e%26;return this._expand(n+1),this.words[n]=t?this.words[n]|1<e.length?(n=this,r=e):(n=e,r=this);for(var i=0,o=0;o>>26;for(;0!==i&&o>>26;if(this.length=n.length,0!==i)this.words[this.length]=i,this.length++;else if(n!==this)for(;oe.length?this.clone().iadd(e):e.clone().iadd(this)},o.prototype.isub=function(e){if(0!==e.negative){e.negative=0;var t=this.iadd(e);return e.negative=1,t._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(e),this.negative=1,this._normSign();var n,r,i=this.cmp(e);if(0===i)return this.negative=0,this.length=1,this.words[0]=0,this;i>0?(n=this,r=e):(n=e,r=this);for(var o=0,s=0;s>26,this.words[s]=67108863&t;for(;0!==o&&s>26,this.words[s]=67108863&t;if(0===o&&s>>13,h=0|s[1],p=8191&h,v=h>>>13,g=0|s[2],m=8191&g,b=g>>>13,y=0|s[3],w=8191&y,_=y>>>13,S=0|s[4],E=8191&S,M=S>>>13,A=0|s[5],I=8191&A,k=A>>>13,O=0|s[6],x=8191&O,C=O>>>13,T=0|s[7],P=8191&T,N=T>>>13,R=0|s[8],L=8191&R,j=R>>>13,D=0|s[9],U=8191&D,B=D>>>13,F=0|a[0],z=8191&F,q=F>>>13,K=0|a[1],H=8191&K,V=K>>>13,G=0|a[2],W=8191&G,$=G>>>13,Y=0|a[3],J=8191&Y,Z=Y>>>13,X=0|a[4],Q=8191&X,ee=X>>>13,te=0|a[5],ne=8191&te,re=te>>>13,ie=0|a[6],oe=8191&ie,se=ie>>>13,ae=0|a[7],ue=8191&ae,ce=ae>>>13,fe=0|a[8],le=8191&fe,de=fe>>>13,he=0|a[9],pe=8191&he,ve=he>>>13;n.negative=e.negative^t.negative,n.length=19;var ge=(c+(r=Math.imul(l,z))|0)+((8191&(i=(i=Math.imul(l,q))+Math.imul(d,z)|0))<<13)|0;c=((o=Math.imul(d,q))+(i>>>13)|0)+(ge>>>26)|0,ge&=67108863,r=Math.imul(p,z),i=(i=Math.imul(p,q))+Math.imul(v,z)|0,o=Math.imul(v,q);var me=(c+(r=r+Math.imul(l,H)|0)|0)+((8191&(i=(i=i+Math.imul(l,V)|0)+Math.imul(d,H)|0))<<13)|0;c=((o=o+Math.imul(d,V)|0)+(i>>>13)|0)+(me>>>26)|0,me&=67108863,r=Math.imul(m,z),i=(i=Math.imul(m,q))+Math.imul(b,z)|0,o=Math.imul(b,q),r=r+Math.imul(p,H)|0,i=(i=i+Math.imul(p,V)|0)+Math.imul(v,H)|0,o=o+Math.imul(v,V)|0;var be=(c+(r=r+Math.imul(l,W)|0)|0)+((8191&(i=(i=i+Math.imul(l,$)|0)+Math.imul(d,W)|0))<<13)|0;c=((o=o+Math.imul(d,$)|0)+(i>>>13)|0)+(be>>>26)|0,be&=67108863,r=Math.imul(w,z),i=(i=Math.imul(w,q))+Math.imul(_,z)|0,o=Math.imul(_,q),r=r+Math.imul(m,H)|0,i=(i=i+Math.imul(m,V)|0)+Math.imul(b,H)|0,o=o+Math.imul(b,V)|0,r=r+Math.imul(p,W)|0,i=(i=i+Math.imul(p,$)|0)+Math.imul(v,W)|0,o=o+Math.imul(v,$)|0;var ye=(c+(r=r+Math.imul(l,J)|0)|0)+((8191&(i=(i=i+Math.imul(l,Z)|0)+Math.imul(d,J)|0))<<13)|0;c=((o=o+Math.imul(d,Z)|0)+(i>>>13)|0)+(ye>>>26)|0,ye&=67108863,r=Math.imul(E,z),i=(i=Math.imul(E,q))+Math.imul(M,z)|0,o=Math.imul(M,q),r=r+Math.imul(w,H)|0,i=(i=i+Math.imul(w,V)|0)+Math.imul(_,H)|0,o=o+Math.imul(_,V)|0,r=r+Math.imul(m,W)|0,i=(i=i+Math.imul(m,$)|0)+Math.imul(b,W)|0,o=o+Math.imul(b,$)|0,r=r+Math.imul(p,J)|0,i=(i=i+Math.imul(p,Z)|0)+Math.imul(v,J)|0,o=o+Math.imul(v,Z)|0;var we=(c+(r=r+Math.imul(l,Q)|0)|0)+((8191&(i=(i=i+Math.imul(l,ee)|0)+Math.imul(d,Q)|0))<<13)|0;c=((o=o+Math.imul(d,ee)|0)+(i>>>13)|0)+(we>>>26)|0,we&=67108863,r=Math.imul(I,z),i=(i=Math.imul(I,q))+Math.imul(k,z)|0,o=Math.imul(k,q),r=r+Math.imul(E,H)|0,i=(i=i+Math.imul(E,V)|0)+Math.imul(M,H)|0,o=o+Math.imul(M,V)|0,r=r+Math.imul(w,W)|0,i=(i=i+Math.imul(w,$)|0)+Math.imul(_,W)|0,o=o+Math.imul(_,$)|0,r=r+Math.imul(m,J)|0,i=(i=i+Math.imul(m,Z)|0)+Math.imul(b,J)|0,o=o+Math.imul(b,Z)|0,r=r+Math.imul(p,Q)|0,i=(i=i+Math.imul(p,ee)|0)+Math.imul(v,Q)|0,o=o+Math.imul(v,ee)|0;var _e=(c+(r=r+Math.imul(l,ne)|0)|0)+((8191&(i=(i=i+Math.imul(l,re)|0)+Math.imul(d,ne)|0))<<13)|0;c=((o=o+Math.imul(d,re)|0)+(i>>>13)|0)+(_e>>>26)|0,_e&=67108863,r=Math.imul(x,z),i=(i=Math.imul(x,q))+Math.imul(C,z)|0,o=Math.imul(C,q),r=r+Math.imul(I,H)|0,i=(i=i+Math.imul(I,V)|0)+Math.imul(k,H)|0,o=o+Math.imul(k,V)|0,r=r+Math.imul(E,W)|0,i=(i=i+Math.imul(E,$)|0)+Math.imul(M,W)|0,o=o+Math.imul(M,$)|0,r=r+Math.imul(w,J)|0,i=(i=i+Math.imul(w,Z)|0)+Math.imul(_,J)|0,o=o+Math.imul(_,Z)|0,r=r+Math.imul(m,Q)|0,i=(i=i+Math.imul(m,ee)|0)+Math.imul(b,Q)|0,o=o+Math.imul(b,ee)|0,r=r+Math.imul(p,ne)|0,i=(i=i+Math.imul(p,re)|0)+Math.imul(v,ne)|0,o=o+Math.imul(v,re)|0;var Se=(c+(r=r+Math.imul(l,oe)|0)|0)+((8191&(i=(i=i+Math.imul(l,se)|0)+Math.imul(d,oe)|0))<<13)|0;c=((o=o+Math.imul(d,se)|0)+(i>>>13)|0)+(Se>>>26)|0,Se&=67108863,r=Math.imul(P,z),i=(i=Math.imul(P,q))+Math.imul(N,z)|0,o=Math.imul(N,q),r=r+Math.imul(x,H)|0,i=(i=i+Math.imul(x,V)|0)+Math.imul(C,H)|0,o=o+Math.imul(C,V)|0,r=r+Math.imul(I,W)|0,i=(i=i+Math.imul(I,$)|0)+Math.imul(k,W)|0,o=o+Math.imul(k,$)|0,r=r+Math.imul(E,J)|0,i=(i=i+Math.imul(E,Z)|0)+Math.imul(M,J)|0,o=o+Math.imul(M,Z)|0,r=r+Math.imul(w,Q)|0,i=(i=i+Math.imul(w,ee)|0)+Math.imul(_,Q)|0,o=o+Math.imul(_,ee)|0,r=r+Math.imul(m,ne)|0,i=(i=i+Math.imul(m,re)|0)+Math.imul(b,ne)|0,o=o+Math.imul(b,re)|0,r=r+Math.imul(p,oe)|0,i=(i=i+Math.imul(p,se)|0)+Math.imul(v,oe)|0,o=o+Math.imul(v,se)|0;var Ee=(c+(r=r+Math.imul(l,ue)|0)|0)+((8191&(i=(i=i+Math.imul(l,ce)|0)+Math.imul(d,ue)|0))<<13)|0;c=((o=o+Math.imul(d,ce)|0)+(i>>>13)|0)+(Ee>>>26)|0,Ee&=67108863,r=Math.imul(L,z),i=(i=Math.imul(L,q))+Math.imul(j,z)|0,o=Math.imul(j,q),r=r+Math.imul(P,H)|0,i=(i=i+Math.imul(P,V)|0)+Math.imul(N,H)|0,o=o+Math.imul(N,V)|0,r=r+Math.imul(x,W)|0,i=(i=i+Math.imul(x,$)|0)+Math.imul(C,W)|0,o=o+Math.imul(C,$)|0,r=r+Math.imul(I,J)|0,i=(i=i+Math.imul(I,Z)|0)+Math.imul(k,J)|0,o=o+Math.imul(k,Z)|0,r=r+Math.imul(E,Q)|0,i=(i=i+Math.imul(E,ee)|0)+Math.imul(M,Q)|0,o=o+Math.imul(M,ee)|0,r=r+Math.imul(w,ne)|0,i=(i=i+Math.imul(w,re)|0)+Math.imul(_,ne)|0,o=o+Math.imul(_,re)|0,r=r+Math.imul(m,oe)|0,i=(i=i+Math.imul(m,se)|0)+Math.imul(b,oe)|0,o=o+Math.imul(b,se)|0,r=r+Math.imul(p,ue)|0,i=(i=i+Math.imul(p,ce)|0)+Math.imul(v,ue)|0,o=o+Math.imul(v,ce)|0;var Me=(c+(r=r+Math.imul(l,le)|0)|0)+((8191&(i=(i=i+Math.imul(l,de)|0)+Math.imul(d,le)|0))<<13)|0;c=((o=o+Math.imul(d,de)|0)+(i>>>13)|0)+(Me>>>26)|0,Me&=67108863,r=Math.imul(U,z),i=(i=Math.imul(U,q))+Math.imul(B,z)|0,o=Math.imul(B,q),r=r+Math.imul(L,H)|0,i=(i=i+Math.imul(L,V)|0)+Math.imul(j,H)|0,o=o+Math.imul(j,V)|0,r=r+Math.imul(P,W)|0,i=(i=i+Math.imul(P,$)|0)+Math.imul(N,W)|0,o=o+Math.imul(N,$)|0,r=r+Math.imul(x,J)|0,i=(i=i+Math.imul(x,Z)|0)+Math.imul(C,J)|0,o=o+Math.imul(C,Z)|0,r=r+Math.imul(I,Q)|0,i=(i=i+Math.imul(I,ee)|0)+Math.imul(k,Q)|0,o=o+Math.imul(k,ee)|0,r=r+Math.imul(E,ne)|0,i=(i=i+Math.imul(E,re)|0)+Math.imul(M,ne)|0,o=o+Math.imul(M,re)|0,r=r+Math.imul(w,oe)|0,i=(i=i+Math.imul(w,se)|0)+Math.imul(_,oe)|0,o=o+Math.imul(_,se)|0,r=r+Math.imul(m,ue)|0,i=(i=i+Math.imul(m,ce)|0)+Math.imul(b,ue)|0,o=o+Math.imul(b,ce)|0,r=r+Math.imul(p,le)|0,i=(i=i+Math.imul(p,de)|0)+Math.imul(v,le)|0,o=o+Math.imul(v,de)|0;var Ae=(c+(r=r+Math.imul(l,pe)|0)|0)+((8191&(i=(i=i+Math.imul(l,ve)|0)+Math.imul(d,pe)|0))<<13)|0;c=((o=o+Math.imul(d,ve)|0)+(i>>>13)|0)+(Ae>>>26)|0,Ae&=67108863,r=Math.imul(U,H),i=(i=Math.imul(U,V))+Math.imul(B,H)|0,o=Math.imul(B,V),r=r+Math.imul(L,W)|0,i=(i=i+Math.imul(L,$)|0)+Math.imul(j,W)|0,o=o+Math.imul(j,$)|0,r=r+Math.imul(P,J)|0,i=(i=i+Math.imul(P,Z)|0)+Math.imul(N,J)|0,o=o+Math.imul(N,Z)|0,r=r+Math.imul(x,Q)|0,i=(i=i+Math.imul(x,ee)|0)+Math.imul(C,Q)|0,o=o+Math.imul(C,ee)|0,r=r+Math.imul(I,ne)|0,i=(i=i+Math.imul(I,re)|0)+Math.imul(k,ne)|0,o=o+Math.imul(k,re)|0,r=r+Math.imul(E,oe)|0,i=(i=i+Math.imul(E,se)|0)+Math.imul(M,oe)|0,o=o+Math.imul(M,se)|0,r=r+Math.imul(w,ue)|0,i=(i=i+Math.imul(w,ce)|0)+Math.imul(_,ue)|0,o=o+Math.imul(_,ce)|0,r=r+Math.imul(m,le)|0,i=(i=i+Math.imul(m,de)|0)+Math.imul(b,le)|0,o=o+Math.imul(b,de)|0;var Ie=(c+(r=r+Math.imul(p,pe)|0)|0)+((8191&(i=(i=i+Math.imul(p,ve)|0)+Math.imul(v,pe)|0))<<13)|0;c=((o=o+Math.imul(v,ve)|0)+(i>>>13)|0)+(Ie>>>26)|0,Ie&=67108863,r=Math.imul(U,W),i=(i=Math.imul(U,$))+Math.imul(B,W)|0,o=Math.imul(B,$),r=r+Math.imul(L,J)|0,i=(i=i+Math.imul(L,Z)|0)+Math.imul(j,J)|0,o=o+Math.imul(j,Z)|0,r=r+Math.imul(P,Q)|0,i=(i=i+Math.imul(P,ee)|0)+Math.imul(N,Q)|0,o=o+Math.imul(N,ee)|0,r=r+Math.imul(x,ne)|0,i=(i=i+Math.imul(x,re)|0)+Math.imul(C,ne)|0,o=o+Math.imul(C,re)|0,r=r+Math.imul(I,oe)|0,i=(i=i+Math.imul(I,se)|0)+Math.imul(k,oe)|0,o=o+Math.imul(k,se)|0,r=r+Math.imul(E,ue)|0,i=(i=i+Math.imul(E,ce)|0)+Math.imul(M,ue)|0,o=o+Math.imul(M,ce)|0,r=r+Math.imul(w,le)|0,i=(i=i+Math.imul(w,de)|0)+Math.imul(_,le)|0,o=o+Math.imul(_,de)|0;var ke=(c+(r=r+Math.imul(m,pe)|0)|0)+((8191&(i=(i=i+Math.imul(m,ve)|0)+Math.imul(b,pe)|0))<<13)|0;c=((o=o+Math.imul(b,ve)|0)+(i>>>13)|0)+(ke>>>26)|0,ke&=67108863,r=Math.imul(U,J),i=(i=Math.imul(U,Z))+Math.imul(B,J)|0,o=Math.imul(B,Z),r=r+Math.imul(L,Q)|0,i=(i=i+Math.imul(L,ee)|0)+Math.imul(j,Q)|0,o=o+Math.imul(j,ee)|0,r=r+Math.imul(P,ne)|0,i=(i=i+Math.imul(P,re)|0)+Math.imul(N,ne)|0,o=o+Math.imul(N,re)|0,r=r+Math.imul(x,oe)|0,i=(i=i+Math.imul(x,se)|0)+Math.imul(C,oe)|0,o=o+Math.imul(C,se)|0,r=r+Math.imul(I,ue)|0,i=(i=i+Math.imul(I,ce)|0)+Math.imul(k,ue)|0,o=o+Math.imul(k,ce)|0,r=r+Math.imul(E,le)|0,i=(i=i+Math.imul(E,de)|0)+Math.imul(M,le)|0,o=o+Math.imul(M,de)|0;var Oe=(c+(r=r+Math.imul(w,pe)|0)|0)+((8191&(i=(i=i+Math.imul(w,ve)|0)+Math.imul(_,pe)|0))<<13)|0;c=((o=o+Math.imul(_,ve)|0)+(i>>>13)|0)+(Oe>>>26)|0,Oe&=67108863,r=Math.imul(U,Q),i=(i=Math.imul(U,ee))+Math.imul(B,Q)|0,o=Math.imul(B,ee),r=r+Math.imul(L,ne)|0,i=(i=i+Math.imul(L,re)|0)+Math.imul(j,ne)|0,o=o+Math.imul(j,re)|0,r=r+Math.imul(P,oe)|0,i=(i=i+Math.imul(P,se)|0)+Math.imul(N,oe)|0,o=o+Math.imul(N,se)|0,r=r+Math.imul(x,ue)|0,i=(i=i+Math.imul(x,ce)|0)+Math.imul(C,ue)|0,o=o+Math.imul(C,ce)|0,r=r+Math.imul(I,le)|0,i=(i=i+Math.imul(I,de)|0)+Math.imul(k,le)|0,o=o+Math.imul(k,de)|0;var xe=(c+(r=r+Math.imul(E,pe)|0)|0)+((8191&(i=(i=i+Math.imul(E,ve)|0)+Math.imul(M,pe)|0))<<13)|0;c=((o=o+Math.imul(M,ve)|0)+(i>>>13)|0)+(xe>>>26)|0,xe&=67108863,r=Math.imul(U,ne),i=(i=Math.imul(U,re))+Math.imul(B,ne)|0,o=Math.imul(B,re),r=r+Math.imul(L,oe)|0,i=(i=i+Math.imul(L,se)|0)+Math.imul(j,oe)|0,o=o+Math.imul(j,se)|0,r=r+Math.imul(P,ue)|0,i=(i=i+Math.imul(P,ce)|0)+Math.imul(N,ue)|0,o=o+Math.imul(N,ce)|0,r=r+Math.imul(x,le)|0,i=(i=i+Math.imul(x,de)|0)+Math.imul(C,le)|0,o=o+Math.imul(C,de)|0;var Ce=(c+(r=r+Math.imul(I,pe)|0)|0)+((8191&(i=(i=i+Math.imul(I,ve)|0)+Math.imul(k,pe)|0))<<13)|0;c=((o=o+Math.imul(k,ve)|0)+(i>>>13)|0)+(Ce>>>26)|0,Ce&=67108863,r=Math.imul(U,oe),i=(i=Math.imul(U,se))+Math.imul(B,oe)|0,o=Math.imul(B,se),r=r+Math.imul(L,ue)|0,i=(i=i+Math.imul(L,ce)|0)+Math.imul(j,ue)|0,o=o+Math.imul(j,ce)|0,r=r+Math.imul(P,le)|0,i=(i=i+Math.imul(P,de)|0)+Math.imul(N,le)|0,o=o+Math.imul(N,de)|0;var Te=(c+(r=r+Math.imul(x,pe)|0)|0)+((8191&(i=(i=i+Math.imul(x,ve)|0)+Math.imul(C,pe)|0))<<13)|0;c=((o=o+Math.imul(C,ve)|0)+(i>>>13)|0)+(Te>>>26)|0,Te&=67108863,r=Math.imul(U,ue),i=(i=Math.imul(U,ce))+Math.imul(B,ue)|0,o=Math.imul(B,ce),r=r+Math.imul(L,le)|0,i=(i=i+Math.imul(L,de)|0)+Math.imul(j,le)|0,o=o+Math.imul(j,de)|0;var Pe=(c+(r=r+Math.imul(P,pe)|0)|0)+((8191&(i=(i=i+Math.imul(P,ve)|0)+Math.imul(N,pe)|0))<<13)|0;c=((o=o+Math.imul(N,ve)|0)+(i>>>13)|0)+(Pe>>>26)|0,Pe&=67108863,r=Math.imul(U,le),i=(i=Math.imul(U,de))+Math.imul(B,le)|0,o=Math.imul(B,de);var Ne=(c+(r=r+Math.imul(L,pe)|0)|0)+((8191&(i=(i=i+Math.imul(L,ve)|0)+Math.imul(j,pe)|0))<<13)|0;c=((o=o+Math.imul(j,ve)|0)+(i>>>13)|0)+(Ne>>>26)|0,Ne&=67108863;var Re=(c+(r=Math.imul(U,pe))|0)+((8191&(i=(i=Math.imul(U,ve))+Math.imul(B,pe)|0))<<13)|0;return c=((o=Math.imul(B,ve))+(i>>>13)|0)+(Re>>>26)|0,Re&=67108863,u[0]=ge,u[1]=me,u[2]=be,u[3]=ye,u[4]=we,u[5]=_e,u[6]=Se,u[7]=Ee,u[8]=Me,u[9]=Ae,u[10]=Ie,u[11]=ke,u[12]=Oe,u[13]=xe,u[14]=Ce,u[15]=Te,u[16]=Pe,u[17]=Ne,u[18]=Re,0!==c&&(u[19]=c,n.length++),n};function g(e,t,n){n.negative=t.negative^e.negative,n.length=e.length+t.length;for(var r=0,i=0,o=0;o>>26)|0)>>>26,s&=67108863}n.words[o]=a,r=s,s=i}return 0!==r?n.words[o]=r:n.length--,n._strip()}function m(e,t,n){return g(e,t,n)}function b(e,t){this.x=e,this.y=t}Math.imul||(v=p),o.prototype.mulTo=function(e,t){var n=this.length+e.length;return 10===this.length&&10===e.length?v(this,e,t):n<63?p(this,e,t):n<1024?g(this,e,t):m(this,e,t)},b.prototype.makeRBT=function(e){for(var t=new Array(e),n=o.prototype._countBits(e)-1,r=0;r>=1;return r},b.prototype.permute=function(e,t,n,r,i,o){for(var s=0;s>>=1)i++;return 1<>>=13,n[2*s+1]=8191&o,o>>>=13;for(s=2*t;s>=26,n+=o/67108864|0,n+=s>>>26,this.words[i]=67108863&s}return 0!==n&&(this.words[i]=n,this.length++),t?this.ineg():this},o.prototype.muln=function(e){return this.clone().imuln(e)},o.prototype.sqr=function(){return this.mul(this)},o.prototype.isqr=function(){return this.imul(this.clone())},o.prototype.pow=function(e){var t=function(e){for(var t=new Array(e.bitLength()),n=0;n>>i&1}return t}(e);if(0===t.length)return new o(1);for(var n=this,r=0;r=0);var t,n=e%26,i=(e-n)/26,o=67108863>>>26-n<<26-n;if(0!==n){var s=0;for(t=0;t>>26-n}s&&(this.words[t]=s,this.length++)}if(0!==i){for(t=this.length-1;t>=0;t--)this.words[t+i]=this.words[t];for(t=0;t=0),i=t?(t-t%26)/26:0;var o=e%26,s=Math.min((e-o)/26,this.length),a=67108863^67108863>>>o<s)for(this.length-=s,c=0;c=0&&(0!==f||c>=i);c--){var l=0|this.words[c];this.words[c]=f<<26-o|l>>>o,f=l&a}return u&&0!==f&&(u.words[u.length++]=f),0===this.length&&(this.words[0]=0,this.length=1),this._strip()},o.prototype.ishrn=function(e,t,n){return r(0===this.negative),this.iushrn(e,t,n)},o.prototype.shln=function(e){return this.clone().ishln(e)},o.prototype.ushln=function(e){return this.clone().iushln(e)},o.prototype.shrn=function(e){return this.clone().ishrn(e)},o.prototype.ushrn=function(e){return this.clone().iushrn(e)},o.prototype.testn=function(e){r("number"==typeof e&&e>=0);var t=e%26,n=(e-t)/26,i=1<=0);var t=e%26,n=(e-t)/26;if(r(0===this.negative,"imaskn works only with positive numbers"),this.length<=n)return this;if(0!==t&&n++,this.length=Math.min(n,this.length),0!==t){var i=67108863^67108863>>>t<=67108864;t++)this.words[t]-=67108864,t===this.length-1?this.words[t+1]=1:this.words[t+1]++;return this.length=Math.max(this.length,t+1),this},o.prototype.isubn=function(e){if(r("number"==typeof e),r(e<67108864),e<0)return this.iaddn(-e);if(0!==this.negative)return this.negative=0,this.iaddn(e),this.negative=1,this;if(this.words[0]-=e,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var t=0;t>26)-(u/67108864|0),this.words[i+n]=67108863&o}for(;i>26,this.words[i+n]=67108863&o;if(0===a)return this._strip();for(r(-1===a),a=0,i=0;i>26,this.words[i]=67108863&o;return this.negative=1,this._strip()},o.prototype._wordDiv=function(e,t){var n=(this.length,e.length),r=this.clone(),i=e,s=0|i.words[i.length-1];0!==(n=26-this._countBits(s))&&(i=i.ushln(n),r.iushln(n),s=0|i.words[i.length-1]);var a,u=r.length-i.length;if("mod"!==t){(a=new o(null)).length=u+1,a.words=new Array(a.length);for(var c=0;c=0;l--){var d=67108864*(0|r.words[i.length+l])+(0|r.words[i.length+l-1]);for(d=Math.min(d/s|0,67108863),r._ishlnsubmul(i,d,l);0!==r.negative;)d--,r.negative=0,r._ishlnsubmul(i,1,l),r.isZero()||(r.negative^=1);a&&(a.words[l]=d)}return a&&a._strip(),r._strip(),"div"!==t&&0!==n&&r.iushrn(n),{div:a||null,mod:r}},o.prototype.divmod=function(e,t,n){return r(!e.isZero()),this.isZero()?{div:new o(0),mod:new o(0)}:0!==this.negative&&0===e.negative?(a=this.neg().divmod(e,t),"mod"!==t&&(i=a.div.neg()),"div"!==t&&(s=a.mod.neg(),n&&0!==s.negative&&s.iadd(e)),{div:i,mod:s}):0===this.negative&&0!==e.negative?(a=this.divmod(e.neg(),t),"mod"!==t&&(i=a.div.neg()),{div:i,mod:a.mod}):0!=(this.negative&e.negative)?(a=this.neg().divmod(e.neg(),t),"div"!==t&&(s=a.mod.neg(),n&&0!==s.negative&&s.isub(e)),{div:a.div,mod:s}):e.length>this.length||this.cmp(e)<0?{div:new o(0),mod:this}:1===e.length?"div"===t?{div:this.divn(e.words[0]),mod:null}:"mod"===t?{div:null,mod:new o(this.modrn(e.words[0]))}:{div:this.divn(e.words[0]),mod:new o(this.modrn(e.words[0]))}:this._wordDiv(e,t);var i,s,a},o.prototype.div=function(e){return this.divmod(e,"div",!1).div},o.prototype.mod=function(e){return this.divmod(e,"mod",!1).mod},o.prototype.umod=function(e){return this.divmod(e,"mod",!0).mod},o.prototype.divRound=function(e){var t=this.divmod(e);if(t.mod.isZero())return t.div;var n=0!==t.div.negative?t.mod.isub(e):t.mod,r=e.ushrn(1),i=e.andln(1),o=n.cmp(r);return o<0||1===i&&0===o?t.div:0!==t.div.negative?t.div.isubn(1):t.div.iaddn(1)},o.prototype.modrn=function(e){var t=e<0;t&&(e=-e),r(e<=67108863);for(var n=(1<<26)%e,i=0,o=this.length-1;o>=0;o--)i=(n*i+(0|this.words[o]))%e;return t?-i:i},o.prototype.modn=function(e){return this.modrn(e)},o.prototype.idivn=function(e){var t=e<0;t&&(e=-e),r(e<=67108863);for(var n=0,i=this.length-1;i>=0;i--){var o=(0|this.words[i])+67108864*n;this.words[i]=o/e|0,n=o%e}return this._strip(),t?this.ineg():this},o.prototype.divn=function(e){return this.clone().idivn(e)},o.prototype.egcd=function(e){r(0===e.negative),r(!e.isZero());var t=this,n=e.clone();t=0!==t.negative?t.umod(e):t.clone();for(var i=new o(1),s=new o(0),a=new o(0),u=new o(1),c=0;t.isEven()&&n.isEven();)t.iushrn(1),n.iushrn(1),++c;for(var f=n.clone(),l=t.clone();!t.isZero();){for(var d=0,h=1;0==(t.words[0]&h)&&d<26;++d,h<<=1);if(d>0)for(t.iushrn(d);d-- >0;)(i.isOdd()||s.isOdd())&&(i.iadd(f),s.isub(l)),i.iushrn(1),s.iushrn(1);for(var p=0,v=1;0==(n.words[0]&v)&&p<26;++p,v<<=1);if(p>0)for(n.iushrn(p);p-- >0;)(a.isOdd()||u.isOdd())&&(a.iadd(f),u.isub(l)),a.iushrn(1),u.iushrn(1);t.cmp(n)>=0?(t.isub(n),i.isub(a),s.isub(u)):(n.isub(t),a.isub(i),u.isub(s))}return{a:a,b:u,gcd:n.iushln(c)}},o.prototype._invmp=function(e){r(0===e.negative),r(!e.isZero());var t=this,n=e.clone();t=0!==t.negative?t.umod(e):t.clone();for(var i,s=new o(1),a=new o(0),u=n.clone();t.cmpn(1)>0&&n.cmpn(1)>0;){for(var c=0,f=1;0==(t.words[0]&f)&&c<26;++c,f<<=1);if(c>0)for(t.iushrn(c);c-- >0;)s.isOdd()&&s.iadd(u),s.iushrn(1);for(var l=0,d=1;0==(n.words[0]&d)&&l<26;++l,d<<=1);if(l>0)for(n.iushrn(l);l-- >0;)a.isOdd()&&a.iadd(u),a.iushrn(1);t.cmp(n)>=0?(t.isub(n),s.isub(a)):(n.isub(t),a.isub(s))}return(i=0===t.cmpn(1)?s:a).cmpn(0)<0&&i.iadd(e),i},o.prototype.gcd=function(e){if(this.isZero())return e.abs();if(e.isZero())return this.abs();var t=this.clone(),n=e.clone();t.negative=0,n.negative=0;for(var r=0;t.isEven()&&n.isEven();r++)t.iushrn(1),n.iushrn(1);for(;;){for(;t.isEven();)t.iushrn(1);for(;n.isEven();)n.iushrn(1);var i=t.cmp(n);if(i<0){var o=t;t=n,n=o}else if(0===i||0===n.cmpn(1))break;t.isub(n)}return n.iushln(r)},o.prototype.invm=function(e){return this.egcd(e).a.umod(e)},o.prototype.isEven=function(){return 0==(1&this.words[0])},o.prototype.isOdd=function(){return 1==(1&this.words[0])},o.prototype.andln=function(e){return this.words[0]&e},o.prototype.bincn=function(e){r("number"==typeof e);var t=e%26,n=(e-t)/26,i=1<>>26,a&=67108863,this.words[s]=a}return 0!==o&&(this.words[s]=o,this.length++),this},o.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},o.prototype.cmpn=function(e){var t,n=e<0;if(0!==this.negative&&!n)return-1;if(0===this.negative&&n)return 1;if(this._strip(),this.length>1)t=1;else{n&&(e=-e),r(e<=67108863,"Number is too big");var i=0|this.words[0];t=i===e?0:ie.length)return 1;if(this.length=0;n--){var r=0|this.words[n],i=0|e.words[n];if(r!==i){ri&&(t=1);break}}return t},o.prototype.gtn=function(e){return 1===this.cmpn(e)},o.prototype.gt=function(e){return 1===this.cmp(e)},o.prototype.gten=function(e){return this.cmpn(e)>=0},o.prototype.gte=function(e){return this.cmp(e)>=0},o.prototype.ltn=function(e){return-1===this.cmpn(e)},o.prototype.lt=function(e){return-1===this.cmp(e)},o.prototype.lten=function(e){return this.cmpn(e)<=0},o.prototype.lte=function(e){return this.cmp(e)<=0},o.prototype.eqn=function(e){return 0===this.cmpn(e)},o.prototype.eq=function(e){return 0===this.cmp(e)},o.red=function(e){return new A(e)},o.prototype.toRed=function(e){return r(!this.red,"Already a number in reduction context"),r(0===this.negative,"red works only with positives"),e.convertTo(this)._forceRed(e)},o.prototype.fromRed=function(){return r(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},o.prototype._forceRed=function(e){return this.red=e,this},o.prototype.forceRed=function(e){return r(!this.red,"Already a number in reduction context"),this._forceRed(e)},o.prototype.redAdd=function(e){return r(this.red,"redAdd works only with red numbers"),this.red.add(this,e)},o.prototype.redIAdd=function(e){return r(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,e)},o.prototype.redSub=function(e){return r(this.red,"redSub works only with red numbers"),this.red.sub(this,e)},o.prototype.redISub=function(e){return r(this.red,"redISub works only with red numbers"),this.red.isub(this,e)},o.prototype.redShl=function(e){return r(this.red,"redShl works only with red numbers"),this.red.shl(this,e)},o.prototype.redMul=function(e){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,e),this.red.mul(this,e)},o.prototype.redIMul=function(e){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,e),this.red.imul(this,e)},o.prototype.redSqr=function(){return r(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},o.prototype.redISqr=function(){return r(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},o.prototype.redSqrt=function(){return r(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},o.prototype.redInvm=function(){return r(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},o.prototype.redNeg=function(){return r(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},o.prototype.redPow=function(e){return r(this.red&&!e.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,e)};var y={k256:null,p224:null,p192:null,p25519:null};function w(e,t){this.name=e,this.p=new o(t,16),this.n=this.p.bitLength(),this.k=new o(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function _(){w.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function S(){w.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function E(){w.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function M(){w.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function A(e){if("string"==typeof e){var t=o._prime(e);this.m=t.p,this.prime=t}else r(e.gtn(1),"modulus must be greater than 1"),this.m=e,this.prime=null}function I(e){A.call(this,e),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new o(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}w.prototype._tmp=function(){var e=new o(null);return e.words=new Array(Math.ceil(this.n/13)),e},w.prototype.ireduce=function(e){var t,n=e;do{this.split(n,this.tmp),t=(n=(n=this.imulK(n)).iadd(this.tmp)).bitLength()}while(t>this.n);var r=t0?n.isub(this.p):void 0!==n.strip?n.strip():n._strip(),n},w.prototype.split=function(e,t){e.iushrn(this.n,0,t)},w.prototype.imulK=function(e){return e.imul(this.k)},i(_,w),_.prototype.split=function(e,t){for(var n=Math.min(e.length,9),r=0;r>>22,i=o}i>>>=22,e.words[r-10]=i,0===i&&e.length>10?e.length-=10:e.length-=9},_.prototype.imulK=function(e){e.words[e.length]=0,e.words[e.length+1]=0,e.length+=2;for(var t=0,n=0;n>>=26,e.words[n]=i,t=r}return 0!==t&&(e.words[e.length++]=t),e},o._prime=function(e){if(y[e])return y[e];var t;if("k256"===e)t=new _;else if("p224"===e)t=new S;else if("p192"===e)t=new E;else{if("p25519"!==e)throw new Error("Unknown prime "+e);t=new M}return y[e]=t,t},A.prototype._verify1=function(e){r(0===e.negative,"red works only with positives"),r(e.red,"red works only with red numbers")},A.prototype._verify2=function(e,t){r(0==(e.negative|t.negative),"red works only with positives"),r(e.red&&e.red===t.red,"red works only with red numbers")},A.prototype.imod=function(e){return this.prime?this.prime.ireduce(e)._forceRed(this):(c(e,e.umod(this.m)._forceRed(this)),e)},A.prototype.neg=function(e){return e.isZero()?e.clone():this.m.sub(e)._forceRed(this)},A.prototype.add=function(e,t){this._verify2(e,t);var n=e.add(t);return n.cmp(this.m)>=0&&n.isub(this.m),n._forceRed(this)},A.prototype.iadd=function(e,t){this._verify2(e,t);var n=e.iadd(t);return n.cmp(this.m)>=0&&n.isub(this.m),n},A.prototype.sub=function(e,t){this._verify2(e,t);var n=e.sub(t);return n.cmpn(0)<0&&n.iadd(this.m),n._forceRed(this)},A.prototype.isub=function(e,t){this._verify2(e,t);var n=e.isub(t);return n.cmpn(0)<0&&n.iadd(this.m),n},A.prototype.shl=function(e,t){return this._verify1(e),this.imod(e.ushln(t))},A.prototype.imul=function(e,t){return this._verify2(e,t),this.imod(e.imul(t))},A.prototype.mul=function(e,t){return this._verify2(e,t),this.imod(e.mul(t))},A.prototype.isqr=function(e){return this.imul(e,e.clone())},A.prototype.sqr=function(e){return this.mul(e,e)},A.prototype.sqrt=function(e){if(e.isZero())return e.clone();var t=this.m.andln(3);if(r(t%2==1),3===t){var n=this.m.add(new o(1)).iushrn(2);return this.pow(e,n)}for(var i=this.m.subn(1),s=0;!i.isZero()&&0===i.andln(1);)s++,i.iushrn(1);r(!i.isZero());var a=new o(1).toRed(this),u=a.redNeg(),c=this.m.subn(1).iushrn(1),f=this.m.bitLength();for(f=new o(2*f*f).toRed(this);0!==this.pow(f,c).cmp(u);)f.redIAdd(u);for(var l=this.pow(f,i),d=this.pow(e,i.addn(1).iushrn(1)),h=this.pow(e,i),p=s;0!==h.cmp(a);){for(var v=h,g=0;0!==v.cmp(a);g++)v=v.redSqr();r(g=0;r--){for(var c=t.words[r],f=u-1;f>=0;f--){var l=c>>f&1;i!==n[0]&&(i=this.sqr(i)),0!==l||0!==s?(s<<=1,s|=l,(4===++a||0===r&&0===f)&&(i=this.mul(i,n[s]),a=0,s=0)):a=0}u=26}return i},A.prototype.convertTo=function(e){var t=e.umod(this.m);return t===e?t.clone():t},A.prototype.convertFrom=function(e){var t=e.clone();return t.red=null,t},o.mont=function(e){return new I(e)},i(I,A),I.prototype.convertTo=function(e){return this.imod(e.ushln(this.shift))},I.prototype.convertFrom=function(e){var t=this.imod(e.mul(this.rinv));return t.red=null,t},I.prototype.imul=function(e,t){if(e.isZero()||t.isZero())return e.words[0]=0,e.length=1,e;var n=e.imul(t),r=n.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=n.isub(r).iushrn(this.shift),o=i;return i.cmp(this.m)>=0?o=i.isub(this.m):i.cmpn(0)<0&&(o=i.iadd(this.m)),o._forceRed(this)},I.prototype.mul=function(e,t){if(e.isZero()||t.isZero())return new o(0)._forceRed(this);var n=e.mul(t),r=n.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=n.isub(r).iushrn(this.shift),s=i;return i.cmp(this.m)>=0?s=i.isub(this.m):i.cmpn(0)<0&&(s=i.iadd(this.m)),s._forceRed(this)},I.prototype.invm=function(e){return this.imod(e._invmp(this.m).mul(this.r2))._forceRed(this)}}(e,this)}).call(this,n(57)(e))},function(e,t){},function(e){e.exports=JSON.parse('{"name":"elliptic","version":"6.5.4","description":"EC cryptography","main":"lib/elliptic.js","files":["lib"],"scripts":{"lint":"eslint lib test","lint:fix":"npm run lint -- --fix","unit":"istanbul test _mocha --reporter=spec test/index.js","test":"npm run lint && npm run unit","version":"grunt dist && git add dist/"},"repository":{"type":"git","url":"git@github.com:indutny/elliptic"},"keywords":["EC","Elliptic","curve","Cryptography"],"author":"Fedor Indutny ","license":"MIT","bugs":{"url":"https://github.com/indutny/elliptic/issues"},"homepage":"https://github.com/indutny/elliptic","devDependencies":{"brfs":"^2.0.2","coveralls":"^3.1.0","eslint":"^7.6.0","grunt":"^1.2.1","grunt-browserify":"^5.3.0","grunt-cli":"^1.3.2","grunt-contrib-connect":"^3.0.0","grunt-contrib-copy":"^1.0.0","grunt-contrib-uglify":"^5.0.0","grunt-mocha-istanbul":"^5.0.2","grunt-saucelabs":"^9.0.1","istanbul":"^0.4.5","mocha":"^8.0.1"},"dependencies":{"bn.js":"^4.11.9","brorand":"^1.1.0","hash.js":"^1.0.0","hmac-drbg":"^1.0.1","inherits":"^2.0.4","minimalistic-assert":"^1.0.1","minimalistic-crypto-utils":"^1.0.1"}}')},function(e,t,n){"use strict";var r=n(47),i=n(29),o=n(7),s=n(95),a=r.assert;function u(e){s.call(this,"short",e),this.a=new i(e.a,16).toRed(this.red),this.b=new i(e.b,16).toRed(this.red),this.tinv=this.two.redInvm(),this.zeroA=0===this.a.fromRed().cmpn(0),this.threeA=0===this.a.fromRed().sub(this.p).cmpn(-3),this.endo=this._getEndomorphism(e),this._endoWnafT1=new Array(4),this._endoWnafT2=new Array(4)}function c(e,t,n,r){s.BasePoint.call(this,e,"affine"),null===t&&null===n?(this.x=null,this.y=null,this.inf=!0):(this.x=new i(t,16),this.y=new i(n,16),r&&(this.x.forceRed(this.curve.red),this.y.forceRed(this.curve.red)),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.inf=!1)}function f(e,t,n,r){s.BasePoint.call(this,e,"jacobian"),null===t&&null===n&&null===r?(this.x=this.curve.one,this.y=this.curve.one,this.z=new i(0)):(this.x=new i(t,16),this.y=new i(n,16),this.z=new i(r,16)),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)),this.zOne=this.z===this.curve.one}o(u,s),e.exports=u,u.prototype._getEndomorphism=function(e){if(this.zeroA&&this.g&&this.n&&1===this.p.modn(3)){var t,n;if(e.beta)t=new i(e.beta,16).toRed(this.red);else{var r=this._getEndoRoots(this.p);t=(t=r[0].cmp(r[1])<0?r[0]:r[1]).toRed(this.red)}if(e.lambda)n=new i(e.lambda,16);else{var o=this._getEndoRoots(this.n);0===this.g.mul(o[0]).x.cmp(this.g.x.redMul(t))?n=o[0]:(n=o[1],a(0===this.g.mul(n).x.cmp(this.g.x.redMul(t))))}return{beta:t,lambda:n,basis:e.basis?e.basis.map((function(e){return{a:new i(e.a,16),b:new i(e.b,16)}})):this._getEndoBasis(n)}}},u.prototype._getEndoRoots=function(e){var t=e===this.p?this.red:i.mont(e),n=new i(2).toRed(t).redInvm(),r=n.redNeg(),o=new i(3).toRed(t).redNeg().redSqrt().redMul(n);return[r.redAdd(o).fromRed(),r.redSub(o).fromRed()]},u.prototype._getEndoBasis=function(e){for(var t,n,r,o,s,a,u,c,f,l=this.n.ushrn(Math.floor(this.n.bitLength()/2)),d=e,h=this.n.clone(),p=new i(1),v=new i(0),g=new i(0),m=new i(1),b=0;0!==d.cmpn(0);){var y=h.div(d);c=h.sub(y.mul(d)),f=g.sub(y.mul(p));var w=m.sub(y.mul(v));if(!r&&c.cmp(l)<0)t=u.neg(),n=p,r=c.neg(),o=f;else if(r&&2==++b)break;u=c,h=d,d=c,g=p,p=f,m=v,v=w}s=c.neg(),a=f;var _=r.sqr().add(o.sqr());return s.sqr().add(a.sqr()).cmp(_)>=0&&(s=t,a=n),r.negative&&(r=r.neg(),o=o.neg()),s.negative&&(s=s.neg(),a=a.neg()),[{a:r,b:o},{a:s,b:a}]},u.prototype._endoSplit=function(e){var t=this.endo.basis,n=t[0],r=t[1],i=r.b.mul(e).divRound(this.n),o=n.b.neg().mul(e).divRound(this.n),s=i.mul(n.a),a=o.mul(r.a),u=i.mul(n.b),c=o.mul(r.b);return{k1:e.sub(s).sub(a),k2:u.add(c).neg()}},u.prototype.pointFromX=function(e,t){(e=new i(e,16)).red||(e=e.toRed(this.red));var n=e.redSqr().redMul(e).redIAdd(e.redMul(this.a)).redIAdd(this.b),r=n.redSqrt();if(0!==r.redSqr().redSub(n).cmp(this.zero))throw new Error("invalid point");var o=r.fromRed().isOdd();return(t&&!o||!t&&o)&&(r=r.redNeg()),this.point(e,r)},u.prototype.validate=function(e){if(e.inf)return!0;var t=e.x,n=e.y,r=this.a.redMul(t),i=t.redSqr().redMul(t).redIAdd(r).redIAdd(this.b);return 0===n.redSqr().redISub(i).cmpn(0)},u.prototype._endoWnafMulAdd=function(e,t,n){for(var r=this._endoWnafT1,i=this._endoWnafT2,o=0;o":""},c.prototype.isInfinity=function(){return this.inf},c.prototype.add=function(e){if(this.inf)return e;if(e.inf)return this;if(this.eq(e))return this.dbl();if(this.neg().eq(e))return this.curve.point(null,null);if(0===this.x.cmp(e.x))return this.curve.point(null,null);var t=this.y.redSub(e.y);0!==t.cmpn(0)&&(t=t.redMul(this.x.redSub(e.x).redInvm()));var n=t.redSqr().redISub(this.x).redISub(e.x),r=t.redMul(this.x.redSub(n)).redISub(this.y);return this.curve.point(n,r)},c.prototype.dbl=function(){if(this.inf)return this;var e=this.y.redAdd(this.y);if(0===e.cmpn(0))return this.curve.point(null,null);var t=this.curve.a,n=this.x.redSqr(),r=e.redInvm(),i=n.redAdd(n).redIAdd(n).redIAdd(t).redMul(r),o=i.redSqr().redISub(this.x.redAdd(this.x)),s=i.redMul(this.x.redSub(o)).redISub(this.y);return this.curve.point(o,s)},c.prototype.getX=function(){return this.x.fromRed()},c.prototype.getY=function(){return this.y.fromRed()},c.prototype.mul=function(e){return e=new i(e,16),this.isInfinity()?this:this._hasDoubles(e)?this.curve._fixedNafMul(this,e):this.curve.endo?this.curve._endoWnafMulAdd([this],[e]):this.curve._wnafMul(this,e)},c.prototype.mulAdd=function(e,t,n){var r=[this,t],i=[e,n];return this.curve.endo?this.curve._endoWnafMulAdd(r,i):this.curve._wnafMulAdd(1,r,i,2)},c.prototype.jmulAdd=function(e,t,n){var r=[this,t],i=[e,n];return this.curve.endo?this.curve._endoWnafMulAdd(r,i,!0):this.curve._wnafMulAdd(1,r,i,2,!0)},c.prototype.eq=function(e){return this===e||this.inf===e.inf&&(this.inf||0===this.x.cmp(e.x)&&0===this.y.cmp(e.y))},c.prototype.neg=function(e){if(this.inf)return this;var t=this.curve.point(this.x,this.y.redNeg());if(e&&this.precomputed){var n=this.precomputed,r=function(e){return e.neg()};t.precomputed={naf:n.naf&&{wnd:n.naf.wnd,points:n.naf.points.map(r)},doubles:n.doubles&&{step:n.doubles.step,points:n.doubles.points.map(r)}}}return t},c.prototype.toJ=function(){return this.inf?this.curve.jpoint(null,null,null):this.curve.jpoint(this.x,this.y,this.curve.one)},o(f,s.BasePoint),u.prototype.jpoint=function(e,t,n){return new f(this,e,t,n)},f.prototype.toP=function(){if(this.isInfinity())return this.curve.point(null,null);var e=this.z.redInvm(),t=e.redSqr(),n=this.x.redMul(t),r=this.y.redMul(t).redMul(e);return this.curve.point(n,r)},f.prototype.neg=function(){return this.curve.jpoint(this.x,this.y.redNeg(),this.z)},f.prototype.add=function(e){if(this.isInfinity())return e;if(e.isInfinity())return this;var t=e.z.redSqr(),n=this.z.redSqr(),r=this.x.redMul(t),i=e.x.redMul(n),o=this.y.redMul(t.redMul(e.z)),s=e.y.redMul(n.redMul(this.z)),a=r.redSub(i),u=o.redSub(s);if(0===a.cmpn(0))return 0!==u.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var c=a.redSqr(),f=c.redMul(a),l=r.redMul(c),d=u.redSqr().redIAdd(f).redISub(l).redISub(l),h=u.redMul(l.redISub(d)).redISub(o.redMul(f)),p=this.z.redMul(e.z).redMul(a);return this.curve.jpoint(d,h,p)},f.prototype.mixedAdd=function(e){if(this.isInfinity())return e.toJ();if(e.isInfinity())return this;var t=this.z.redSqr(),n=this.x,r=e.x.redMul(t),i=this.y,o=e.y.redMul(t).redMul(this.z),s=n.redSub(r),a=i.redSub(o);if(0===s.cmpn(0))return 0!==a.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var u=s.redSqr(),c=u.redMul(s),f=n.redMul(u),l=a.redSqr().redIAdd(c).redISub(f).redISub(f),d=a.redMul(f.redISub(l)).redISub(i.redMul(c)),h=this.z.redMul(s);return this.curve.jpoint(l,d,h)},f.prototype.dblp=function(e){if(0===e)return this;if(this.isInfinity())return this;if(!e)return this.dbl();var t;if(this.curve.zeroA||this.curve.threeA){var n=this;for(t=0;t=0)return!1;if(n.redIAdd(i),0===this.x.cmp(n))return!0}},f.prototype.inspect=function(){return this.isInfinity()?"":""},f.prototype.isInfinity=function(){return 0===this.z.cmpn(0)}},function(e,t,n){"use strict";var r=n(29),i=n(7),o=n(95),s=n(47);function a(e){o.call(this,"mont",e),this.a=new r(e.a,16).toRed(this.red),this.b=new r(e.b,16).toRed(this.red),this.i4=new r(4).toRed(this.red).redInvm(),this.two=new r(2).toRed(this.red),this.a24=this.i4.redMul(this.a.redAdd(this.two))}function u(e,t,n){o.BasePoint.call(this,e,"projective"),null===t&&null===n?(this.x=this.curve.one,this.z=this.curve.zero):(this.x=new r(t,16),this.z=new r(n,16),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)))}i(a,o),e.exports=a,a.prototype.validate=function(e){var t=e.normalize().x,n=t.redSqr(),r=n.redMul(t).redAdd(n.redMul(this.a)).redAdd(t);return 0===r.redSqrt().redSqr().cmp(r)},i(u,o.BasePoint),a.prototype.decodePoint=function(e,t){return this.point(s.toArray(e,t),1)},a.prototype.point=function(e,t){return new u(this,e,t)},a.prototype.pointFromJSON=function(e){return u.fromJSON(this,e)},u.prototype.precompute=function(){},u.prototype._encode=function(){return this.getX().toArray("be",this.curve.p.byteLength())},u.fromJSON=function(e,t){return new u(e,t[0],t[1]||e.one)},u.prototype.inspect=function(){return this.isInfinity()?"":""},u.prototype.isInfinity=function(){return 0===this.z.cmpn(0)},u.prototype.dbl=function(){var e=this.x.redAdd(this.z).redSqr(),t=this.x.redSub(this.z).redSqr(),n=e.redSub(t),r=e.redMul(t),i=n.redMul(t.redAdd(this.curve.a24.redMul(n)));return this.curve.point(r,i)},u.prototype.add=function(){throw new Error("Not supported on Montgomery curve")},u.prototype.diffAdd=function(e,t){var n=this.x.redAdd(this.z),r=this.x.redSub(this.z),i=e.x.redAdd(e.z),o=e.x.redSub(e.z).redMul(n),s=i.redMul(r),a=t.z.redMul(o.redAdd(s).redSqr()),u=t.x.redMul(o.redISub(s).redSqr());return this.curve.point(a,u)},u.prototype.mul=function(e){for(var t=e.clone(),n=this,r=this.curve.point(null,null),i=[];0!==t.cmpn(0);t.iushrn(1))i.push(t.andln(1));for(var o=i.length-1;o>=0;o--)0===i[o]?(n=n.diffAdd(r,this),r=r.dbl()):(r=n.diffAdd(r,this),n=n.dbl());return r},u.prototype.mulAdd=function(){throw new Error("Not supported on Montgomery curve")},u.prototype.jumlAdd=function(){throw new Error("Not supported on Montgomery curve")},u.prototype.eq=function(e){return 0===this.getX().cmp(e.getX())},u.prototype.normalize=function(){return this.x=this.x.redMul(this.z.redInvm()),this.z=this.curve.one,this},u.prototype.getX=function(){return this.normalize(),this.x.fromRed()}},function(e,t,n){"use strict";var r=n(47),i=n(29),o=n(7),s=n(95),a=r.assert;function u(e){this.twisted=1!=(0|e.a),this.mOneA=this.twisted&&-1==(0|e.a),this.extended=this.mOneA,s.call(this,"edwards",e),this.a=new i(e.a,16).umod(this.red.m),this.a=this.a.toRed(this.red),this.c=new i(e.c,16).toRed(this.red),this.c2=this.c.redSqr(),this.d=new i(e.d,16).toRed(this.red),this.dd=this.d.redAdd(this.d),a(!this.twisted||0===this.c.fromRed().cmpn(1)),this.oneC=1==(0|e.c)}function c(e,t,n,r,o){s.BasePoint.call(this,e,"projective"),null===t&&null===n&&null===r?(this.x=this.curve.zero,this.y=this.curve.one,this.z=this.curve.one,this.t=this.curve.zero,this.zOne=!0):(this.x=new i(t,16),this.y=new i(n,16),this.z=r?new i(r,16):this.curve.one,this.t=o&&new i(o,16),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)),this.t&&!this.t.red&&(this.t=this.t.toRed(this.curve.red)),this.zOne=this.z===this.curve.one,this.curve.extended&&!this.t&&(this.t=this.x.redMul(this.y),this.zOne||(this.t=this.t.redMul(this.z.redInvm()))))}o(u,s),e.exports=u,u.prototype._mulA=function(e){return this.mOneA?e.redNeg():this.a.redMul(e)},u.prototype._mulC=function(e){return this.oneC?e:this.c.redMul(e)},u.prototype.jpoint=function(e,t,n,r){return this.point(e,t,n,r)},u.prototype.pointFromX=function(e,t){(e=new i(e,16)).red||(e=e.toRed(this.red));var n=e.redSqr(),r=this.c2.redSub(this.a.redMul(n)),o=this.one.redSub(this.c2.redMul(this.d).redMul(n)),s=r.redMul(o.redInvm()),a=s.redSqrt();if(0!==a.redSqr().redSub(s).cmp(this.zero))throw new Error("invalid point");var u=a.fromRed().isOdd();return(t&&!u||!t&&u)&&(a=a.redNeg()),this.point(e,a)},u.prototype.pointFromY=function(e,t){(e=new i(e,16)).red||(e=e.toRed(this.red));var n=e.redSqr(),r=n.redSub(this.c2),o=n.redMul(this.d).redMul(this.c2).redSub(this.a),s=r.redMul(o.redInvm());if(0===s.cmp(this.zero)){if(t)throw new Error("invalid point");return this.point(this.zero,e)}var a=s.redSqrt();if(0!==a.redSqr().redSub(s).cmp(this.zero))throw new Error("invalid point");return a.fromRed().isOdd()!==t&&(a=a.redNeg()),this.point(a,e)},u.prototype.validate=function(e){if(e.isInfinity())return!0;e.normalize();var t=e.x.redSqr(),n=e.y.redSqr(),r=t.redMul(this.a).redAdd(n),i=this.c2.redMul(this.one.redAdd(this.d.redMul(t).redMul(n)));return 0===r.cmp(i)},o(c,s.BasePoint),u.prototype.pointFromJSON=function(e){return c.fromJSON(this,e)},u.prototype.point=function(e,t,n,r){return new c(this,e,t,n,r)},c.fromJSON=function(e,t){return new c(e,t[0],t[1],t[2])},c.prototype.inspect=function(){return this.isInfinity()?"":""},c.prototype.isInfinity=function(){return 0===this.x.cmpn(0)&&(0===this.y.cmp(this.z)||this.zOne&&0===this.y.cmp(this.curve.c))},c.prototype._extDbl=function(){var e=this.x.redSqr(),t=this.y.redSqr(),n=this.z.redSqr();n=n.redIAdd(n);var r=this.curve._mulA(e),i=this.x.redAdd(this.y).redSqr().redISub(e).redISub(t),o=r.redAdd(t),s=o.redSub(n),a=r.redSub(t),u=i.redMul(s),c=o.redMul(a),f=i.redMul(a),l=s.redMul(o);return this.curve.point(u,c,l,f)},c.prototype._projDbl=function(){var e,t,n,r,i,o,s=this.x.redAdd(this.y).redSqr(),a=this.x.redSqr(),u=this.y.redSqr();if(this.curve.twisted){var c=(r=this.curve._mulA(a)).redAdd(u);this.zOne?(e=s.redSub(a).redSub(u).redMul(c.redSub(this.curve.two)),t=c.redMul(r.redSub(u)),n=c.redSqr().redSub(c).redSub(c)):(i=this.z.redSqr(),o=c.redSub(i).redISub(i),e=s.redSub(a).redISub(u).redMul(o),t=c.redMul(r.redSub(u)),n=c.redMul(o))}else r=a.redAdd(u),i=this.curve._mulC(this.z).redSqr(),o=r.redSub(i).redSub(i),e=this.curve._mulC(s.redISub(r)).redMul(o),t=this.curve._mulC(r).redMul(a.redISub(u)),n=r.redMul(o);return this.curve.point(e,t,n)},c.prototype.dbl=function(){return this.isInfinity()?this:this.curve.extended?this._extDbl():this._projDbl()},c.prototype._extAdd=function(e){var t=this.y.redSub(this.x).redMul(e.y.redSub(e.x)),n=this.y.redAdd(this.x).redMul(e.y.redAdd(e.x)),r=this.t.redMul(this.curve.dd).redMul(e.t),i=this.z.redMul(e.z.redAdd(e.z)),o=n.redSub(t),s=i.redSub(r),a=i.redAdd(r),u=n.redAdd(t),c=o.redMul(s),f=a.redMul(u),l=o.redMul(u),d=s.redMul(a);return this.curve.point(c,f,d,l)},c.prototype._projAdd=function(e){var t,n,r=this.z.redMul(e.z),i=r.redSqr(),o=this.x.redMul(e.x),s=this.y.redMul(e.y),a=this.curve.d.redMul(o).redMul(s),u=i.redSub(a),c=i.redAdd(a),f=this.x.redAdd(this.y).redMul(e.x.redAdd(e.y)).redISub(o).redISub(s),l=r.redMul(u).redMul(f);return this.curve.twisted?(t=r.redMul(c).redMul(s.redSub(this.curve._mulA(o))),n=u.redMul(c)):(t=r.redMul(c).redMul(s.redSub(o)),n=this.curve._mulC(u).redMul(c)),this.curve.point(l,t,n)},c.prototype.add=function(e){return this.isInfinity()?e:e.isInfinity()?this:this.curve.extended?this._extAdd(e):this._projAdd(e)},c.prototype.mul=function(e){return this._hasDoubles(e)?this.curve._fixedNafMul(this,e):this.curve._wnafMul(this,e)},c.prototype.mulAdd=function(e,t,n){return this.curve._wnafMulAdd(1,[this,t],[e,n],2,!1)},c.prototype.jmulAdd=function(e,t,n){return this.curve._wnafMulAdd(1,[this,t],[e,n],2,!0)},c.prototype.normalize=function(){if(this.zOne)return this;var e=this.z.redInvm();return this.x=this.x.redMul(e),this.y=this.y.redMul(e),this.t&&(this.t=this.t.redMul(e)),this.z=this.curve.one,this.zOne=!0,this},c.prototype.neg=function(){return this.curve.point(this.x.redNeg(),this.y,this.z,this.t&&this.t.redNeg())},c.prototype.getX=function(){return this.normalize(),this.x.fromRed()},c.prototype.getY=function(){return this.normalize(),this.y.fromRed()},c.prototype.eq=function(e){return this===e||0===this.getX().cmp(e.getX())&&0===this.getY().cmp(e.getY())},c.prototype.eqXToP=function(e){var t=e.toRed(this.curve.red).redMul(this.z);if(0===this.x.cmp(t))return!0;for(var n=e.clone(),r=this.curve.redN.redMul(this.z);;){if(n.iadd(this.curve.n),n.cmp(this.curve.p)>=0)return!1;if(t.redIAdd(r),0===this.x.cmp(t))return!0}},c.prototype.toP=c.prototype.normalize,c.prototype.mixedAdd=c.prototype.add},function(e,t,n){"use strict";t.sha1=n(336),t.sha224=n(337),t.sha256=n(201),t.sha384=n(338),t.sha512=n(202)},function(e,t,n){"use strict";var r=n(51),i=n(82),o=n(200),s=r.rotl32,a=r.sum32,u=r.sum32_5,c=o.ft_1,f=i.BlockHash,l=[1518500249,1859775393,2400959708,3395469782];function d(){if(!(this instanceof d))return new d;f.call(this),this.h=[1732584193,4023233417,2562383102,271733878,3285377520],this.W=new Array(80)}r.inherits(d,f),e.exports=d,d.blockSize=512,d.outSize=160,d.hmacStrength=80,d.padLength=64,d.prototype._update=function(e,t){for(var n=this.W,r=0;r<16;r++)n[r]=e[t+r];for(;rthis.blockSize&&(e=(new this.Hash).update(e).digest()),i(e.length<=this.blockSize);for(var t=e.length;t0))return s.iaddn(1),this.keyFromPrivate(s)}},l.prototype._truncateToN=function(e,t){var n=8*e.byteLength()-this.n.bitLength();return n>0&&(e=e.ushrn(n)),!t&&e.cmp(this.n)>=0?e.sub(this.n):e},l.prototype.sign=function(e,t,n,o){"object"==typeof n&&(o=n,n=null),o||(o={}),t=this.keyFromPrivate(t,n),e=this._truncateToN(new r(e,16));for(var s=this.n.byteLength(),a=t.getPrivate().toArray("be",s),u=e.toArray("be",s),c=new i({hash:this.hash,entropy:a,nonce:u,pers:o.pers,persEnc:o.persEnc||"utf8"}),l=this.n.sub(new r(1)),d=0;;d++){var h=o.k?o.k(d):new r(c.generate(this.n.byteLength()));if(!((h=this._truncateToN(h,!0)).cmpn(1)<=0||h.cmp(l)>=0)){var p=this.g.mul(h);if(!p.isInfinity()){var v=p.getX(),g=v.umod(this.n);if(0!==g.cmpn(0)){var m=h.invm(this.n).mul(g.mul(t.getPrivate()).iadd(e));if(0!==(m=m.umod(this.n)).cmpn(0)){var b=(p.getY().isOdd()?1:0)|(0!==v.cmp(g)?2:0);return o.canonical&&m.cmp(this.nh)>0&&(m=this.n.sub(m),b^=1),new f({r:g,s:m,recoveryParam:b})}}}}}},l.prototype.verify=function(e,t,n,i){e=this._truncateToN(new r(e,16)),n=this.keyFromPublic(n,i);var o=(t=new f(t,"hex")).r,s=t.s;if(o.cmpn(1)<0||o.cmp(this.n)>=0)return!1;if(s.cmpn(1)<0||s.cmp(this.n)>=0)return!1;var a,u=s.invm(this.n),c=u.mul(e).umod(this.n),l=u.mul(o).umod(this.n);return this.curve._maxwellTrick?!(a=this.g.jmulAdd(c,n.getPublic(),l)).isInfinity()&&a.eqXToP(o):!(a=this.g.mulAdd(c,n.getPublic(),l)).isInfinity()&&0===a.getX().umod(this.n).cmp(o)},l.prototype.recoverPubKey=function(e,t,n,i){u((3&n)===n,"The recovery param is more than two bits"),t=new f(t,i);var o=this.n,s=new r(e),a=t.r,c=t.s,l=1&n,d=n>>1;if(a.cmp(this.curve.p.umod(this.curve.n))>=0&&d)throw new Error("Unable to find sencond key candinate");a=d?this.curve.pointFromX(a.add(this.curve.n),l):this.curve.pointFromX(a,l);var h=t.r.invm(o),p=o.sub(s).mul(h).umod(o),v=c.mul(h).umod(o);return this.g.mulAdd(p,a,v)},l.prototype.getKeyRecoveryParam=function(e,t,n,r){if(null!==(t=new f(t,r)).recoveryParam)return t.recoveryParam;for(var i=0;i<4;i++){var o;try{o=this.recoverPubKey(e,t,i)}catch(e){continue}if(o.eq(n))return i}throw new Error("Unable to find valid recovery factor")}},function(e,t,n){"use strict";var r=n(129),i=n(198),o=n(46);function s(e){if(!(this instanceof s))return new s(e);this.hash=e.hash,this.predResist=!!e.predResist,this.outLen=this.hash.outSize,this.minEntropy=e.minEntropy||this.hash.hmacStrength,this._reseed=null,this.reseedInterval=null,this.K=null,this.V=null;var t=i.toArray(e.entropy,e.entropyEnc||"hex"),n=i.toArray(e.nonce,e.nonceEnc||"hex"),r=i.toArray(e.pers,e.persEnc||"hex");o(t.length>=this.minEntropy/8,"Not enough entropy. Minimum is: "+this.minEntropy+" bits"),this._init(t,n,r)}e.exports=s,s.prototype._init=function(e,t,n){var r=e.concat(t).concat(n);this.K=new Array(this.outLen/8),this.V=new Array(this.outLen/8);for(var i=0;i=this.minEntropy/8,"Not enough entropy. Minimum is: "+this.minEntropy+" bits"),this._update(e.concat(n||[])),this._reseed=1},s.prototype.generate=function(e,t,n,r){if(this._reseed>this.reseedInterval)throw new Error("Reseed is required");"string"!=typeof t&&(r=n,n=t,t=null),n&&(n=i.toArray(n,r||"hex"),this._update(n));for(var o=[];o.length"}},function(e,t,n){"use strict";var r=n(29),i=n(47),o=i.assert;function s(e,t){if(e instanceof s)return e;this._importDER(e,t)||(o(e.r&&e.s,"Signature without r or s"),this.r=new r(e.r,16),this.s=new r(e.s,16),void 0===e.recoveryParam?this.recoveryParam=null:this.recoveryParam=e.recoveryParam)}function a(){this.place=0}function u(e,t){var n=e[t.place++];if(!(128&n))return n;var r=15&n;if(0===r||r>4)return!1;for(var i=0,o=0,s=t.place;o>>=0;return!(i<=127)&&(t.place=s,i)}function c(e){for(var t=0,n=e.length-1;!e[t]&&!(128&e[t+1])&&t>>3);for(e.push(128|n);--n;)e.push(t>>>(n<<3)&255);e.push(t)}}e.exports=s,s.prototype._importDER=function(e,t){e=i.toArray(e,t);var n=new a;if(48!==e[n.place++])return!1;var o=u(e,n);if(!1===o)return!1;if(o+n.place!==e.length)return!1;if(2!==e[n.place++])return!1;var s=u(e,n);if(!1===s)return!1;var c=e.slice(n.place,s+n.place);if(n.place+=s,2!==e[n.place++])return!1;var f=u(e,n);if(!1===f)return!1;if(e.length!==f+n.place)return!1;var l=e.slice(n.place,f+n.place);if(0===c[0]){if(!(128&c[1]))return!1;c=c.slice(1)}if(0===l[0]){if(!(128&l[1]))return!1;l=l.slice(1)}return this.r=new r(c),this.s=new r(l),this.recoveryParam=null,!0},s.prototype.toDER=function(e){var t=this.r.toArray(),n=this.s.toArray();for(128&t[0]&&(t=[0].concat(t)),128&n[0]&&(n=[0].concat(n)),t=c(t),n=c(n);!(n[0]||128&n[1]);)n=n.slice(1);var r=[2];f(r,t.length),(r=r.concat(t)).push(2),f(r,n.length);var o=r.concat(n),s=[48];return f(s,o.length),s=s.concat(o),i.encode(s,e)}},function(e,t,n){"use strict";var r=n(129),i=n(128),o=n(47),s=o.assert,a=o.parseBytes,u=n(347),c=n(348);function f(e){if(s("ed25519"===e,"only tested with ed25519 so far"),!(this instanceof f))return new f(e);e=i[e].curve,this.curve=e,this.g=e.g,this.g.precompute(e.n.bitLength()+1),this.pointClass=e.point().constructor,this.encodingLength=Math.ceil(e.n.bitLength()/8),this.hash=r.sha512}e.exports=f,f.prototype.sign=function(e,t){e=a(e);var n=this.keyFromSecret(t),r=this.hashInt(n.messagePrefix(),e),i=this.g.mul(r),o=this.encodePoint(i),s=this.hashInt(o,n.pubBytes(),e).mul(n.priv()),u=r.add(s).umod(this.curve.n);return this.makeSignature({R:i,S:u,Rencoded:o})},f.prototype.verify=function(e,t,n){e=a(e),t=this.makeSignature(t);var r=this.keyFromPublic(n),i=this.hashInt(t.Rencoded(),r.pubBytes(),e),o=this.g.mul(t.S());return t.R().add(r.pub().mul(i)).eq(o)},f.prototype.hashInt=function(){for(var e=this.hash(),t=0;t=t)throw new Error("invalid sig")}e.exports=function(e,t,n,c,f){var l=s(n);if("ec"===l.type){if("ecdsa"!==c&&"ecdsa/rsa"!==c)throw new Error("wrong public key type");return function(e,t,n){var r=a[n.data.algorithm.curve.join(".")];if(!r)throw new Error("unknown curve "+n.data.algorithm.curve.join("."));var i=new o(r),s=n.data.subjectPrivateKey.data;return i.verify(t,e,s)}(e,t,l)}if("dsa"===l.type){if("dsa"!==c)throw new Error("wrong public key type");return function(e,t,n){var r=n.data.p,o=n.data.q,a=n.data.g,c=n.data.pub_key,f=s.signature.decode(e,"der"),l=f.s,d=f.r;u(l,o),u(d,o);var h=i.mont(r),p=l.invm(o);return 0===a.toRed(h).redPow(new i(t).mul(p).mod(o)).fromRed().mul(c.toRed(h).redPow(d.mul(p).mod(o)).fromRed()).mod(r).mod(o).cmp(d)}(e,t,l)}if("rsa"!==c&&"ecdsa/rsa"!==c)throw new Error("wrong public key type");t=r.concat([f,t]);for(var d=l.modulus.byteLength(),h=[1],p=0;t.length+h.length+2n-d-2)throw new Error("message too long");var h=l.alloc(n-r-d-2),p=n-f-1,v=i(f),g=a(l.concat([c,h,l.alloc(1,1),t],p),s(v,p)),m=a(v,s(g,f));return new u(l.concat([l.alloc(1),m,g],n))}(p,t);else if(1===d)h=function(e,t,n){var r,o=t.length,s=e.modulus.byteLength();if(o>s-11)throw new Error("message too long");r=n?l.alloc(s-o-3,255):function(e){var t,n=l.allocUnsafe(e),r=0,o=i(2*e),s=0;for(;r=0)throw new Error("data too long for modulus")}return n?f(h,p):c(h,p)}},function(e,t,n){var r=n(96),i=n(210),o=n(211),s=n(29),a=n(126),u=n(79),c=n(212),f=n(8).Buffer;e.exports=function(e,t,n){var l;l=e.padding?e.padding:n?1:4;var d,h=r(e),p=h.modulus.byteLength();if(t.length>p||new s(t).cmp(h.modulus)>=0)throw new Error("decryption error");d=n?c(new s(t),h):a(t,h);var v=f.alloc(p-d.length);if(d=f.concat([v,d],p),4===l)return function(e,t){var n=e.modulus.byteLength(),r=u("sha1").update(f.alloc(0)).digest(),s=r.length;if(0!==t[0])throw new Error("decryption error");var a=t.slice(1,s+1),c=t.slice(s+1),l=o(a,i(c,s)),d=o(c,i(l,n-s-1));if(function(e,t){e=f.from(e),t=f.from(t);var n=0,r=e.length;e.length!==t.length&&(n++,r=Math.min(e.length,t.length));var i=-1;for(;++i=t.length){o++;break}var s=t.slice(2,i-1);("0002"!==r.toString("hex")&&!n||"0001"!==r.toString("hex")&&n)&&o++;s.length<8&&o++;if(o)throw new Error("decryption error");return t.slice(i)}(0,d,n);if(3===l)return d;throw new Error("unknown padding")}},function(e,t,n){"use strict";(function(e,r){function i(){throw new Error("secure random number generation not supported by this browser\nuse chrome, FireFox or Internet Explorer 11")}var o=n(8),s=n(66),a=o.Buffer,u=o.kMaxLength,c=e.crypto||e.msCrypto,f=Math.pow(2,32)-1;function l(e,t){if("number"!=typeof e||e!=e)throw new TypeError("offset must be a number");if(e>f||e<0)throw new TypeError("offset must be a uint32");if(e>u||e>t)throw new RangeError("offset out of range")}function d(e,t,n){if("number"!=typeof e||e!=e)throw new TypeError("size must be a number");if(e>f||e<0)throw new TypeError("size must be a uint32");if(e+t>n||e>u)throw new RangeError("buffer too small")}function h(e,t,n,i){if(r.browser){var o=e.buffer,a=new Uint8Array(o,t,n);return c.getRandomValues(a),i?void r.nextTick((function(){i(null,e)})):e}if(!i)return s(n).copy(e,t),e;s(n,(function(n,r){if(n)return i(n);r.copy(e,t),i(null,e)}))}c&&c.getRandomValues||!r.browser?(t.randomFill=function(t,n,r,i){if(!(a.isBuffer(t)||t instanceof e.Uint8Array))throw new TypeError('"buf" argument must be a Buffer or Uint8Array');if("function"==typeof n)i=n,n=0,r=t.length;else if("function"==typeof r)i=r,r=t.length-n;else if("function"!=typeof i)throw new TypeError('"cb" argument must be a function');return l(n,t.length),d(r,n,t.length),h(t,n,r,i)},t.randomFillSync=function(t,n,r){void 0===n&&(n=0);if(!(a.isBuffer(t)||t instanceof e.Uint8Array))throw new TypeError('"buf" argument must be a Buffer or Uint8Array');l(n,t.length),void 0===r&&(r=t.length-n);return d(r,n,t.length),h(t,n,r)}):(t.randomFill=i,t.randomFillSync=i)}).call(this,n(31),n(20))},function(e,t,n){e.exports=self.fetch||(self.fetch=n(213).default||n(213))},function(e,t,n){(function(e,r){var i;/*! https://mths.be/punycode v1.4.1 by @mathias */!function(o){t&&t.nodeType,e&&e.nodeType;var s="object"==typeof r&&r;s.global!==s&&s.window!==s&&s.self;var a,u=2147483647,c=/^xn--/,f=/[^\x20-\x7E]/,l=/[\x2E\u3002\uFF0E\uFF61]/g,d={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},h=Math.floor,p=String.fromCharCode;function v(e){throw new RangeError(d[e])}function g(e,t){for(var n=e.length,r=[];n--;)r[n]=t(e[n]);return r}function m(e,t){var n=e.split("@"),r="";return n.length>1&&(r=n[0]+"@",e=n[1]),r+g((e=e.replace(l,".")).split("."),t).join(".")}function b(e){for(var t,n,r=[],i=0,o=e.length;i=55296&&t<=56319&&i65535&&(t+=p((e-=65536)>>>10&1023|55296),e=56320|1023&e),t+=p(e)})).join("")}function w(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function _(e,t,n){var r=0;for(e=n?h(e/700):e>>1,e+=h(e/t);e>455;r+=36)e=h(e/35);return h(r+36*e/(e+38))}function S(e){var t,n,r,i,o,s,a,c,f,l,d,p=[],g=e.length,m=0,b=128,w=72;for((n=e.lastIndexOf("-"))<0&&(n=0),r=0;r=128&&v("not-basic"),p.push(e.charCodeAt(r));for(i=n>0?n+1:0;i=g&&v("invalid-input"),((c=(d=e.charCodeAt(i++))-48<10?d-22:d-65<26?d-65:d-97<26?d-97:36)>=36||c>h((u-m)/s))&&v("overflow"),m+=c*s,!(c<(f=a<=w?1:a>=w+26?26:a-w));a+=36)s>h(u/(l=36-f))&&v("overflow"),s*=l;w=_(m-o,t=p.length+1,0==o),h(m/t)>u-b&&v("overflow"),b+=h(m/t),m%=t,p.splice(m++,0,b)}return y(p)}function E(e){var t,n,r,i,o,s,a,c,f,l,d,g,m,y,S,E=[];for(g=(e=b(e)).length,t=128,n=0,o=72,s=0;s=t&&dh((u-n)/(m=r+1))&&v("overflow"),n+=(a-t)*m,t=a,s=0;su&&v("overflow"),d==t){for(c=n,f=36;!(c<(l=f<=o?1:f>=o+26?26:f-o));f+=36)S=c-l,y=36-l,E.push(p(w(l+S%y,0))),c=h(S/y);E.push(p(w(c,0))),o=_(n,m,r==i),n=0,++r}++n,++t}return E.join("")}a={version:"1.4.1",ucs2:{decode:b,encode:y},decode:S,encode:E,toASCII:function(e){return m(e,(function(e){return f.test(e)?"xn--"+E(e):e}))},toUnicode:function(e){return m(e,(function(e){return c.test(e)?S(e.slice(4).toLowerCase()):e}))}},void 0===(i=function(){return a}.call(t,n,t,e))||(e.exports=i)}()}).call(this,n(57)(e),n(31))},function(e,t,n){"use strict";e.exports={isString:function(e){return"string"==typeof e},isObject:function(e){return"object"==typeof e&&null!==e},isNull:function(e){return null===e},isNullOrUndefined:function(e){return null==e}}},function(e,t,n){"use strict";t.decode=t.parse=n(369),t.encode=t.stringify=n(370)},function(e,t,n){"use strict";function r(e,t){return Object.prototype.hasOwnProperty.call(e,t)}e.exports=function(e,t,n,o){t=t||"&",n=n||"=";var s={};if("string"!=typeof e||0===e.length)return s;var a=/\+/g;e=e.split(t);var u=1e3;o&&"number"==typeof o.maxKeys&&(u=o.maxKeys);var c=e.length;u>0&&c>u&&(c=u);for(var f=0;f=0?(l=v.substr(0,g),d=v.substr(g+1)):(l=v,d=""),h=decodeURIComponent(l),p=decodeURIComponent(d),r(s,h)?i(s[h])?s[h].push(p):s[h]=[s[h],p]:s[h]=p}return s};var i=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)}},function(e,t,n){"use strict";var r=function(e){switch(typeof e){case"string":return e;case"boolean":return e?"true":"false";case"number":return isFinite(e)?e:"";default:return""}};e.exports=function(e,t,n,a){return t=t||"&",n=n||"=",null===e&&(e=void 0),"object"==typeof e?o(s(e),(function(s){var a=encodeURIComponent(r(s))+n;return i(e[s])?o(e[s],(function(e){return a+encodeURIComponent(r(e))})).join(t):a+encodeURIComponent(r(e[s]))})).join(t):a?encodeURIComponent(r(a))+n+encodeURIComponent(r(e)):""};var i=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)};function o(e,t){if(e.map)return e.map(t);for(var n=[],r=0;ra)&&void 0===e.nsecs&&(v=0),v>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");a=p,u=v,i=d;var m=(1e4*(268435455&(p+=122192928e5))+v)%4294967296;f[c++]=m>>>24&255,f[c++]=m>>>16&255,f[c++]=m>>>8&255,f[c++]=255&m;var b=p/4294967296*1e4&268435455;f[c++]=b>>>8&255,f[c++]=255&b,f[c++]=b>>>24&15|16,f[c++]=b>>>16&255,f[c++]=d>>>8|128,f[c++]=255&d;for(var y=0;y<6;++y)f[c+y]=l[y];return t||s(f)}},function(e,t,n){var r=n(214),i=n(215);e.exports=function(e,t,n){var o=t&&n||0;"string"==typeof e&&(t="binary"===e?new Array(16):null,e=null);var s=(e=e||{}).random||(e.rng||r)();if(s[6]=15&s[6]|64,s[8]=63&s[8]|128,t)for(var a=0;a<16;++a)t[o+a]=s[a];return t||i(s)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Sha256=void 0;var r=n(216),i=n(219),o=n(374),s=n(377),a=n(379),u=n(134),c=function(){function e(e){s.supportsWebCrypto(u.locateWindow())?this.hash=new i.Sha256(e):a.isMsWindow(u.locateWindow())?this.hash=new r.Sha256(e):this.hash=new o.Sha256(e)}return e.prototype.update=function(e,t){this.hash.update(e,t)},e.prototype.digest=function(){return this.hash.digest()},e}();t.Sha256=c},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),n(1).__exportStar(n(375),t)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Sha256=void 0;var r=n(1),i=n(220),o=n(376),s=n(497),a=function(){function e(e){if(this.hash=new o.RawSha256,e){this.outer=new o.RawSha256;var t=function(e){var t=u(e);if(t.byteLength>i.BLOCK_SIZE){var n=new o.RawSha256;n.update(t),t=n.digest()}var r=new Uint8Array(i.BLOCK_SIZE);return r.set(t),r}(e),n=new Uint8Array(i.BLOCK_SIZE);n.set(t);for(var r=0;rr.MAX_HASHABLE_LENGTH)throw new Error("Cannot hash more than 2^53 - 1 bits");for(;n>0;)this.buffer[this.bufferLength++]=e[t++],n--,this.bufferLength===r.BLOCK_SIZE&&(this.hashBuffer(),this.bufferLength=0)},e.prototype.digest=function(){if(!this.finished){var e=8*this.bytesHashed,t=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength),n=this.bufferLength;if(t.setUint8(this.bufferLength++,128),n%r.BLOCK_SIZE>=r.BLOCK_SIZE-8){for(var i=this.bufferLength;i>>24&255,o[4*i+1]=this.state[i]>>>16&255,o[4*i+2]=this.state[i]>>>8&255,o[4*i+3]=this.state[i]>>>0&255;return o},e.prototype.hashBuffer=function(){for(var e=this.buffer,t=this.state,n=t[0],i=t[1],o=t[2],s=t[3],a=t[4],u=t[5],c=t[6],f=t[7],l=0;l>>17|d<<15)^(d>>>19|d<<13)^d>>>10,p=((d=this.temp[l-15])>>>7|d<<25)^(d>>>18|d<<14)^d>>>3;this.temp[l]=(h+this.temp[l-7]|0)+(p+this.temp[l-16]|0)}var v=(((a>>>6|a<<26)^(a>>>11|a<<21)^(a>>>25|a<<7))+(a&u^~a&c)|0)+(f+(r.KEY[l]+this.temp[l]|0)|0)|0,g=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+(n&i^n&o^i&o)|0;f=c,c=u,u=a,a=s+v|0,s=o,o=i,i=n,n=v+g|0}t[0]+=n,t[1]+=i,t[2]+=o,t[3]+=s,t[4]+=a,t[5]+=u,t[6]+=c,t[7]+=f},e}();t.RawSha256=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),n(1).__exportStar(n(378),t)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.supportsZeroByteGCM=t.supportsSubtleCrypto=t.supportsSecureRandom=t.supportsWebCrypto=void 0;var r=n(1),i=["decrypt","digest","encrypt","exportKey","generateKey","importKey","sign","verify"];function o(e){return"object"==typeof e&&"object"==typeof e.crypto&&"function"==typeof e.crypto.getRandomValues}function s(e){return e&&i.every((function(t){return"function"==typeof e[t]}))}t.supportsWebCrypto=function(e){return!(!o(e)||"object"!=typeof e.crypto.subtle)&&s(e.crypto.subtle)},t.supportsSecureRandom=o,t.supportsSubtleCrypto=s,t.supportsZeroByteGCM=function(e){return r.__awaiter(this,void 0,void 0,(function(){var t;return r.__generator(this,(function(n){switch(n.label){case 0:if(!s(e))return[2,!1];n.label=1;case 1:return n.trys.push([1,4,,5]),[4,e.generateKey({name:"AES-GCM",length:128},!1,["encrypt"])];case 2:return t=n.sent(),[4,e.encrypt({name:"AES-GCM",iv:new Uint8Array(Array(12)),additionalData:new Uint8Array(Array(16)),tagLength:128},t,new Uint8Array(0))];case 3:return[2,16===n.sent().byteLength];case 4:return n.sent(),[2,!1];case 5:return[2]}}))}))}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1);r.__exportStar(n(380),t),r.__exportStar(n(381),t),r.__exportStar(n(382),t),r.__exportStar(n(383),t),r.__exportStar(n(384),t)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isMsWindow=void 0;var r=["decrypt","digest","encrypt","exportKey","generateKey","importKey","sign","verify"];t.isMsWindow=function(e){if(function(e){return"MSInputMethodContext"in e&&"msCrypto"in e}(e)&&void 0!==e.msCrypto.subtle){var t=e.msCrypto,n=t.getRandomValues,i=t.subtle;return r.map((function(e){return i[e]})).concat(n).every((function(e){return"function"==typeof e}))}return!1}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),i=n(222),o=n(386),s=n(494),a=function(){function e(e){if(this.hash=new o.RawSha256,e){this.outer=new o.RawSha256;var t=function(e){var t=u(e);if(t.byteLength>i.BLOCK_SIZE){var n=new o.RawSha256;n.update(t),t=n.digest()}var r=new Uint8Array(i.BLOCK_SIZE);return r.set(t),r}(e),n=new Uint8Array(i.BLOCK_SIZE);n.set(t);for(var r=0;rr.MAX_HASHABLE_LENGTH)throw new Error("Cannot hash more than 2^53 - 1 bits");for(;n>0;)this.buffer[this.bufferLength++]=e[t++],n--,this.bufferLength===r.BLOCK_SIZE&&(this.hashBuffer(),this.bufferLength=0)},e.prototype.digest=function(){if(!this.finished){var e=8*this.bytesHashed,t=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength),n=this.bufferLength;if(t.setUint8(this.bufferLength++,128),n%r.BLOCK_SIZE>=r.BLOCK_SIZE-8){for(var i=this.bufferLength;i>>24&255,o[4*i+1]=this.state[i]>>>16&255,o[4*i+2]=this.state[i]>>>8&255,o[4*i+3]=this.state[i]>>>0&255;return o},e.prototype.hashBuffer=function(){for(var e=this.buffer,t=this.state,n=t[0],i=t[1],o=t[2],s=t[3],a=t[4],u=t[5],c=t[6],f=t[7],l=0;l>>17|d<<15)^(d>>>19|d<<13)^d>>>10,p=((d=this.temp[l-15])>>>7|d<<25)^(d>>>18|d<<14)^d>>>3;this.temp[l]=(h+this.temp[l-7]|0)+(p+this.temp[l-16]|0)}var v=(((a>>>6|a<<26)^(a>>>11|a<<21)^(a>>>25|a<<7))+(a&u^~a&c)|0)+(f+(r.KEY[l]+this.temp[l]|0)|0)|0,g=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+(n&i^n&o^i&o)|0;f=c,c=u,u=a,a=s+v|0,s=o,o=i,i=n,n=v+g|0}t[0]+=n,t[1]+=i,t[2]+=o,t[3]+=s,t[4]+=a,t[5]+=u,t[6]+=c,t[7]+=f},e}();t.RawSha256=i},function(e,t,n){var r=n(388),i=n(419);e.exports=function(e,t){for(var n=0,o=(t=r(t,e)).length;null!=e&&n-1}},function(e,t,n){var r=n(100);e.exports=function(e,t){var n=this.__data__,i=r(n,e);return i<0?(++this.size,n.push([e,t])):n[i][1]=t,this}},function(e,t,n){var r=n(101);e.exports=function(e){var t=r(this,e).delete(e);return this.size-=t?1:0,t}},function(e,t){e.exports=function(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e}},function(e,t,n){var r=n(101);e.exports=function(e){return r(this,e).get(e)}},function(e,t,n){var r=n(101);e.exports=function(e){return r(this,e).has(e)}},function(e,t,n){var r=n(101);e.exports=function(e,t){var n=r(this,e),i=n.size;return n.set(e,t),this.size+=n.size==i?0:1,this}},function(e,t,n){var r=n(417);e.exports=function(e){return null==e?"":r(e)}},function(e,t,n){var r=n(97),i=n(418),o=n(61),s=n(135),a=r?r.prototype:void 0,u=a?a.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(o(t))return i(t,e)+"";if(s(t))return u?u.call(t):"";var n=t+"";return"0"==n&&1/t==-1/0?"-0":n}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,i=Array(r);++n-1&&e%1==0&&e1){o[u]=[];for(let n in e.child[u])e.child[u].hasOwnProperty(n)&&o[u].push(i(e.child[u][n],t,u))}else{const s=i(e.child[u][0],t,u),a=!0===t.arrayMode&&"object"==typeof s||r.isTagNameInArrayMode(u,t.arrayMode,n);o[u]=a?[s]:s}}return o};t.convertToJson=i},function(e,t,n){"use strict";e.exports=function(e,t,n){this.tagname=e,this.parent=t,this.child={},this.attrsMap={},this.val=n,this.addChild=function(e){Array.isArray(this.child[e.tagname])?this.child[e.tagname].push(e):this.child[e.tagname]=[e]}}},function(e,t,n){"use strict";const r=n(54),i={allowBooleanAttributes:!1},o=["allowBooleanAttributes"];function s(e,t){for(var n=t;t5&&"xml"===r)return d("InvalidXml","XML declaration allowed only at the start of the document.",p(e,t));if("?"==e[t]&&">"==e[t+1]){t++;break}}return t}function a(e,t){if(e.length>t+5&&"-"===e[t+1]&&"-"===e[t+2]){for(t+=3;t"===e[t+2]){t+=2;break}}else if(e.length>t+8&&"D"===e[t+1]&&"O"===e[t+2]&&"C"===e[t+3]&&"T"===e[t+4]&&"Y"===e[t+5]&&"P"===e[t+6]&&"E"===e[t+7]){let n=1;for(t+=8;t"===e[t]&&(n--,0===n))break}else if(e.length>t+9&&"["===e[t+1]&&"C"===e[t+2]&&"D"===e[t+3]&&"A"===e[t+4]&&"T"===e[t+5]&&"A"===e[t+6]&&"["===e[t+7])for(t+=8;t"===e[t+2]){t+=2;break}return t}t.validate=function(e,t){t=r.buildOptions(t,i,o);const n=[];let c=!1,h=!1;"\ufeff"===e[0]&&(e=e.substr(1));for(let i=0;i"!==e[i]&&" "!==e[i]&&"\t"!==e[i]&&"\n"!==e[i]&&"\r"!==e[i];i++)g+=e[i];if(g=g.trim(),"/"===g[g.length-1]&&(g=g.substring(0,g.length-1),i--),v=g,!r.isName(v)){let t;return t=0===g.trim().length?"There is an unnecessary space between tag name and backward slash '0)return d("InvalidTag","Closing tag '"+g+"' can't have attributes or invalid starting.",p(e,i));{const t=n.pop();if(g!==t)return d("InvalidTag","Closing tag '"+t+"' is expected inplace of '"+g+"'.",p(e,i));0==n.length&&(h=!0)}}else{const r=f(b,t);if(!0!==r)return d(r.err.code,r.err.msg,p(e,i-b.length+r.err.line));if(!0===h)return d("InvalidXml","Multiple possible root nodes found.",p(e,i));n.push(g),c=!0}for(i++;i0)||d("InvalidXml","Invalid '"+JSON.stringify(n,null,4).replace(/\r?\n/g,"")+"' found.",1):d("InvalidXml","Start tag expected.",1)};function u(e,t){let n="",r="",i=!1;for(;t"===e[t]&&""===r){i=!0;break}n+=e[t]}return""===r&&{value:n,index:t,tagClosed:i}}const c=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function f(e,t){const n=r.getAllMatches(e,c),i={};for(let r=0;r1){for(var u in i+='"'+a+'" : [ ',e.child[a])i+=s(e.child[a][u],t)+" , ";i=i.substr(0,i.length-1)+" ] "}else i+='"'+a+'" : '+s(e.child[a][0],t)+" ,"}return r.merge(i,e.attrsMap),r.isEmptyObject(i)?r.isExist(e.val)?e.val:"":(r.isExist(e.val)&&("string"!=typeof e.val||""!==e.val&&e.val!==t.cdataPositionChar)&&(i+='"'+t.textNodeName+'" : '+(!0!==(c=e.val)&&!1!==c&&isNaN(c)?'"'+c+'"':c)),","===i[i.length-1]&&(i=i.substr(0,i.length-2)),i+"}");var c};t.convertToJsonString=function(e,t){return(t=i(t,o.defaultOptions,o.props)).indentBy=t.indentBy||"",s(e,t,0)}},function(e,t,n){"use strict";const r=n(54).buildOptions,i={attributeNamePrefix:"@_",attrNodeName:!1,textNodeName:"#text",ignoreAttributes:!0,cdataTagName:!1,cdataPositionChar:"\\c",format:!1,indentBy:" ",supressEmptyNode:!1,tagValueProcessor:function(e){return e},attrValueProcessor:function(e){return e}},o=["attributeNamePrefix","attrNodeName","textNodeName","ignoreAttributes","cdataTagName","cdataPositionChar","format","indentBy","supressEmptyNode","tagValueProcessor","attrValueProcessor"];function s(e){this.options=r(e,i,o),this.options.ignoreAttributes||this.options.attrNodeName?this.isAttribute=function(){return!1}:(this.attrPrefixLen=this.options.attributeNamePrefix.length,this.isAttribute=p),this.options.cdataTagName?this.isCDATA=v:this.isCDATA=function(){return!1},this.replaceCDATAstr=a,this.replaceCDATAarr=u,this.options.format?(this.indentate=h,this.tagEndChar=">\n",this.newLine="\n"):(this.indentate=function(){return""},this.tagEndChar=">",this.newLine=""),this.options.supressEmptyNode?(this.buildTextNode=d,this.buildObjNode=f):(this.buildTextNode=l,this.buildObjNode=c),this.buildTextValNode=l,this.buildObjectNode=c}function a(e,t){return e=this.options.tagValueProcessor(""+e),""===this.options.cdataPositionChar||""===e?e+"");return e+this.newLine}function c(e,t,n,r){return n&&!e.includes("<")?this.indentate(r)+"<"+t+n+">"+e+""+this.options.tagValueProcessor(e)+"=0)return;s[t]="set-cookie"===t?(s[t]?s[t]:[]).concat([n]):s[t]?s[t]+", "+n:n}})),s):s}},function(e,t,n){"use strict";var r=n(45);e.exports=r.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function i(e){var r=e;return t&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return e=i(window.location.href),function(t){var n=r.isString(t)?i(t):t;return n.protocol===e.protocol&&n.host===e.host}}():function(){return!0}},function(e,t,n){"use strict";var r=n(242);function i(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var n=this;e((function(e){n.reason||(n.reason=new r(e),t(n.reason))}))}i.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},i.source=function(){var e;return{token:new i((function(t){e=t})),cancel:e}},e.exports=i},function(e,t,n){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},function(e,t,n){"use strict";e.exports=function(e){return"object"==typeof e&&!0===e.isAxiosError}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var n=0;n1,i=!1,o=arguments[1],s=o;return new n((function(n){return t.subscribe({next:function(t){var o=!i;if(i=!0,!o||r)try{s=e(s,t)}catch(e){return n.error(e)}else s=t},error:function(e){n.error(e)},complete:function(){if(!i&&!r)return n.error(new TypeError("Cannot reduce an empty sequence"));n.next(s),n.complete()}})}))}},{key:"concat",value:function(){for(var e=this,t=arguments.length,n=new Array(t),r=0;r=0&&i.splice(e,1),s()}});i.push(o)},error:function(e){r.error(e)},complete:function(){s()}});function s(){o.closed&&0===i.length&&r.complete()}return function(){i.forEach((function(e){return e.unsubscribe()})),o.unsubscribe()}}))}},{key:f,value:function(){return this}}],[{key:"from",value:function(t){var n="function"==typeof this?this:e;if(null==t)throw new TypeError(t+" is not an object");var r=d(t,f);if(r){var i=r.call(t);if(Object(i)!==i)throw new TypeError(i+" is not an object");return p(i)&&i.constructor===n?i:new n((function(e){return i.subscribe(e)}))}if(a("iterator")&&(r=d(t,c)))return new n((function(e){g((function(){if(!e.closed){var n=!0,i=!1,o=void 0;try{for(var s,a=r.call(t)[Symbol.iterator]();!(n=(s=a.next()).done);n=!0){var u=s.value;if(e.next(u),e.closed)return}}catch(e){i=!0,o=e}finally{try{n||null==a.return||a.return()}finally{if(i)throw o}}e.complete()}}))}));if(Array.isArray(t))return new n((function(e){g((function(){if(!e.closed){for(var n=0;na)&&void 0===e.nsecs&&(v=0),v>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");a=p,u=v,i=d;var m=(1e4*(268435455&(p+=122192928e5))+v)%4294967296;f[c++]=m>>>24&255,f[c++]=m>>>16&255,f[c++]=m>>>8&255,f[c++]=255&m;var b=p/4294967296*1e4&268435455;f[c++]=b>>>8&255,f[c++]=255&b,f[c++]=b>>>24&15|16,f[c++]=b>>>16&255,f[c++]=d>>>8|128,f[c++]=255&d;for(var y=0;y<6;++y)f[c+y]=l[y];return t||s(f)}},function(e,t,n){var r=n(243),i=n(244);e.exports=function(e,t,n){var o=t&&n||0;"string"==typeof e&&(t="binary"===e?new Array(16):null,e=null);var s=(e=e||{}).random||(e.rng||r)();if(s[6]=15&s[6]|64,s[8]=63&s[8]|128,t)for(var a=0;a<16;++a)t[o+a]=s[a];return t||i(s)}},function(e,t){},function(e,t,n){e.exports=n(487).Observable},function(e,t,n){"use strict";(function(e){!function(e,t){function n(e){return"function"==typeof Symbol&&Boolean(Symbol[e])}function r(e){return n(e)?Symbol[e]:"@@"+e}function i(e){setTimeout((function(){throw e}))}function o(e,t){var n=e[t];if(null!=n){if("function"!=typeof n)throw new TypeError(n+" is not a function");return n}}function s(e){var t=e.constructor;return void 0!==t&&null===(t=t[r("species")])&&(t=void 0),void 0!==t?t:d}function a(e,t){Object.keys(t).forEach((function(n){var r=Object.getOwnPropertyDescriptor(t,n);r.enumerable=!1,Object.defineProperty(e,n,r)}))}function u(e){var t=e._cleanup;if(t){e._cleanup=void 0;try{t()}catch(e){i(e)}}}function c(e){return void 0===e._observer}function f(e,t){if(Object(e)!==e)throw new TypeError("Observer must be an object");this._cleanup=void 0,this._observer=e;try{var n=o(e,"start");n&&n.call(e,this)}catch(e){i(e)}if(!c(this)){e=new l(this);try{var r=t.call(void 0,e);if(null!=r){if("function"==typeof r.unsubscribe)s=r,r=function(){s.unsubscribe()};else if("function"!=typeof r)throw new TypeError(r+" is not a function");this._cleanup=r}}catch(t){return void e.error(t)}var s;c(this)&&u(this)}}function l(e){this._subscription=e}function d(e){if(!(this instanceof d))throw new TypeError("Observable cannot be called as a function");if("function"!=typeof e)throw new TypeError("Observable initializer must be a function");this._subscriber=e}"function"!=typeof Symbol||Symbol.observable||(Symbol.observable=Symbol("observable")),a(f.prototype={},{get closed(){return c(this)},unsubscribe:function(){var e;c(e=this)||(e._observer=void 0,u(e))}}),a(l.prototype={},{get closed(){return c(this._subscription)},next:function(e){var t=this._subscription;if(!c(t)){var n=t._observer;try{var r=o(n,"next");r&&r.call(n,e)}catch(e){i(e)}}},error:function(e){var t=this._subscription;if(c(t))i(e);else{var n=t._observer;t._observer=void 0;try{var r=o(n,"error");if(!r)throw e;r.call(n,e)}catch(e){i(e)}u(t)}},complete:function(){var e=this._subscription;if(!c(e)){var t=e._observer;e._observer=void 0;try{var n=o(t,"complete");n&&n.call(t)}catch(e){i(e)}u(e)}}}),a(d.prototype,{subscribe:function(e){for(var t=[],n=1;n1,i=!1,o=arguments[1],a=o;return new n((function(n){return t.subscribe({next:function(t){if(!n.closed){var o=!i;if(i=!0,!o||r)try{a=e(a,t)}catch(e){return n.error(e)}else a=t}},error:function(e){n.error(e)},complete:function(){if(!i&&!r)return n.error(new TypeError("Cannot reduce an empty sequence"));n.next(a),n.complete()}})}))}}),Object.defineProperty(d.prototype,r("observable"),{value:function(){return this},writable:!0,configurable:!0}),a(d,{from:function(e){var t="function"==typeof this?this:d;if(null==e)throw new TypeError(e+" is not an object");var i=o(e,r("observable"));if(i){var s=i.call(e);if(Object(s)!==s)throw new TypeError(s+" is not an object");return s.constructor===t?s:new t((function(e){return s.subscribe(e)}))}if(n("iterator")&&(i=o(e,r("iterator"))))return new t((function(t){for(var n,r=i.call(e)[Symbol.iterator]();!(n=r.next()).done;){var o=n.value;if(t.next(o),t.closed)return}t.complete()}));if(Array.isArray(e))return new t((function(t){for(var n=0;n0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},a=function(){for(var e=[],t=0;t",e),null):t},e.prototype.removePluggable=function(e){this._convertPluggables=this._convertPluggables.filter((function(t){return t.getProviderName()!==e})),this._identifyPluggables=this._identifyPluggables.filter((function(t){return t.getProviderName()!==e})),this._interpretPluggables=this._interpretPluggables.filter((function(t){return t.getProviderName()!==e}))},e.prototype.configure=function(e){var t=this,n=e?e.predictions||e:{};n=o(o({},n),e),this._options=Object.assign({},this._options,n),u.debug("configure Predictions",this._options),this.getAllProviders().forEach((function(e){return t.configurePluggable(e)}))},e.prototype.interpret=function(e,t){return this.getPluggableToExecute(this._interpretPluggables,t).interpret(e)},e.prototype.convert=function(e,t){return this.getPluggableToExecute(this._convertPluggables,t).convert(e)},e.prototype.identify=function(e,t){return this.getPluggableToExecute(this._identifyPluggables,t).identify(e)},e.prototype.getPluggableToExecute=function(e,t){if(t&&t.providerName)return a(e).find((function(e){return e.getProviderName()===t.providerName}));if(1===e.length)return e[0];throw new Error("More than one or no providers are configured, Either specify a provider name or configure exactly one provider")},e.prototype.getAllProviders=function(){return a(this._convertPluggables,this._identifyPluggables,this._interpretPluggables)},e.prototype.configurePluggable=function(e){var t=Object.assign({},this._options.predictions,this._options[e.getCategory().toLowerCase()]);e.configure(t)},e.prototype.implementsConvertPluggable=function(e){return e&&"function"==typeof e.convert},e.prototype.implementsIdentifyPluggable=function(e){return e&&"function"==typeof e.identify},e.prototype.implementsInterpretPluggable=function(e){return e&&"function"==typeof e.interpret},e}())({});i.a.register(c)},function(e,t,n){"use strict";n.d(t,"a",(function(){return ft}));var r=n(44),i=n(19),o=function(){return(o=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s}Object.create;var p,v,g,m,b,y,w,_,S,E,M,A,I,k,O,x,C,T,P,N,R,L,j,D,U,B,F,z,q,K,H,V,G,W,$,Y=n(155),J=n(38),Z=n(18),X=n(24),Q=n(11),ee=n(39),te=n(17),ne=n(40),re=n(41),ie=n(15),oe=new Set(["ap-east-1","ap-northeast-1","ap-northeast-2","ap-south-1","ap-southeast-1","ap-southeast-2","ca-central-1","eu-central-1","eu-north-1","eu-west-1","eu-west-2","eu-west-3","me-south-1","sa-east-1","us-east-1","us-east-2","us-west-1","us-west-2"]),se=new Set(["cn-north-1","cn-northwest-1"]),ae=new Set(["us-iso-east-1"]),ue=new Set(["us-isob-east-1"]),ce=new Set(["us-gov-east-1","us-gov-west-1"]),fe=f(f({},{apiVersion:"2016-11-28",disableHostPrefix:!1,logger:{},regionInfoProvider:function(e,t){var n=void 0;switch(e){case"eu-west-1":n={hostname:"runtime.lex.eu-west-1.amazonaws.com",partition:"aws",signingService:"lex"};break;case"us-east-1":n={hostname:"runtime.lex.us-east-1.amazonaws.com",partition:"aws",signingService:"lex"};break;case"us-west-2":n={hostname:"runtime.lex.us-west-2.amazonaws.com",partition:"aws",signingService:"lex"};break;default:oe.has(e)&&(n={hostname:"runtime.lex.{region}.amazonaws.com".replace("{region}",e),partition:"aws",signingService:"lex"}),se.has(e)&&(n={hostname:"runtime.lex.{region}.amazonaws.com.cn".replace("{region}",e),partition:"aws-cn"}),ae.has(e)&&(n={hostname:"runtime.lex.{region}.c2s.ic.gov".replace("{region}",e),partition:"aws-iso"}),ue.has(e)&&(n={hostname:"runtime.lex.{region}.sc2s.sgov.gov".replace("{region}",e),partition:"aws-iso-b"}),ce.has(e)&&(n={hostname:"runtime.lex.{region}.amazonaws.com".replace("{region}",e),partition:"aws-us-gov"}),void 0===n&&(n={hostname:"runtime.lex.{region}.amazonaws.com".replace("{region}",e),partition:"aws",signingService:"lex"})}return Promise.resolve(n)},signingName:"lex"}),{runtime:"browser",base64Decoder:te.a,base64Encoder:te.b,bodyLengthChecker:ne.a,credentialDefaultProvider:Object(X.a)("Credential is missing"),defaultUserAgent:Object(re.a)(Y.name,Y.version),maxAttempts:Q.a,region:Object(X.a)("Region is missing"),requestHandler:new Z.a,sha256:J.Sha256,streamCollector:Z.b,urlParser:ee.a,utf8Decoder:ie.a,utf8Encoder:ie.b}),le=n(22),de=n(37),he=n(21),pe=n(43),ve=n(25),ge=n(23),me=n(0),be=function(e){function t(t){var n=this,r=f(f({},fe),t),i=Object(le.b)(r),o=Object(le.a)(i),s=Object(ve.b)(o),a=Object(Q.c)(s),u=Object(ge.b)(a),c=Object(he.b)(u);return(n=e.call(this,c)||this).config=c,n.middlewareStack.use(Object(ve.a)(n.config)),n.middlewareStack.use(Object(Q.b)(n.config)),n.middlewareStack.use(Object(ge.a)(n.config)),n.middlewareStack.use(Object(de.a)(n.config)),n.middlewareStack.use(Object(he.a)(n.config)),n.middlewareStack.use(Object(pe.a)(n.config)),n}return c(t,e),t.prototype.destroy=function(){e.prototype.destroy.call(this)},t}(me.a);(p||(p={})).filterSensitiveLog=function(e){return f({},e)},(v||(v={})).filterSensitiveLog=function(e){return f({},e)},(g||(g={})).filterSensitiveLog=function(e){return f({},e)},(m||(m={})).filterSensitiveLog=function(e){return f({},e)},(b||(b={})).filterSensitiveLog=function(e){return f({},e)},(y||(y={})).filterSensitiveLog=function(e){return f({},e)},(w||(w={})).filterSensitiveLog=function(e){return f({},e)},(_||(_={})).filterSensitiveLog=function(e){return f({},e)},function(e){e.FAILED="Failed",e.FULFILLED="Fulfilled",e.READY_FOR_FULFILLMENT="ReadyForFulfillment"}(S||(S={})),function(e){e.COMPOSITE="Composite",e.CUSTOM_PAYLOAD="CustomPayload",e.PLAIN_TEXT="PlainText",e.SSML="SSML"}(E||(E={})),function(e){e.CLOSE="Close",e.CONFIRM_INTENT="ConfirmIntent",e.DELEGATE="Delegate",e.ELICIT_INTENT="ElicitIntent",e.ELICIT_SLOT="ElicitSlot"}(M||(M={})),(A||(A={})).filterSensitiveLog=function(e){return f(f(f({},e),e.slots&&{slots:me.d}),e.message&&{message:me.d})},function(e){e.CONFIRMED="Confirmed",e.DENIED="Denied",e.NONE="None"}(I||(I={})),(k||(k={})).filterSensitiveLog=function(e){return f(f({},e),e.slots&&{slots:me.d})},(O||(O={})).filterSensitiveLog=function(e){return f(f(f(f({},e),e.dialogAction&&{dialogAction:A.filterSensitiveLog(e.dialogAction)}),e.recentIntentSummaryView&&{recentIntentSummaryView:e.recentIntentSummaryView.map((function(e){return k.filterSensitiveLog(e)}))}),e.sessionAttributes&&{sessionAttributes:me.d})},(x||(x={})).filterSensitiveLog=function(e){return f({},e)},(C||(C={})).filterSensitiveLog=function(e){return f({},e)},(T||(T={})).filterSensitiveLog=function(e){return f({},e)},(P||(P={})).filterSensitiveLog=function(e){return f({},e)},(N||(N={})).filterSensitiveLog=function(e){return f(f(f({},e),e.requestAttributes&&{requestAttributes:me.d}),e.sessionAttributes&&{sessionAttributes:me.d})},function(e){e.CONFIRM_INTENT="ConfirmIntent",e.ELICIT_INTENT="ElicitIntent",e.ELICIT_SLOT="ElicitSlot",e.FAILED="Failed",e.FULFILLED="Fulfilled",e.READY_FOR_FULFILLMENT="ReadyForFulfillment"}(R||(R={})),(L||(L={})).filterSensitiveLog=function(e){return f(f({},e),e.message&&{message:me.d})},(j||(j={})).filterSensitiveLog=function(e){return f({},e)},(D||(D={})).filterSensitiveLog=function(e){return f({},e)},(U||(U={})).filterSensitiveLog=function(e){return f(f(f(f({},e),e.requestAttributes&&{requestAttributes:me.d}),e.inputText&&{inputText:me.d}),e.sessionAttributes&&{sessionAttributes:me.d})},(B||(B={})).filterSensitiveLog=function(e){return f({},e)},(F||(F={})).filterSensitiveLog=function(e){return f(f({},e),e.slots&&{slots:me.d})},function(e){e.GENERIC="application/vnd.amazonaws.card.generic"}(z||(z={})),(q||(q={})).filterSensitiveLog=function(e){return f({},e)},(K||(K={})).filterSensitiveLog=function(e){return f({},e)},(H||(H={})).filterSensitiveLog=function(e){return f({},e)},(V||(V={})).filterSensitiveLog=function(e){return f({},e)},(G||(G={})).filterSensitiveLog=function(e){return f(f(f(f(f({},e),e.alternativeIntents&&{alternativeIntents:e.alternativeIntents.map((function(e){return F.filterSensitiveLog(e)}))}),e.message&&{message:me.d}),e.sessionAttributes&&{sessionAttributes:me.d}),e.slots&&{slots:me.d})},(W||(W={})).filterSensitiveLog=function(e){return f(f(f(f({},e),e.dialogAction&&{dialogAction:A.filterSensitiveLog(e.dialogAction)}),e.recentIntentSummaryView&&{recentIntentSummaryView:e.recentIntentSummaryView.map((function(e){return k.filterSensitiveLog(e)}))}),e.sessionAttributes&&{sessionAttributes:me.d})},($||($={})).filterSensitiveLog=function(e){return f(f({},e),e.message&&{message:me.d})};var ye,we=n(2),_e=function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,l,h,p,v,g,m,b,y,w,_;return d(this,(function(d){switch(d.label){case 0:return r=[f({},e)],_={},[4,Ge(e.body,t)];case 1:switch(n=f.apply(void 0,r.concat([(_.body=d.sent(),_)])),o="UnknownError",o=We(e,n.body),o){case"BadGatewayException":case"com.amazonaws.lexruntimeservice#BadGatewayException":return[3,2];case"BadRequestException":case"com.amazonaws.lexruntimeservice#BadRequestException":return[3,4];case"ConflictException":case"com.amazonaws.lexruntimeservice#ConflictException":return[3,6];case"DependencyFailedException":case"com.amazonaws.lexruntimeservice#DependencyFailedException":return[3,8];case"InternalFailureException":case"com.amazonaws.lexruntimeservice#InternalFailureException":return[3,10];case"LimitExceededException":case"com.amazonaws.lexruntimeservice#LimitExceededException":return[3,12];case"LoopDetectedException":case"com.amazonaws.lexruntimeservice#LoopDetectedException":return[3,14];case"NotAcceptableException":case"com.amazonaws.lexruntimeservice#NotAcceptableException":return[3,16];case"NotFoundException":case"com.amazonaws.lexruntimeservice#NotFoundException":return[3,18];case"RequestTimeoutException":case"com.amazonaws.lexruntimeservice#RequestTimeoutException":return[3,20];case"UnsupportedMediaTypeException":case"com.amazonaws.lexruntimeservice#UnsupportedMediaTypeException":return[3,22]}return[3,24];case 2:return s=[{}],[4,Ee(n,t)];case 3:return i=f.apply(void 0,[f.apply(void 0,s.concat([d.sent()])),{name:o,$metadata:Ke(e)}]),[3,25];case 4:return a=[{}],[4,Me(n,t)];case 5:return i=f.apply(void 0,[f.apply(void 0,a.concat([d.sent()])),{name:o,$metadata:Ke(e)}]),[3,25];case 6:return u=[{}],[4,Ae(n,t)];case 7:return i=f.apply(void 0,[f.apply(void 0,u.concat([d.sent()])),{name:o,$metadata:Ke(e)}]),[3,25];case 8:return c=[{}],[4,Ie(n,t)];case 9:return i=f.apply(void 0,[f.apply(void 0,c.concat([d.sent()])),{name:o,$metadata:Ke(e)}]),[3,25];case 10:return l=[{}],[4,ke(n,t)];case 11:return i=f.apply(void 0,[f.apply(void 0,l.concat([d.sent()])),{name:o,$metadata:Ke(e)}]),[3,25];case 12:return h=[{}],[4,Oe(n,t)];case 13:return i=f.apply(void 0,[f.apply(void 0,h.concat([d.sent()])),{name:o,$metadata:Ke(e)}]),[3,25];case 14:return p=[{}],[4,xe(n,t)];case 15:return i=f.apply(void 0,[f.apply(void 0,p.concat([d.sent()])),{name:o,$metadata:Ke(e)}]),[3,25];case 16:return v=[{}],[4,Ce(n,t)];case 17:return i=f.apply(void 0,[f.apply(void 0,v.concat([d.sent()])),{name:o,$metadata:Ke(e)}]),[3,25];case 18:return g=[{}],[4,Te(n,t)];case 19:return i=f.apply(void 0,[f.apply(void 0,g.concat([d.sent()])),{name:o,$metadata:Ke(e)}]),[3,25];case 20:return m=[{}],[4,Pe(n,t)];case 21:return i=f.apply(void 0,[f.apply(void 0,m.concat([d.sent()])),{name:o,$metadata:Ke(e)}]),[3,25];case 22:return b=[{}],[4,Ne(n,t)];case 23:return i=f.apply(void 0,[f.apply(void 0,b.concat([d.sent()])),{name:o,$metadata:Ke(e)}]),[3,25];case 24:y=n.body,o=y.code||y.Code||o,i=f(f({},y),{name:""+o,message:y.message||y.Message||o,$fault:"client",$metadata:Ke(e)}),d.label=25;case 25:return w=i.message||i.Message||o,i.message=w,delete i.Message,[2,Promise.reject(Object.assign(new Error(w),i))]}}))}))},Se=function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,l,h,p,v,g,m,b;return d(this,(function(d){switch(d.label){case 0:return r=[f({},e)],b={},[4,Ge(e.body,t)];case 1:switch(n=f.apply(void 0,r.concat([(b.body=d.sent(),b)])),o="UnknownError",o=We(e,n.body),o){case"BadGatewayException":case"com.amazonaws.lexruntimeservice#BadGatewayException":return[3,2];case"BadRequestException":case"com.amazonaws.lexruntimeservice#BadRequestException":return[3,4];case"ConflictException":case"com.amazonaws.lexruntimeservice#ConflictException":return[3,6];case"DependencyFailedException":case"com.amazonaws.lexruntimeservice#DependencyFailedException":return[3,8];case"InternalFailureException":case"com.amazonaws.lexruntimeservice#InternalFailureException":return[3,10];case"LimitExceededException":case"com.amazonaws.lexruntimeservice#LimitExceededException":return[3,12];case"LoopDetectedException":case"com.amazonaws.lexruntimeservice#LoopDetectedException":return[3,14];case"NotFoundException":case"com.amazonaws.lexruntimeservice#NotFoundException":return[3,16]}return[3,18];case 2:return s=[{}],[4,Ee(n,t)];case 3:return i=f.apply(void 0,[f.apply(void 0,s.concat([d.sent()])),{name:o,$metadata:Ke(e)}]),[3,19];case 4:return a=[{}],[4,Me(n,t)];case 5:return i=f.apply(void 0,[f.apply(void 0,a.concat([d.sent()])),{name:o,$metadata:Ke(e)}]),[3,19];case 6:return u=[{}],[4,Ae(n,t)];case 7:return i=f.apply(void 0,[f.apply(void 0,u.concat([d.sent()])),{name:o,$metadata:Ke(e)}]),[3,19];case 8:return c=[{}],[4,Ie(n,t)];case 9:return i=f.apply(void 0,[f.apply(void 0,c.concat([d.sent()])),{name:o,$metadata:Ke(e)}]),[3,19];case 10:return l=[{}],[4,ke(n,t)];case 11:return i=f.apply(void 0,[f.apply(void 0,l.concat([d.sent()])),{name:o,$metadata:Ke(e)}]),[3,19];case 12:return h=[{}],[4,Oe(n,t)];case 13:return i=f.apply(void 0,[f.apply(void 0,h.concat([d.sent()])),{name:o,$metadata:Ke(e)}]),[3,19];case 14:return p=[{}],[4,xe(n,t)];case 15:return i=f.apply(void 0,[f.apply(void 0,p.concat([d.sent()])),{name:o,$metadata:Ke(e)}]),[3,19];case 16:return v=[{}],[4,Te(n,t)];case 17:return i=f.apply(void 0,[f.apply(void 0,v.concat([d.sent()])),{name:o,$metadata:Ke(e)}]),[3,19];case 18:g=n.body,o=g.code||g.Code||o,i=f(f({},g),{name:""+o,message:g.message||g.Message||o,$fault:"client",$metadata:Ke(e)}),d.label=19;case 19:return m=i.message||i.Message||o,i.message=m,delete i.Message,[2,Promise.reject(Object.assign(new Error(m),i))]}}))}))},Ee=function(e,t){return l(void 0,void 0,void 0,(function(){var t,n;return d(this,(function(r){return t={name:"BadGatewayException",$fault:"server",$metadata:Ke(e),Message:void 0},void 0!==(n=e.body).Message&&null!==n.Message&&(t.Message=n.Message),[2,t]}))}))},Me=function(e,t){return l(void 0,void 0,void 0,(function(){var t,n;return d(this,(function(r){return t={name:"BadRequestException",$fault:"client",$metadata:Ke(e),message:void 0},void 0!==(n=e.body).message&&null!==n.message&&(t.message=n.message),[2,t]}))}))},Ae=function(e,t){return l(void 0,void 0,void 0,(function(){var t,n;return d(this,(function(r){return t={name:"ConflictException",$fault:"client",$metadata:Ke(e),message:void 0},void 0!==(n=e.body).message&&null!==n.message&&(t.message=n.message),[2,t]}))}))},Ie=function(e,t){return l(void 0,void 0,void 0,(function(){var t,n;return d(this,(function(r){return t={name:"DependencyFailedException",$fault:"client",$metadata:Ke(e),Message:void 0},void 0!==(n=e.body).Message&&null!==n.Message&&(t.Message=n.Message),[2,t]}))}))},ke=function(e,t){return l(void 0,void 0,void 0,(function(){var t,n;return d(this,(function(r){return t={name:"InternalFailureException",$fault:"server",$metadata:Ke(e),message:void 0},void 0!==(n=e.body).message&&null!==n.message&&(t.message=n.message),[2,t]}))}))},Oe=function(e,t){return l(void 0,void 0,void 0,(function(){var t,n;return d(this,(function(r){return t={name:"LimitExceededException",$fault:"client",$metadata:Ke(e),message:void 0,retryAfterSeconds:void 0},void 0!==e.headers["retry-after"]&&(t.retryAfterSeconds=e.headers["retry-after"]),void 0!==(n=e.body).message&&null!==n.message&&(t.message=n.message),[2,t]}))}))},xe=function(e,t){return l(void 0,void 0,void 0,(function(){var t,n;return d(this,(function(r){return t={name:"LoopDetectedException",$fault:"server",$metadata:Ke(e),Message:void 0},void 0!==(n=e.body).Message&&null!==n.Message&&(t.Message=n.Message),[2,t]}))}))},Ce=function(e,t){return l(void 0,void 0,void 0,(function(){var t,n;return d(this,(function(r){return t={name:"NotAcceptableException",$fault:"client",$metadata:Ke(e),message:void 0},void 0!==(n=e.body).message&&null!==n.message&&(t.message=n.message),[2,t]}))}))},Te=function(e,t){return l(void 0,void 0,void 0,(function(){var t,n;return d(this,(function(r){return t={name:"NotFoundException",$fault:"client",$metadata:Ke(e),message:void 0},void 0!==(n=e.body).message&&null!==n.message&&(t.message=n.message),[2,t]}))}))},Pe=function(e,t){return l(void 0,void 0,void 0,(function(){var t,n;return d(this,(function(r){return t={name:"RequestTimeoutException",$fault:"client",$metadata:Ke(e),message:void 0},void 0!==(n=e.body).message&&null!==n.message&&(t.message=n.message),[2,t]}))}))},Ne=function(e,t){return l(void 0,void 0,void 0,(function(){var t,n;return d(this,(function(r){return t={name:"UnsupportedMediaTypeException",$fault:"client",$metadata:Ke(e),message:void 0},void 0!==(n=e.body).message&&null!==n.message&&(t.message=n.message),[2,t]}))}))},Re=function(e,t){return Object.entries(e).reduce((function(e,t){var n,r=h(t,2),i=r[0],o=r[1];return f(f({},e),((n={})[i]=o,n))}),{})},Le=function(e,t){return(e||[]).map((function(e){return function(e,t){return{attachmentLinkUrl:void 0!==e.attachmentLinkUrl&&null!==e.attachmentLinkUrl?e.attachmentLinkUrl:void 0,buttons:void 0!==e.buttons&&null!==e.buttons?Ue(e.buttons,t):void 0,imageUrl:void 0!==e.imageUrl&&null!==e.imageUrl?e.imageUrl:void 0,subTitle:void 0!==e.subTitle&&null!==e.subTitle?e.subTitle:void 0,title:void 0!==e.title&&null!==e.title?e.title:void 0}}(e,t)}))},je=function(e,t){return{score:void 0!==e.score&&null!==e.score?e.score:void 0}},De=function(e,t){return(e||[]).map((function(e){return Be(e,t)}))},Ue=function(e,t){return(e||[]).map((function(e){return function(e,t){return{text:void 0!==e.text&&null!==e.text?e.text:void 0,value:void 0!==e.value&&null!==e.value?e.value:void 0}}(e)}))},Be=function(e,t){return{intentName:void 0!==e.intentName&&null!==e.intentName?e.intentName:void 0,nluIntentConfidence:void 0!==e.nluIntentConfidence&&null!==e.nluIntentConfidence?je(e.nluIntentConfidence,t):void 0,slots:void 0!==e.slots&&null!==e.slots?qe(e.slots,t):void 0}},Fe=function(e,t){return{contentType:void 0!==e.contentType&&null!==e.contentType?e.contentType:void 0,genericAttachments:void 0!==e.genericAttachments&&null!==e.genericAttachments?Le(e.genericAttachments,t):void 0,version:void 0!==e.version&&null!==e.version?e.version:void 0}},ze=function(e,t){return{sentimentLabel:void 0!==e.sentimentLabel&&null!==e.sentimentLabel?e.sentimentLabel:void 0,sentimentScore:void 0!==e.sentimentScore&&null!==e.sentimentScore?e.sentimentScore:void 0}},qe=function(e,t){return Object.entries(e).reduce((function(e,t){var n,r=h(t,2),i=r[0],o=r[1];return f(f({},e),((n={})[i]=o,n))}),{})},Ke=function(e){return{httpStatusCode:e.statusCode,httpHeaders:e.headers,requestId:e.headers["x-amzn-requestid"]}},He=function(e,t){return function(e,t){return void 0===e&&(e=new Uint8Array),e instanceof Uint8Array?Promise.resolve(e):t.streamCollector(e)||Promise.resolve(new Uint8Array)}(e,t).then((function(e){return t.utf8Encoder(e)}))},Ve=function(e){return!(void 0===e||""===e||Object.getOwnPropertyNames(e).includes("length")&&0==e.length||Object.getOwnPropertyNames(e).includes("size")&&0==e.size)},Ge=function(e,t){return He(e,t).then((function(e){return e.length?JSON.parse(e):{}}))},We=function(e,t){var n,r,i=function(e){var t=e;return t.indexOf(":")>=0&&(t=t.split(":")[0]),t.indexOf("#")>=0&&(t=t.split("#")[1]),t},o=(n=e.headers,r="x-amzn-errortype",Object.keys(n).find((function(e){return e.toLowerCase()===r.toLowerCase()})));return void 0!==o?i(e.headers[o]):void 0!==t.code?i(t.code):void 0!==t.__type?i(t.__type):""},$e=n(10),Ye=function(e){function t(t){var n=e.call(this)||this;return n.input=t,n}return c(t,e),t.prototype.resolveMiddleware=function(e,t,n){this.middlewareStack.use(Object($e.a)(t,this.serialize,this.deserialize));var r=e.concat(this.middlewareStack),i=t.logger,o={logger:i,clientName:"LexRuntimeServiceClient",commandName:"PostTextCommand",inputFilterSensitiveLog:U.filterSensitiveLog,outputFilterSensitiveLog:G.filterSensitiveLog};"function"==typeof i.info&&i.info({clientName:"LexRuntimeServiceClient",commandName:"PostTextCommand"});var s=t.requestHandler;return r.resolve((function(e){return s.handle(e.request,n||{})}),o)},t.prototype.serialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,l;return d(this,(function(d){switch(d.label){case 0:if(n={"Content-Type":"application/json"},r="/bot/{botName}/alias/{botAlias}/user/{userId}/text",void 0===e.userId)throw new Error("No value provided for input HTTP label: userId.");if((i=e.userId).length<=0)throw new Error("Empty value provided for input HTTP label: userId.");if(r=r.replace("{userId}",Object(me.f)(i)),void 0===e.botAlias)throw new Error("No value provided for input HTTP label: botAlias.");if((i=e.botAlias).length<=0)throw new Error("Empty value provided for input HTTP label: botAlias.");if(r=r.replace("{botAlias}",Object(me.f)(i)),void 0===e.botName)throw new Error("No value provided for input HTTP label: botName.");if((i=e.botName).length<=0)throw new Error("Empty value provided for input HTTP label: botName.");return r=r.replace("{botName}",Object(me.f)(i)),o=JSON.stringify(f(f(f({},void 0!==e.inputText&&{inputText:e.inputText}),void 0!==e.requestAttributes&&{requestAttributes:Re(e.requestAttributes,t)}),void 0!==e.sessionAttributes&&{sessionAttributes:Re(e.sessionAttributes,t)})),[4,t.endpoint()];case 1:return s=d.sent(),a=s.hostname,u=s.protocol,c=void 0===u?"https":u,l=s.port,[2,new we.a({protocol:c,hostname:a,port:l,method:"POST",headers:n,path:r,body:o})]}}))}))}(e,t)},t.prototype.deserialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n,r;return d(this,(function(i){switch(i.label){case 0:return 200!==e.statusCode&&e.statusCode>=300?[2,Se(e,t)]:(n={$metadata:Ke(e),alternativeIntents:void 0,botVersion:void 0,dialogState:void 0,intentName:void 0,message:void 0,messageFormat:void 0,nluIntentConfidence:void 0,responseCard:void 0,sentimentResponse:void 0,sessionAttributes:void 0,sessionId:void 0,slotToElicit:void 0,slots:void 0},[4,Ge(e.body,t)]);case 1:return void 0!==(r=i.sent()).alternativeIntents&&null!==r.alternativeIntents&&(n.alternativeIntents=De(r.alternativeIntents,t)),void 0!==r.botVersion&&null!==r.botVersion&&(n.botVersion=r.botVersion),void 0!==r.dialogState&&null!==r.dialogState&&(n.dialogState=r.dialogState),void 0!==r.intentName&&null!==r.intentName&&(n.intentName=r.intentName),void 0!==r.message&&null!==r.message&&(n.message=r.message),void 0!==r.messageFormat&&null!==r.messageFormat&&(n.messageFormat=r.messageFormat),void 0!==r.nluIntentConfidence&&null!==r.nluIntentConfidence&&(n.nluIntentConfidence=je(r.nluIntentConfidence,t)),void 0!==r.responseCard&&null!==r.responseCard&&(n.responseCard=Fe(r.responseCard,t)),void 0!==r.sentimentResponse&&null!==r.sentimentResponse&&(n.sentimentResponse=ze(r.sentimentResponse,t)),void 0!==r.sessionAttributes&&null!==r.sessionAttributes&&(n.sessionAttributes=qe(r.sessionAttributes,t)),void 0!==r.sessionId&&null!==r.sessionId&&(n.sessionId=r.sessionId),void 0!==r.slotToElicit&&null!==r.slotToElicit&&(n.slotToElicit=r.slotToElicit),void 0!==r.slots&&null!==r.slots&&(n.slots=qe(r.slots,t)),[2,Promise.resolve(n)]}}))}))}(e,t)},t}(me.b),Je=function(e){function t(t){var n=e.call(this)||this;return n.input=t,n}return c(t,e),t.prototype.resolveMiddleware=function(e,t,n){this.middlewareStack.use(Object($e.a)(t,this.serialize,this.deserialize));var r=e.concat(this.middlewareStack),i=t.logger,o={logger:i,clientName:"LexRuntimeServiceClient",commandName:"PostContentCommand",inputFilterSensitiveLog:N.filterSensitiveLog,outputFilterSensitiveLog:L.filterSensitiveLog};"function"==typeof i.info&&i.info({clientName:"LexRuntimeServiceClient",commandName:"PostContentCommand"});var s=t.requestHandler;return r.resolve((function(e){return s.handle(e.request,n||{})}),o)},t.prototype.serialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,l;return d(this,(function(d){switch(d.label){case 0:if(n=f(f(f(f({"Content-Type":"application/octet-stream","x-amz-content-sha256":"UNSIGNED-PAYLOAD"},Ve(e.requestAttributes)&&{"x-amz-lex-request-attributes":me.c.fromObject(e.requestAttributes)}),Ve(e.sessionAttributes)&&{"x-amz-lex-session-attributes":me.c.fromObject(e.sessionAttributes)}),Ve(e.contentType)&&{"Content-Type":e.contentType}),Ve(e.accept)&&{Accept:e.accept}),r="/bot/{botName}/alias/{botAlias}/user/{userId}/content",void 0===e.botAlias)throw new Error("No value provided for input HTTP label: botAlias.");if((i=e.botAlias).length<=0)throw new Error("Empty value provided for input HTTP label: botAlias.");if(r=r.replace("{botAlias}",Object(me.f)(i)),void 0===e.botName)throw new Error("No value provided for input HTTP label: botName.");if((i=e.botName).length<=0)throw new Error("Empty value provided for input HTTP label: botName.");if(r=r.replace("{botName}",Object(me.f)(i)),void 0===e.userId)throw new Error("No value provided for input HTTP label: userId.");if((i=e.userId).length<=0)throw new Error("Empty value provided for input HTTP label: userId.");return r=r.replace("{userId}",Object(me.f)(i)),void 0!==e.inputStream&&(o=e.inputStream),[4,t.endpoint()];case 1:return s=d.sent(),a=s.hostname,u=s.protocol,c=void 0===u?"https":u,l=s.port,[2,new we.a({protocol:c,hostname:a,port:l,method:"POST",headers:n,path:r,body:o})]}}))}))}(e,t)},t.prototype.deserialize=function(e,t){return function(e,t){return l(void 0,void 0,void 0,(function(){var n,r;return d(this,(function(i){return 200!==e.statusCode&&e.statusCode>=300?[2,_e(e,t)]:(n={$metadata:Ke(e),alternativeIntents:void 0,audioStream:void 0,botVersion:void 0,contentType:void 0,dialogState:void 0,inputTranscript:void 0,intentName:void 0,message:void 0,messageFormat:void 0,nluIntentConfidence:void 0,sentimentResponse:void 0,sessionAttributes:void 0,sessionId:void 0,slotToElicit:void 0,slots:void 0},void 0!==e.headers["x-amz-lex-alternative-intents"]&&(n.alternativeIntents=new me.c(e.headers["x-amz-lex-alternative-intents"])),void 0!==e.headers["x-amz-lex-message-format"]&&(n.messageFormat=e.headers["x-amz-lex-message-format"]),void 0!==e.headers["content-type"]&&(n.contentType=e.headers["content-type"]),void 0!==e.headers["x-amz-lex-message"]&&(n.message=e.headers["x-amz-lex-message"]),void 0!==e.headers["x-amz-lex-bot-version"]&&(n.botVersion=e.headers["x-amz-lex-bot-version"]),void 0!==e.headers["x-amz-lex-sentiment"]&&(n.sentimentResponse=e.headers["x-amz-lex-sentiment"]),void 0!==e.headers["x-amz-lex-slots"]&&(n.slots=new me.c(e.headers["x-amz-lex-slots"])),void 0!==e.headers["x-amz-lex-input-transcript"]&&(n.inputTranscript=e.headers["x-amz-lex-input-transcript"]),void 0!==e.headers["x-amz-lex-slot-to-elicit"]&&(n.slotToElicit=e.headers["x-amz-lex-slot-to-elicit"]),void 0!==e.headers["x-amz-lex-session-attributes"]&&(n.sessionAttributes=new me.c(e.headers["x-amz-lex-session-attributes"])),void 0!==e.headers["x-amz-lex-session-id"]&&(n.sessionId=e.headers["x-amz-lex-session-id"]),void 0!==e.headers["x-amz-lex-dialog-state"]&&(n.dialogState=e.headers["x-amz-lex-dialog-state"]),void 0!==e.headers["x-amz-lex-intent-name"]&&(n.intentName=e.headers["x-amz-lex-intent-name"]),void 0!==e.headers["x-amz-lex-nlu-intent-confidence"]&&(n.nluIntentConfidence=new me.c(e.headers["x-amz-lex-nlu-intent-confidence"])),r=e.body,n.audioStream=r,[2,Promise.resolve(n)])}))}))}(e,t)},t}(me.b),Ze=n(89),Xe=n(50),Qe=function(e){if(e instanceof Blob||e instanceof ReadableStream)return new Response(e).arrayBuffer().then((function(e){return new Uint8Array(e)}));throw new Error("Readable is not supported.")},et=(ye=function(e,t){return(ye=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)},function(e,t){function n(){this.constructor=e}ye(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),tt=function(){return(tt=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]=0&&(t=t.split(":")[0]),t.indexOf("#")>=0&&(t=t.split("#")[1]),t},o=(n=e.headers,r="x-amzn-errortype",Object.keys(n).find((function(e){return e.toLowerCase()===r.toLowerCase()})));return void 0!==o?i(e.headers[o]):void 0!==t.code?i(t.code):void 0!==t.__type?i(t.__type):""},N=n(10),R=function(e){function t(t){var n=e.call(this)||this;return n.input=t,n}return u(t,e),t.prototype.resolveMiddleware=function(e,t,n){this.middlewareStack.use(Object(N.a)(t,this.serialize,this.deserialize));var r=e.concat(this.middlewareStack),i=t.logger,o={logger:i,clientName:"PersonalizeEventsClient",commandName:"PutEventsCommand",inputFilterSensitiveLog:p.filterSensitiveLog,outputFilterSensitiveLog:function(e){return e}};"function"==typeof i.info&&i.info({clientName:"PersonalizeEventsClient",commandName:"PutEventsCommand"});var s=t.requestHandler;return r.resolve((function(e){return s.handle(e.request,n||{})}),o)},t.prototype.serialize=function(e,t){return function(e,t){return f(void 0,void 0,void 0,(function(){var n,r,i,o,s,a,u,f;return l(this,(function(l){switch(l.label){case 0:return n={"Content-Type":"application/json"},r="/events",i=JSON.stringify(c(c(c(c({},void 0!==e.eventList&&{eventList:k(e.eventList,t)}),void 0!==e.sessionId&&{sessionId:e.sessionId}),void 0!==e.trackingId&&{trackingId:e.trackingId}),void 0!==e.userId&&{userId:e.userId})),[4,t.endpoint()];case 1:return o=l.sent(),s=o.hostname,a=o.protocol,u=void 0===a?"https":a,f=o.port,[2,new E.a({protocol:u,hostname:s,port:f,method:"POST",headers:n,path:r,body:i})]}}))}))}(e,t)},t.prototype.deserialize=function(e,t){return function(e,t){return f(void 0,void 0,void 0,(function(){var n;return l(this,(function(r){switch(r.label){case 0:return 200!==e.statusCode&&e.statusCode>=300?[2,A(e,t)]:(n={$metadata:x(e)},[4,C(e.body,t)]);case 1:return r.sent(),[2,Promise.resolve(n)]}}))}))}(e,t)},t}(M.b),L=n(152),j=n(38),D=n(18),U=n(24),B=n(11),F=n(39),z=n(17),q=n(40),K=n(41),H=n(15),V="personalize-events.{region}.amazonaws.com",G=new Set(["ap-east-1","ap-northeast-1","ap-northeast-2","ap-south-1","ap-southeast-1","ap-southeast-2","ca-central-1","eu-central-1","eu-north-1","eu-west-1","eu-west-2","eu-west-3","me-south-1","sa-east-1","us-east-1","us-east-2","us-west-1","us-west-2"]),W=new Set(["cn-north-1","cn-northwest-1"]),$=new Set(["us-iso-east-1"]),Y=new Set(["us-isob-east-1"]),J=new Set(["us-gov-east-1","us-gov-west-1"]),Z=c(c({},{apiVersion:"2018-03-22",disableHostPrefix:!1,logger:{},regionInfoProvider:function(e,t){var n=void 0;return G.has(e)&&(n={hostname:V.replace("{region}",e),partition:"aws"}),W.has(e)&&(n={hostname:"personalize-events.{region}.amazonaws.com.cn".replace("{region}",e),partition:"aws-cn"}),$.has(e)&&(n={hostname:"personalize-events.{region}.c2s.ic.gov".replace("{region}",e),partition:"aws-iso"}),Y.has(e)&&(n={hostname:"personalize-events.{region}.sc2s.sgov.gov".replace("{region}",e),partition:"aws-iso-b"}),J.has(e)&&(n={hostname:"personalize-events.{region}.amazonaws.com".replace("{region}",e),partition:"aws-us-gov"}),void 0===n&&(n={hostname:V.replace("{region}",e),partition:"aws"}),Promise.resolve(n)},signingName:"personalize"}),{runtime:"browser",base64Decoder:z.a,base64Encoder:z.b,bodyLengthChecker:q.a,credentialDefaultProvider:Object(U.a)("Credential is missing"),defaultUserAgent:Object(K.a)(L.name,L.version),maxAttempts:B.a,region:Object(U.a)("Region is missing"),requestHandler:new D.a,sha256:j.Sha256,streamCollector:D.b,urlParser:F.a,utf8Decoder:H.a,utf8Encoder:H.b}),X=n(22),Q=n(37),ee=n(21),te=n(43),ne=n(25),re=n(23),ie=function(e){function t(t){var n=this,r=c(c({},Z),t),i=Object(X.b)(r),o=Object(X.a)(i),s=Object(ne.b)(o),a=Object(B.c)(s),u=Object(re.b)(a),f=Object(ee.b)(u);return(n=e.call(this,f)||this).config=f,n.middlewareStack.use(Object(ne.a)(n.config)),n.middlewareStack.use(Object(B.b)(n.config)),n.middlewareStack.use(Object(re.a)(n.config)),n.middlewareStack.use(Object(Q.a)(n.config)),n.middlewareStack.use(Object(ee.a)(n.config)),n.middlewareStack.use(Object(te.a)(n.config)),n}return u(t,e),t.prototype.destroy=function(){e.prototype.destroy.call(this)},t}(M.a),oe=n(36),se=n.n(oe),ae=n(108),ue=n.n(ae),ce=n(27),fe=n(26),le=(new r.a("AmazonPersonalizeProvider"),function(){function e(e){void 0===e&&(e=""),this._isBrowser=i.a.browserOrNode().isBrowser,this._timerKey=Object(ce.v1)().substr(0,15),this._refreshTimer()}return e.prototype._refreshTimer=function(){this._timer&&clearInterval(this._timer);var e=this;this._timer=setInterval((function(){e._timerKey=Object(ce.v1)().substr(0,15)}),3e4)},e.prototype.storeValue=function(e,t){var n=new Date,r=new Date;r.setTime(n.getTime()+6048e5),fe.a.setItem(this._getCachePrefix(e),t,{expires:r.getTime()})},e.prototype.retrieveValue=function(e){return fe.a.getItem(this._getCachePrefix(e))},e.prototype._getCachePrefix=function(e){return this._isBrowser?e+"."+window.location.host:"peronslize"},e.prototype.getTimerKey=function(){return this._timerKey},e.prototype.updateSessionInfo=function(e,t){var n=t.userId,r=t.sessionId;if(this._isRequireNewSession(e,n,r)){var i=Object(ce.v1)();this.storeValue("_awsct_uid",e),this.storeValue("_awsct_sid",i),t.sessionId=i}else this._isRequireUpdateSessionInfo(e,n,r)&&this.storeValue("_awsct_uid",e);t.userId=e},e.prototype._isRequireUpdateSessionInfo=function(e,t,n){return!se()(n)&&se()(t)&&!se()(e)},e.prototype.retrieveSessionInfo=function(e){var t={};return t.trackingId=e,t.sessionId=this.retrieveValue("_awsct_sid"),t.userId=this.retrieveValue("_awsct_uid"),se()(t.sessionId)&&(t.sessionId=Object(ce.v1)(),this.storeValue("_awsct_sid",t.sessionId)),this.storeValue("_awsct",e),t},e.prototype._isRequireNewSession=function(e,t,n){var r=se()(n),i=se()(e)&&!se()(t),o=!se()(e)&&!se()(t)&&!ue()(e,t);return r||i||o},e}());!function(e){e.PLAY="play",e.PAUSE="pause",e.ENDED="Ended"}(w||(w={})),function(e){e.IFRAME="IFRAME",e.VIDEO="VIDEO",e.AUDIO="AUDIO"}(_||(_={})),function(e){e.PLAY="Play",e.ENDED="Ended",e.PAUSE="Pause",e.TIME_WATCHED="TimeWatched"}(S||(S={}));var de=function(){function e(e,t){var n;this.eventActionMapping=((n={})[S.ENDED]=this.endedEventAction.bind(this),n[S.PLAY]=this.playEventAction.bind(this),n[S.PAUSE]=this.pauseEventAction.bind(this),n);var r=e.eventData;this._params=e,this._mediaElement=document.getElementById(r.properties.domElementId),this._started=!1,this._provider=t,{IFRAME:this._iframeMediaTracker,VIDEO:this._html5MediaTracker,AUDIO:this._html5MediaTracker}[this._mediaElement.tagName].bind(this)(),this._initYoutubeFrame()}return e.prototype._initYoutubeFrame=function(){this._youTubeIframeLoader={src:"https://www.youtube.com/iframe_api",loading:!1,loaded:!1,listeners:[],load:function(e){var t=this;if(this.listeners.push(e),this.loaded)setTimeout((function(){t.done()}));else if(!this.loading){this.loading=!0,window.onYouTubeIframeAPIReady=function(){t.loaded=!0,t.done()};var n=document.createElement("script");n.type="text/javascript",n.src=this.src,document.body.appendChild(n)}},done:function(){for(delete window.onYouTubeIframeAPIReady;this.listeners.length;)this.listeners.pop()(window.YT)}}},e.prototype._iframeMediaTracker=function(){var e=this;setInterval((function(){e._started&&e.recordEvent(_.IFRAME,S.TIME_WATCHED)}),3e3),this._youTubeIframeLoader.load((function(t){e._iframePlayer=new t.Player(e._mediaElement.id,{events:{onStateChange:e._onPlayerStateChange.bind(e)}})}))},e.prototype._onPlayerStateChange=function(e){var t={0:S.ENDED,1:S.PLAY,2:S.PAUSE}[e.data];t&&this.eventActionMapping[t](_.IFRAME)},e.prototype._html5MediaTracker=function(){var e=this;setInterval((function(){e._started&&e.recordEvent(_.VIDEO,S.TIME_WATCHED)}),3e3),this._mediaElement.addEventListener(w.PLAY,(function(){e.eventActionMapping[S.PLAY](_.VIDEO)}),!1),this._mediaElement.addEventListener(w.PAUSE,(function(){e.eventActionMapping[S.PAUSE](_.VIDEO)}),!1),this._mediaElement.addEventListener(w.ENDED,(function(){e.eventActionMapping[S.ENDED](_.VIDEO)}),!1)},e.prototype.playEventAction=function(e){this._started=!0,this.recordEvent(e,S.PLAY)},e.prototype.pauseEventAction=function(e){this._started=!1,this.recordEvent(e,S.PAUSE)},e.prototype.endedEventAction=function(e){this._started=!1,this.recordEvent(e,S.ENDED)},e.prototype.recordEvent=function(e,t){var n=Object.assign({},this._params),r=n.eventData;r.eventType=t,e===_.VIDEO?(r.properties.timestamp=this._mediaElement.currentTime,r.properties.duration=this._mediaElement.duration):(r.properties.timestamp=this._financial(this._iframePlayer.getCurrentTime()),r.properties.duration=this._financial(this._iframePlayer.getDuration()));var i=parseFloat(r.properties.timestamp)/parseFloat(r.properties.duration);r.properties.eventValue=Number(i.toFixed(4)),delete r.properties.domElementId,this._provider.putToBuffer(n)},e.prototype._financial=function(e){return Number.parseFloat(e).toFixed(4)},e}(),he=n(252),pe=n.n(he),ve=function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function s(e){try{u(r.next(e))}catch(e){o(e)}}function a(e){try{u(r.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}u((r=r.apply(e,t||[])).next())}))},ge=function(e,t){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(i=s.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&this._config.flushSize<=10?this._config.flushSize:5,this._config.flushInterval=this._config.flushInterval||5e3,this._sessionManager=new le,se()(this._config.trackingId)||(this._sessionInfo=this._sessionManager.retrieveSessionInfo(this._config.trackingId)),this._isBrowser=i.a.browserOrNode().isBrowser,this._setupTimer()}return e.prototype._setupTimer=function(){this._timer&&clearInterval(this._timer);var e=this._config.flushInterval,t=this;this._timer=setInterval((function(){t._sendFromBuffer()}),e)},e.prototype.record=function(e){return ve(this,void 0,void 0,(function(){var t,n,r,i,o;return ge(this,(function(s){switch(s.label){case 0:return[4,this._getCredentials()];case 1:return(t=s.sent())?(Object.assign(e,{config:this._config,credentials:t,sentAt:new Date}),n=e.event,r=n.eventType,i=n.properties,"Identify"===r?(this._sessionManager.updateSessionInfo(i&&i.userId?i.userId:"",this._sessionInfo),[2]):(se()(e.event.userId)||this._sessionManager.updateSessionInfo(e.event.userId,this._sessionInfo),o=this.generateRequestParams(e,this._sessionInfo),"MediaAutoTrack"!==r?[3,7]:this._isBrowser?se()(pe()(o,"eventData.properties.domElementId",null))?[3,3]:[4,this.isElementFullyLoaded(this.loadElement,o.eventData.properties.domElementId,500,5)]:[3,5])):[2,Promise.resolve(!1)];case 2:return s.sent()?new de(o,this):me.debug("Cannot find the media element."),[3,4];case 3:me.debug("Missing domElementId field in 'properties' for MediaAutoTrack event type."),s.label=4;case 4:return[3,6];case 5:me.debug("MediaAutoTrack only for browser"),s.label=6;case 6:return[2];case 7:return[2,this.putToBuffer(o)]}}))}))},e.prototype.loadElement=function(e){return new Promise((function(t,n){return document.getElementById(e)&&document.getElementById(e).clientHeight?t(!0):n(!0)}))},e.prototype.isElementFullyLoaded=function(e,t,n,r){var i=this;return new Promise((function(o,s){return e(t).then(o).catch((function(a){return r-1>0?(u=n,new Promise((function(e){return setTimeout(e,u)}))).then(i.isElementFullyLoaded.bind(null,e,t,n,r-1)).then(o).catch(s):s(a);var u}))}))},e.prototype.getCategory=function(){return"Analytics"},e.prototype.getProviderName=function(){return"AmazonPersonalize"},e.prototype.configure=function(e){me.debug("configure Analytics",e);var t=e||{};return this._config=Object.assign({},this._config,t),se()(this._config.trackingId)||(this._sessionInfo=this._sessionManager.retrieveSessionInfo(this._config.trackingId)),this._setupTimer(),this._config},e.prototype.generateRequestParams=function(e,t){var n={},r=e.event,i=r.eventType,o=r.properties;return n.eventData={eventType:i,properties:o},n.sessionInfo=t,n.sentAt=e.sentAt,n.credentials=e.credentials,n.config=e.config,n},e.prototype._sendEvents=function(e){var t=e.length;if(0!==t){var n=e[0],r=n.config,i=n.credentials,o=n.sessionInfo;if(!this._init(r,i))return!1;if(t>0){for(var s=[],a=0;a0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},c=function(){for(var e=[],t=0;t0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]=300?[2,st(e,t)]:[4,Et(e.body,t)];case 1:return n=o.sent(),{},r=gt(n,t),i=a({$metadata:wt(e)},r),[2,Promise.resolve(i)]}}))}))}(e,t)},t}(rt.b),It=n(151),kt=n(38),Ot=n(18),xt=n(24),Ct=n(11),Tt=n(39),Pt=n(17),Nt=n(40),Rt=n(41),Lt=n(15),jt=new Set(["ap-east-1","ap-northeast-1","ap-northeast-2","ap-south-1","ap-southeast-1","ap-southeast-2","ca-central-1","eu-central-1","eu-north-1","eu-west-1","eu-west-2","eu-west-3","me-south-1","sa-east-1","us-east-1","us-east-2","us-west-1","us-west-2"]),Dt=new Set(["cn-north-1","cn-northwest-1"]),Ut=new Set(["us-iso-east-1"]),Bt=new Set(["us-isob-east-1"]),Ft=new Set(["us-gov-east-1","us-gov-west-1"]),zt=a(a({},{apiVersion:"2015-08-04",disableHostPrefix:!1,logger:{},regionInfoProvider:function(e,t){var n=void 0;switch(e){case"ap-east-1":n={hostname:"firehose.ap-east-1.amazonaws.com",partition:"aws"};break;case"ap-northeast-1":n={hostname:"firehose.ap-northeast-1.amazonaws.com",partition:"aws"};break;case"ap-northeast-2":n={hostname:"firehose.ap-northeast-2.amazonaws.com",partition:"aws"};break;case"ap-south-1":n={hostname:"firehose.ap-south-1.amazonaws.com",partition:"aws"};break;case"ap-southeast-1":n={hostname:"firehose.ap-southeast-1.amazonaws.com",partition:"aws"};break;case"ap-southeast-2":n={hostname:"firehose.ap-southeast-2.amazonaws.com",partition:"aws"};break;case"ca-central-1":n={hostname:"firehose.ca-central-1.amazonaws.com",partition:"aws"};break;case"cn-north-1":n={hostname:"firehose.cn-north-1.amazonaws.com.cn",partition:"aws-cn"};break;case"cn-northwest-1":n={hostname:"firehose.cn-northwest-1.amazonaws.com.cn",partition:"aws-cn"};break;case"eu-central-1":n={hostname:"firehose.eu-central-1.amazonaws.com",partition:"aws"};break;case"eu-north-1":n={hostname:"firehose.eu-north-1.amazonaws.com",partition:"aws"};break;case"eu-west-1":n={hostname:"firehose.eu-west-1.amazonaws.com",partition:"aws"};break;case"eu-west-2":n={hostname:"firehose.eu-west-2.amazonaws.com",partition:"aws"};break;case"eu-west-3":n={hostname:"firehose.eu-west-3.amazonaws.com",partition:"aws"};break;case"me-south-1":n={hostname:"firehose.me-south-1.amazonaws.com",partition:"aws"};break;case"sa-east-1":n={hostname:"firehose.sa-east-1.amazonaws.com",partition:"aws"};break;case"us-east-1":n={hostname:"firehose.us-east-1.amazonaws.com",partition:"aws"};break;case"us-east-2":n={hostname:"firehose.us-east-2.amazonaws.com",partition:"aws"};break;case"us-gov-east-1":n={hostname:"firehose.us-gov-east-1.amazonaws.com",partition:"aws-us-gov"};break;case"us-gov-west-1":n={hostname:"firehose.us-gov-west-1.amazonaws.com",partition:"aws-us-gov"};break;case"us-west-1":n={hostname:"firehose.us-west-1.amazonaws.com",partition:"aws"};break;case"us-west-2":n={hostname:"firehose.us-west-2.amazonaws.com",partition:"aws"};break;default:jt.has(e)&&(n={hostname:"firehose.{region}.amazonaws.com".replace("{region}",e),partition:"aws"}),Dt.has(e)&&(n={hostname:"firehose.{region}.amazonaws.com.cn".replace("{region}",e),partition:"aws-cn"}),Ut.has(e)&&(n={hostname:"firehose.{region}.c2s.ic.gov".replace("{region}",e),partition:"aws-iso"}),Bt.has(e)&&(n={hostname:"firehose.{region}.sc2s.sgov.gov".replace("{region}",e),partition:"aws-iso-b"}),Ft.has(e)&&(n={hostname:"firehose.{region}.amazonaws.com".replace("{region}",e),partition:"aws-us-gov"}),void 0===n&&(n={hostname:"firehose.{region}.amazonaws.com".replace("{region}",e),partition:"aws"})}return Promise.resolve(n)},signingName:"firehose"}),{runtime:"browser",base64Decoder:Pt.a,base64Encoder:Pt.b,bodyLengthChecker:Nt.a,credentialDefaultProvider:Object(xt.a)("Credential is missing"),defaultUserAgent:Object(Rt.a)(It.name,It.version),maxAttempts:Ct.a,region:Object(xt.a)("Region is missing"),requestHandler:new Ot.a,sha256:kt.Sha256,streamCollector:Ot.b,urlParser:Tt.a,utf8Decoder:Lt.a,utf8Encoder:Lt.b}),qt=n(22),Kt=n(37),Ht=n(21),Vt=n(43),Gt=n(25),Wt=n(23),$t=function(e){function t(t){var n=this,r=a(a({},zt),t),i=Object(qt.b)(r),o=Object(qt.a)(i),s=Object(Gt.b)(o),u=Object(Ct.c)(s),c=Object(Wt.b)(u),f=Object(Ht.b)(c);return(n=e.call(this,f)||this).config=f,n.middlewareStack.use(Object(Gt.a)(n.config)),n.middlewareStack.use(Object(Ct.b)(n.config)),n.middlewareStack.use(Object(Wt.a)(n.config)),n.middlewareStack.use(Object(Kt.a)(n.config)),n.middlewareStack.use(Object(Ht.a)(n.config)),n.middlewareStack.use(Object(Vt.a)(n.config)),n}return s(t,e),t.prototype.destroy=function(){e.prototype.destroy.call(this)},t}(rt.a),Yt=(it=function(e,t){return(it=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)},function(e,t){function n(){this.constructor=e}it(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),Jt=new r.a("AWSKineisFirehoseProvider"),Zt=function(e){function t(t){return e.call(this,t)||this}return Yt(t,e),t.prototype.getProviderName=function(){return"AWSKinesisFirehose"},t.prototype._sendEvents=function(e){var t=this;if(0!==e.length){var n=e[0],r=n.config,i=n.credentials;if(!this._init(r,i))return!1;var o={};e.map((function(e){var t=e.event,n=t.streamName,r=t.data;void 0===o[n]&&(o[n]=[]);var i=r&&"string"!=typeof r?JSON.stringify(r):r,s={Data:Object(Lt.a)(i)};o[n].push(s)})),Object.keys(o).map((function(e){Jt.debug("putting records to kinesis",e,"with records",o[e]),t._kinesisFirehose.send(new At({Records:o[e],DeliveryStreamName:e})).then((function(t){return Jt.debug("Upload records to stream",e)})).catch((function(e){return Jt.debug("Failed to upload records to Kinesis",e)}))}))}},t.prototype._init=function(e,t){if(Jt.debug("init clients"),this._kinesisFirehose&&this._config.credentials&&this._config.credentials.sessionToken===t.sessionToken&&this._config.credentials.identityId===t.identityId)return Jt.debug("no change for analytics config, directly return from init"),!0;this._config.credentials=t;var n=e.region;return this._initFirehose(n,t)},t.prototype._initFirehose=function(e,t){return Jt.debug("initialize kinesis firehose with credentials",t),this._kinesisFirehose=new $t({apiVersion:"2015-08-04",region:e,credentials:t}),!0},t}(i.a)},function(e,t,n){"use strict";n.d(t,"a",(function(){return T}));var r,i=n(44),o=n(19),s=n(5),a=n(89),u=n(104),c=function(){return(c=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},A=new i.a("SumerianProvider"),I=function(e){function t(t){return void 0===t&&(t={}),e.call(this,t)||this}return w(t,e),t.prototype.getProviderName=function(){return"SumerianProvider"},t.prototype.loadScript=function(e){return S(this,void 0,void 0,(function(){return E(this,(function(t){return[2,new Promise((function(t,n){var r=document.createElement("script");r.src=e,r.addEventListener("load",(function(e){t()})),r.addEventListener("error",(function(t){n(new Error("Failed to load script: "+e))})),document.head.appendChild(r)}))]}))}))},t.prototype.loadScene=function(e,t,n){return S(this,void 0,void 0,(function(){var r,i,o,c,f,l,d,h,p,v,g,y,w,S,I,k,O,x,C,T,P,N,R,L,j,D,U;return E(this,(function(E){switch(E.label){case 0:if(!e)throw l="No scene name passed into loadScene",A.error(l),new b(l);if(!t)throw l="No dom element id passed into loadScene",A.error(l),new m(l);if(!(r=document.getElementById(t)))throw l="DOM element id, "+t+" not found",A.error(l),new m(l);if(!(i=this.getScene(e)).sceneConfig)throw l="No scene config configured for scene: "+e,A.error(l),new b(l);if(o=i.sceneConfig.url,c=i.sceneConfig.sceneId,i.sceneConfig.hasOwnProperty("region"))f=i.sceneConfig.region;else{if(!this.options.hasOwnProperty("region"))throw l="No region configured for scene: "+e,A.error(l),new b(l);f=this.options.region}d={region:f,customUserAgent:s.a.userAgent+"-SumerianScene"},h={headers:{"X-Amz-User-Agent":s.a.userAgent}},p=o,E.label=1;case 1:return E.trys.push([1,3,,4]),[4,a.a.get()];case 2:return v=E.sent(),d.credentials=v,g={secret_key:v.secretAccessKey,access_key:v.accessKeyId,session_token:v.sessionToken},y={region:f,service:"sumerian"},w=u.a.sign({method:"GET",url:o},g,y),h.headers=_(_({},h.headers),w.headers),p=w.url,[3,4];case 3:return E.sent(),A.debug("No credentials available, the request will be unsigned"),[3,4];case 4:return[4,fetch(p,h)];case 5:return[4,(S=E.sent()).json()];case 6:if(I=E.sent(),403===S.status)throw I.message?(A.error("Failure to authenticate user: "+I.message),new b("Failure to authenticate user: "+I.message)):(A.error("Failure to authenticate user"),new b("Failure to authenticate user"));return k=I.bundleData[c],[4,fetch(k.url,{headers:k.headers})];case 7:return[4,E.sent().json()];case 8:O=E.sent(),E.label=9;case 9:return E.trys.push([9,11,,12]),[4,this.loadScript(O[c].bootstrapperUrl)];case 10:return E.sent(),[3,12];case 11:throw x=E.sent(),A.error(x),new b(x);case 12:return C=n.progressCallback?n.progressCallback:void 0,T=i.publishParamOverrides?i.publishParamOverrides:void 0,P={element:r,sceneId:c,sceneBundle:O,apiResponse:I,progressCallback:C,publishParamOverrides:T,awsSDKConfigOverride:d},[4,window.SumerianBootstrapper.loadScene(P)];case 13:N=E.sent(),i.sceneController=N,i.isLoaded=!0;try{for(R=M(N.sceneLoadWarnings),L=R.next();!L.done;L=R.next())j=L.value,A.warn("loadScene warning: "+j)}catch(e){D={error:e}}finally{try{L&&!L.done&&(U=R.return)&&U.call(R)}finally{if(D)throw D.error}}return[2]}}))}))},t.prototype.isSceneLoaded=function(e){return this.getScene(e).isLoaded||!1},t.prototype.getScene=function(e){if(!this.options.scenes){var t="No scenes were defined in the configuration";throw A.error(t),new p(t)}if(!e){t="No scene name was passed";throw A.error(t),new v(t)}if(!this.options.scenes[e]){t="Scene '"+e+"' is not configured";throw A.error(t),new v(t)}return this.options.scenes[e]},t.prototype.getSceneController=function(e){if(!this.options.scenes){var t="No scenes were defined in the configuration";throw A.error(t),new p(t)}var n=this.options.scenes[e];if(!n){t="Scene '"+e+"' is not configured";throw A.error(t),new v(t)}var r=n.sceneController;if(!r){t="Scene controller for '"+e+"' has not been loaded";throw A.error(t),new g(t)}return r},t.prototype.isVRCapable=function(e){return this.getSceneController(e).vrCapable},t.prototype.isVRPresentationActive=function(e){return this.getSceneController(e).vrPresentationActive},t.prototype.start=function(e){this.getSceneController(e).start()},t.prototype.enterVR=function(e){this.getSceneController(e).enterVR()},t.prototype.exitVR=function(e){this.getSceneController(e).exitVR()},t.prototype.isMuted=function(e){return this.getSceneController(e).muted},t.prototype.setMuted=function(e,t){this.getSceneController(e).muted=t},t.prototype.onSceneEvent=function(e,t,n){this.getSceneController(e).on(t,n)},t.prototype.enableAudio=function(e){this.getSceneController(e).enableAudio()},t}(l),k=function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function s(e){try{u(r.next(e))}catch(e){o(e)}}function a(e){try{u(r.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}u((r=r.apply(e,t||[])).next())}))},O=function(e,t){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(i=s.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},C=new i.a("XR"),T=new(function(){function e(e){this._options=e,C.debug("XR Options",this._options),this._defaultProvider="SumerianProvider",this._pluggables={},this.addPluggable(new I)}return e.prototype.configure=function(e){var t=this,n=e?e.XR||e:{};return C.debug("configure XR",{opt:n}),this._options=Object.assign({},this._options,n),Object.entries(this._pluggables).map((function(e){var r=x(e,2),i=r[0],o=r[1];i!==t._defaultProvider||n[t._defaultProvider]?o.configure(t._options[i]):o.configure(t._options)})),this._options},e.prototype.addPluggable=function(e){return k(this,void 0,void 0,(function(){return O(this,(function(t){return e&&"XR"===e.getCategory()?(this._pluggables[e.getProviderName()]=e,[2,e.configure(this._options)]):[2]}))}))},e.prototype.loadScene=function(e,t,n,r){return void 0===n&&(n={}),void 0===r&&(r=this._defaultProvider),k(this,void 0,void 0,(function(){return O(this,(function(i){switch(i.label){case 0:if(!this._pluggables[r])throw new y("Provider '"+r+"' not configured");return[4,this._pluggables[r].loadScene(e,t,n)];case 1:return[2,i.sent()]}}))}))},e.prototype.isSceneLoaded=function(e,t){if(void 0===t&&(t=this._defaultProvider),!this._pluggables[t])throw new y("Provider '"+t+"' not configured");return this._pluggables[t].isSceneLoaded(e)},e.prototype.getSceneController=function(e,t){if(void 0===t&&(t=this._defaultProvider),!this._pluggables[t])throw new y("Provider '"+t+"' not configured");return this._pluggables[t].getSceneController(e)},e.prototype.isVRCapable=function(e,t){if(void 0===t&&(t=this._defaultProvider),!this._pluggables[t])throw new y("Provider '"+t+"' not configured");return this._pluggables[t].isVRCapable(e)},e.prototype.isVRPresentationActive=function(e,t){if(void 0===t&&(t=this._defaultProvider),!this._pluggables[t])throw new y("Provider '"+t+"' not configured");return this._pluggables[t].isVRPresentationActive(e)},e.prototype.start=function(e,t){if(void 0===t&&(t=this._defaultProvider),!this._pluggables[t])throw new y("Provider '"+t+"' not configured");return this._pluggables[t].start(e)},e.prototype.enterVR=function(e,t){if(void 0===t&&(t=this._defaultProvider),!this._pluggables[t])throw new y("Provider '"+t+"' not configured");return this._pluggables[t].enterVR(e)},e.prototype.exitVR=function(e,t){if(void 0===t&&(t=this._defaultProvider),!this._pluggables[t])throw new y("Provider '"+t+"' not configured");return this._pluggables[t].exitVR(e)},e.prototype.isMuted=function(e,t){if(void 0===t&&(t=this._defaultProvider),!this._pluggables[t])throw new y("Provider '"+t+"' not configured");return this._pluggables[t].isMuted(e)},e.prototype.setMuted=function(e,t,n){if(void 0===n&&(n=this._defaultProvider),!this._pluggables[n])throw new y("Provider '"+n+"' not configured");return this._pluggables[n].setMuted(e,t)},e.prototype.onSceneEvent=function(e,t,n,r){if(void 0===r&&(r=this._defaultProvider),!this._pluggables[r])throw new y("Provider '"+r+"' not configured");return this._pluggables[r].onSceneEvent(e,t,n)},e.prototype.enableAudio=function(e,t){if(void 0===t&&(t=this._defaultProvider),!this._pluggables[t])throw new y("Provider '"+t+"' not configured");return this._pluggables[t].enableAudio(e)},e}())(null);o.a.register(T)},function(e,t,n){"use strict";n.r(t),n.d(t,"fromUtf8",(function(){return r})),n.d(t,"toUtf8",(function(){return i}));var r=function(e){return"function"==typeof TextEncoder?function(e){return(new TextEncoder).encode(e)}(e):function(e){for(var t=[],n=0,r=e.length;n>6|192,63&i|128);else if(n+1>18|240,o>>12&63|128,o>>6&63|128,63&o|128)}else t.push(i>>12|224,i>>6&63|128,63&i|128)}return Uint8Array.from(t)}(e)},i=function(e){return"function"==typeof TextDecoder?function(e){return new TextDecoder("utf-8").decode(e)}(e):function(e){for(var t="",n=0,r=e.length;n(e[t]=n,!0),has:(e,t)=>e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e};function d(e){return e!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?(o||(o=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(e)?function(...t){return e.apply(v(this),t),p(s.get(this))}:function(...t){return p(e.apply(v(this),t))}:function(t,...n){const r=e.call(v(this),t,...n);return u.set(r,t.sort?t.sort():[t]),p(r)}}function h(e){return"function"==typeof e?d(e):(e instanceof IDBTransaction&&function(e){if(a.has(e))return;const t=new Promise((t,n)=>{const r=()=>{e.removeEventListener("complete",i),e.removeEventListener("error",o),e.removeEventListener("abort",o)},i=()=>{t(),r()},o=()=>{n(e.error||new DOMException("AbortError","AbortError")),r()};e.addEventListener("complete",i),e.addEventListener("error",o),e.addEventListener("abort",o)});a.set(e,t)}(e),t=e,(i||(i=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])).some(e=>t instanceof e)?new Proxy(e,l):e);var t}function p(e){if(e instanceof IDBRequest)return function(e){const t=new Promise((t,n)=>{const r=()=>{e.removeEventListener("success",i),e.removeEventListener("error",o)},i=()=>{t(p(e.result)),r()},o=()=>{n(e.error),r()};e.addEventListener("success",i),e.addEventListener("error",o)});return t.then(t=>{t instanceof IDBCursor&&s.set(t,e)}).catch(()=>{}),f.set(t,e),t}(e);if(c.has(e))return c.get(e);const t=h(e);return t!==e&&(c.set(e,t),f.set(t,e)),t}const v=e=>f.get(e);function g(e,t,{blocked:n,upgrade:r,blocking:i,terminated:o}={}){const s=indexedDB.open(e,t),a=p(s);return r&&s.addEventListener("upgradeneeded",e=>{r(p(s.result),e.oldVersion,e.newVersion,p(s.transaction))}),n&&s.addEventListener("blocked",()=>n()),a.then(e=>{o&&e.addEventListener("close",()=>o()),i&&e.addEventListener("versionchange",()=>i())}).catch(()=>{}),a}function m(e,{blocked:t}={}){const n=indexedDB.deleteDatabase(e);return t&&n.addEventListener("blocked",()=>t()),p(n).then(()=>{})}const b=["get","getKey","getAll","getAllKeys","count"],y=["put","add","delete","clear"],w=new Map;function _(e,t){if(!(e instanceof IDBDatabase)||t in e||"string"!=typeof t)return;if(w.get(t))return w.get(t);const n=t.replace(/FromIndex$/,""),r=t!==n,i=y.includes(n);if(!(n in(r?IDBIndex:IDBObjectStore).prototype)||!i&&!b.includes(n))return;const o=async function(e,...t){const o=this.transaction(e,i?"readwrite":"readonly");let s=o.store;r&&(s=s.index(t.shift()));const a=await s[n](...t);return i&&await o.done,a};return w.set(t,o),o}l=(e=>({...e,get:(t,n,r)=>_(t,n)||e.get(t,n,r),has:(t,n)=>!!_(t,n)||e.has(t,n)}))(l);var S=n(9),E=n(245),M=n(4),A=n(3);function I(e){return(I="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var k=function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function s(e){try{u(r.next(e))}catch(e){o(e)}}function a(e){try{u(r.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}u((r=r.apply(e,t||[])).next())}))},O=function(e,t){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(i=s.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},T=function(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},P=function(){for(var e=[],t=0;t0?u+a:e.length;return e.slice(u,c)}return e},e.prototype.enginePagination=function(e,t){return k(this,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,f,l,d;return O(this,(function(h){switch(h.label){case 0:return t?(r=t.page,i=void 0===r?0:r,o=t.limit,s=void 0===o?0:o,a=Math.max(0,i*s)||0,[4,this.db.transaction(e).objectStore(e).openCursor()]):[3,7];case 1:return(u=h.sent())&&a>0?[4,u.advance(a)]:[3,3];case 2:h.sent(),h.label=3;case 3:c=[],f="number"==typeof s&&s>0,l=!0,d=s,h.label=4;case 4:return l&&u&&u.value?(c.push(u.value),[4,u.continue()]):[3,6];case 5:return u=h.sent(),f?(d--,l=d>0&&null!==u):l=null!==u,[3,4];case 6:return n=c,[3,9];case 7:return[4,this.db.getAll(e)];case 8:n=h.sent(),h.label=9;case 9:return[2,n]}}))}))},e.prototype.queryOne=function(e,t){return void 0===t&&(t=M.d.FIRST),k(this,void 0,void 0,(function(){var n,r,i;return O(this,(function(o){switch(o.label){case 0:return[4,this.checkPrivate()];case 1:return o.sent(),n=this.getStorenameForModel(e),[4,this.db.transaction([n],"readonly").objectStore(n).openCursor(void 0,t===M.d.FIRST?"next":"prev")];case 2:return r=o.sent(),[2,(i=r?r.value:void 0)&&this.modelInstanceCreator(e,i)]}}))}))},e.prototype.delete=function(e,t){return k(this,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,f,l,d,h,p,v,g;return O(this,(function(m){switch(m.label){case 0:return[4,this.checkPrivate()];case 1:return m.sent(),n=[],Object(A.s)(e)?(o=e,s=this.namespaceResolver(o),a=this.getStorenameForModel(o),[4,this.query(o,t)]):[3,9];case 2:return r=m.sent(),v=this.schema.namespaces[s].relationships[o.name].relationTypes,void 0===t?[3,5]:[4,this.deleteTraverse(v,r,o.name,s,n)];case 3:return m.sent(),[4,this.deleteItem(n)];case 4:return m.sent(),g=n.reduce((function(e,t){var n=t.items;return e.concat(n)}),[]),[2,[r,g]];case 5:return[4,this.deleteTraverse(v,r,o.name,s,n)];case 6:return m.sent(),[4,this.db.transaction([a],"readwrite").objectStore(a).clear()];case 7:return m.sent(),g=n.reduce((function(e,t){var n=t.items;return e.concat(n)}),[]),[2,[r,g]];case 8:return[3,17];case 9:return i=e,o=Object.getPrototypeOf(i).constructor,s=this.namespaceResolver(o),a=this.getStorenameForModel(o),t?(u=this.db.transaction([a],"readwrite"),c=u.objectStore(a),[4,this._get(c,i.id)]):[3,13];case 10:if(void 0===(f=m.sent()))return p="Model instance not found in storage",N.warn(p,{model:i}),[2,[[i],[]]];if(l=S.a.getPredicates(t),d=l.predicates,h=l.type,!Object(A.y)(f,h,d))throw p="Conditional update failed",N.error(p,{model:f,condition:d}),new Error(p);return[4,u.done];case 11:return m.sent(),v=this.schema.namespaces[s].relationships[o.name].relationTypes,[4,this.deleteTraverse(v,[i],o.name,s,n)];case 12:return m.sent(),[3,15];case 13:return v=this.schema.namespaces[s].relationships[o.name].relationTypes,[4,this.deleteTraverse(v,[i],o.name,s,n)];case 14:m.sent(),m.label=15;case 15:return[4,this.deleteItem(n)];case 16:return m.sent(),g=n.reduce((function(e,t){var n=t.items;return e.concat(n)}),[]),[2,[[i],g]];case 17:return[2]}}))}))},e.prototype.deleteItem=function(e){var t,n,r,i,o,s;return k(this,void 0,void 0,(function(){var a,u,c,f,l,d,h,p,v,g,m,b;return O(this,(function(y){switch(y.label){case 0:a=e.map((function(e){return e.storeName})),u=this.db.transaction(P(a),"readwrite"),y.label=1;case 1:y.trys.push([1,22,23,28]),t=x(e),y.label=2;case 2:return[4,t.next()];case 3:if((n=y.sent()).done)return[3,21];c=n.value,f=c.storeName,l=c.items,d=u.objectStore(f),y.label=4;case 4:y.trys.push([4,14,15,20]),h=x(l),y.label=5;case 5:return[4,h.next()];case 6:return(p=y.sent()).done?[3,13]:(v=p.value)?(g=void 0,"object"!==I(v)?[3,8]:[4,d.index("byId").getKey(v.id)]):[3,12];case 7:return g=y.sent(),[3,10];case 8:return[4,d.index("byId").getKey(v.toString())];case 9:g=y.sent(),y.label=10;case 10:return void 0===g?[3,12]:[4,d.delete(g)];case 11:y.sent(),y.label=12;case 12:return[3,5];case 13:return[3,20];case 14:return m=y.sent(),o={error:m},[3,20];case 15:return y.trys.push([15,,18,19]),p&&!p.done&&(s=h.return)?[4,s.call(h)]:[3,17];case 16:y.sent(),y.label=17;case 17:return[3,19];case 18:if(o)throw o.error;return[7];case 19:return[7];case 20:return[3,2];case 21:return[3,28];case 22:return b=y.sent(),r={error:b},[3,28];case 23:return y.trys.push([23,,26,27]),n&&!n.done&&(i=t.return)?[4,i.call(t)]:[3,25];case 24:y.sent(),y.label=25;case 25:return[3,27];case 26:if(r)throw r.error;return[7];case 27:return[7];case 28:return[2]}}))}))},e.prototype.deleteTraverse=function(e,t,n,r,i){var o,s,a,u,c,f,l,d,h,p,v,g;return k(this,void 0,void 0,(function(){var m,b,y,w,_,S,E,M,I,k,C,T=this;return O(this,(function(O){switch(O.label){case 0:O.trys.push([0,35,36,41]),o=x(e),O.label=1;case 1:return[4,o.next()];case 2:if((s=O.sent()).done)return[3,34];switch(m=s.value,b=m.relationType,m.fieldName,y=m.modelName,w=this.getStorename(r,y),_=Object(A.g)(this.schema.namespaces[r].relationships[y].relationTypes,n)||Object(A.h)(this.schema.namespaces[r].relationships[y].indexes,m.associatedWith),b){case"HAS_ONE":return[3,3];case"HAS_MANY":return[3,17];case"BELONGS_TO":return[3,31]}return[3,32];case 3:O.trys.push([3,10,11,16]),a=x(t),O.label=4;case 4:return[4,a.next()];case 5:return(u=O.sent()).done?[3,9]:(M=u.value,[4,this.db.transaction(w,"readwrite").objectStore(w).index(_).get(M.id)]);case 6:return S=O.sent(),[4,this.deleteTraverse(this.schema.namespaces[r].relationships[y].relationTypes,S?[S]:[],y,r,i)];case 7:O.sent(),O.label=8;case 8:return[3,4];case 9:return[3,16];case 10:return E=O.sent(),h={error:E},[3,16];case 11:return O.trys.push([11,,14,15]),u&&!u.done&&(p=a.return)?[4,p.call(a)]:[3,13];case 12:O.sent(),O.label=13;case 13:return[3,15];case 14:if(h)throw h.error;return[7];case 15:return[7];case 16:return[3,33];case 17:O.trys.push([17,24,25,30]),c=x(t),O.label=18;case 18:return[4,c.next()];case 19:return(f=O.sent()).done?[3,23]:(M=f.value,[4,this.db.transaction(w,"readwrite").objectStore(w).index(_).getAll(M.id)]);case 20:return I=O.sent(),[4,this.deleteTraverse(this.schema.namespaces[r].relationships[y].relationTypes,I,y,r,i)];case 21:O.sent(),O.label=22;case 22:return[3,18];case 23:return[3,30];case 24:return k=O.sent(),v={error:k},[3,30];case 25:return O.trys.push([25,,28,29]),f&&!f.done&&(g=c.return)?[4,g.call(c)]:[3,27];case 26:O.sent(),O.label=27;case 27:return[3,29];case 28:if(v)throw v.error;return[7];case 29:return[7];case 30:case 31:return[3,33];case 32:return Object(A.f)(b),[3,33];case 33:return[3,1];case 34:return[3,41];case 35:return C=O.sent(),l={error:C},[3,41];case 36:return O.trys.push([36,,39,40]),s&&!s.done&&(d=o.return)?[4,d.call(o)]:[3,38];case 37:O.sent(),O.label=38;case 38:return[3,40];case 39:if(l)throw l.error;return[7];case 40:return[7];case 41:return i.push({storeName:this.getStorename(r,n),items:t.map((function(e){return T.modelInstanceCreator(T.getModelConstructorByModelName(r,n),e)}))}),[2]}}))}))},e.prototype.clear=function(){return k(this,void 0,void 0,(function(){return O(this,(function(e){switch(e.label){case 0:return[4,this.checkPrivate()];case 1:return e.sent(),this.db.close(),[4,m(this.dbName)];case 2:return e.sent(),this.db=void 0,this.initPromise=void 0,[2]}}))}))},e.prototype.batchSave=function(e,t){return k(this,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,f,l,d,h;return O(this,(function(p){switch(p.label){case 0:return 0===t.length?[2,[]]:[4,this.checkPrivate()];case 1:p.sent(),n=[],r=this.getStorenameForModel(e),i=this.db.transaction(r,"readwrite"),o=i.store,s=function(t){var r,i,s,u,c;return O(this,(function(f){switch(f.label){case 0:return r=Object(A.x)(e.name,a.modelInstanceCreator(e,t),a.schema.namespaces[a.namespaceResolver(e)],a.modelInstanceCreator,a.getModelConstructorByModelName),i=t.id,s=t._deleted,[4,o.index("byId").getKey(i)];case 1:return u=f.sent(),s?[3,3]:(c=r.find((function(e){return e.instance.id===i})).instance,n.push([c,u?M.c.UPDATE:M.c.INSERT]),[4,o.put(c,u)]);case 2:return f.sent(),[3,5];case 3:return n.push([t,M.c.DELETE]),u?[4,o.delete(u)]:[3,5];case 4:f.sent(),f.label=5;case 5:return[2]}}))},a=this,p.label=2;case 2:p.trys.push([2,7,8,9]),u=C(t),c=u.next(),p.label=3;case 3:return c.done?[3,6]:(f=c.value,[5,s(f)]);case 4:p.sent(),p.label=5;case 5:return c=u.next(),[3,3];case 6:return[3,9];case 7:return l=p.sent(),d={error:l},[3,9];case 8:try{c&&!c.done&&(h=u.return)&&h.call(u)}finally{if(d)throw d.error}return[7];case 9:return[4,i.done];case 10:return p.sent(),[2,n]}}))}))},e}();t.default=new R},function(e,t,n){"use strict";n.r(t),n.d(t,"AsyncStorageAdapter",(function(){return I}));var r=n(44),i=n(4),o=n(3),s=function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function s(e){try{u(r.next(e))}catch(e){o(e)}}function a(e){try{u(r.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}u((r=r.apply(e,t||[])).next())}))},a=function(e,t){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(i=s.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},c=function(){var e=this;this.db=new Map,this.getAllKeys=function(){return s(e,void 0,void 0,(function(){return a(this,(function(e){return[2,Array.from(this.db.keys())]}))}))},this.multiGet=function(t){return s(e,void 0,void 0,(function(){var e=this;return a(this,(function(n){return[2,t.reduce((function(t,n){return t.push([n,e.db.get(n)]),t}),[])]}))}))},this.multiRemove=function(t,n){return s(e,void 0,void 0,(function(){var e=this;return a(this,(function(r){return t.forEach((function(t){return e.db.delete(t)})),n(),[2]}))}))},this.multiSet=function(t,n){return s(e,void 0,void 0,(function(){var e=this;return a(this,(function(r){return t.forEach((function(t){var n=u(t,2),r=n[0],i=n[1];e.setItem(r,i)})),n(),[2]}))}))},this.setItem=function(t,n){return s(e,void 0,void 0,(function(){return a(this,(function(e){return[2,this.db.set(t,n)]}))}))},this.removeItem=function(t){return s(e,void 0,void 0,(function(){return a(this,(function(e){return[2,this.db.delete(t)]}))}))},this.getItem=function(t){return s(e,void 0,void 0,(function(){return a(this,(function(e){return[2,this.db.get(t)]}))}))}};var f=function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function s(e){try{u(r.next(e))}catch(e){o(e)}}function a(e){try{u(r.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}u((r=r.apply(e,t||[])).next())}))},l=function(e,t){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(i=s.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},h=function(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},p="@AmplifyDatastore",v=new Map,g=function(){function e(){this._collectionInMemoryIndex=new Map,this.storage=new c}return e.prototype.getCollectionIndex=function(e){return this._collectionInMemoryIndex.has(e)||this._collectionInMemoryIndex.set(e,new Map),this._collectionInMemoryIndex.get(e)},e.prototype.getMonotonicFactory=function(e){return v.has(e)||v.set(e,Object(o.v)()),v.get(e)},e.prototype.init=function(){return f(this,void 0,void 0,(function(){var e,t,n,r,i,o,s,a,u,c,f,v,g,m,b,y,w,_,S,E;return l(this,(function(l){switch(l.label){case 0:return this._collectionInMemoryIndex.clear(),[4,this.storage.getAllKeys()];case 1:e=l.sent(),t=[],l.label=2;case 2:l.trys.push([2,12,13,14]),n=d(e),r=n.next(),l.label=3;case 3:return r.done?[3,11]:(i=r.value,o=h(i.split("::"),5),s=o[0],a=o[1],u=o[2],c=o[3],f=o[4],s!==p?[3,10]:"Data"!==u?[3,9]:(v=void 0,void 0!==f?[3,7]:(g=c,m=this.getMonotonicFactory(a)(),b=this.getLegacyKeyForItem(a,g),y=this.getKeyForItem(a,g,m),[4,this.storage.getItem(b)])));case 4:return w=l.sent(),[4,this.storage.setItem(y,w)];case 5:return l.sent(),[4,this.storage.removeItem(b)];case 6:return l.sent(),v=m,[3,8];case 7:v=c,l.label=8;case 8:return this.getCollectionIndex(a).set(f,v),[3,10];case 9:"Collection"===u&&t.push(i),l.label=10;case 10:return r=n.next(),[3,3];case 11:return[3,14];case 12:return _=l.sent(),S={error:_},[3,14];case 13:try{r&&!r.done&&(E=n.return)&&E.call(n)}finally{if(S)throw S.error}return[7];case 14:return t.length>0?[4,this.storage.multiRemove(t)]:[3,16];case 15:l.sent(),l.label=16;case 16:return[2]}}))}))},e.prototype.save=function(e,t){return f(this,void 0,void 0,(function(){var n,r;return l(this,(function(i){switch(i.label){case 0:return n=this.getCollectionIndex(t).get(e.id)||this.getMonotonicFactory(t)(),r=this.getKeyForItem(t,e.id,n),this.getCollectionIndex(t).set(e.id,n),[4,this.storage.setItem(r,JSON.stringify(e))];case 1:return i.sent(),[2]}}))}))},e.prototype.batchSave=function(e,t){return f(this,void 0,void 0,(function(){var n,r,o,s,a,u,c,f,p,v,g,m,b,y,w,_,S,E,M,A,I,k=this;return l(this,(function(l){switch(l.label){case 0:if(0===t.length)return[2,[]];n=[],r=this.getCollectionIndex(e),o=new Set,s=new Set,a=[],u={};try{for(c=d(t),f=c.next();!f.done;f=c.next())p=f.value,v=p.id,g=p._deleted,m=r.get(v)||this.getMonotonicFactory(e)(),S=this.getKeyForItem(e,v,m),a.push(S),u[S]={ulid:m,model:p},g?o.add(S):s.add(S)}catch(e){E={error:e}}finally{try{f&&!f.done&&(M=c.return)&&M.call(c)}finally{if(E)throw E.error}}return[4,this.storage.multiGet(a)];case 1:return b=l.sent(),y=b.filter((function(e){return!!h(e,2)[1]})).reduce((function(e,t){var n=h(t,1)[0];return e.add(n)}),new Set),[4,new Promise((function(e,t){if(0!==o.size){var n=Array.from(o);n.forEach((function(e){return r.delete(u[e].model.id)})),k.storage.multiRemove(n,(function(n){n&&n.length>0?t(n):e()}))}else e()}))];case 2:return l.sent(),[4,new Promise((function(e,t){if(0!==s.size){var n=Array.from(s).map((function(e){return[e,JSON.stringify(u[e].model)]}));s.forEach((function(e){var t=u[e],n=t.model.id,i=t.ulid;r.set(n,i)})),k.storage.multiSet(n,(function(n){n&&n.length>0?t(n):e()}))}else e()}))];case 3:l.sent();try{for(w=d(a),_=w.next();!_.done;_=w.next())S=_.value,o.has(S)&&y.has(S)?n.push([u[S].model,i.c.DELETE]):s.has(S)&&n.push([u[S].model,y.has(S)?i.c.UPDATE:i.c.INSERT])}catch(e){A={error:e}}finally{try{_&&!_.done&&(I=w.return)&&I.call(w)}finally{if(A)throw A.error}}return[2,n]}}))}))},e.prototype.get=function(e,t){return f(this,void 0,void 0,(function(){var n,r,i;return l(this,(function(o){switch(o.label){case 0:return n=this.getCollectionIndex(t).get(e),r=this.getKeyForItem(t,e,n),[4,this.storage.getItem(r)];case 1:return i=o.sent(),[2,i&&JSON.parse(i)]}}))}))},e.prototype.getOne=function(e,t){return f(this,void 0,void 0,(function(){var n,r,o,s,a,u,c;return l(this,(function(f){switch(f.label){case 0:return n=this.getCollectionIndex(t),r=h(e===i.d.FIRST?function(){var e,t,r,i,o;try{for(var s=d(n),a=s.next();!a.done;a=s.next()){i=(r=h(a.value,2))[0],o=r[1];break}}catch(t){e={error:t}}finally{try{a&&!a.done&&(t=s.return)&&t.call(s)}finally{if(e)throw e.error}}return[i,o]}():function(){var e,t,r,i,o;try{for(var s=d(n),a=s.next();!a.done;a=s.next())i=(r=h(a.value,2))[0],o=r[1]}catch(t){e={error:t}}finally{try{a&&!a.done&&(t=s.return)&&t.call(s)}finally{if(e)throw e.error}}return[i,o]}(),2),o=r[0],s=r[1],a=this.getKeyForItem(t,o,s),(c=a)?[4,this.storage.getItem(a)]:[3,2];case 1:c=f.sent(),f.label=2;case 2:return[2,(u=c)&&JSON.parse(u)||void 0]}}))}))},e.prototype.getAll=function(e,t){return f(this,void 0,void 0,(function(){var n,r,i,o,s,a,u,c,f,p,v,g,m,b,y,w,_,S;return l(this,(function(l){switch(l.label){case 0:n=this.getCollectionIndex(e),i=(r=t||{}).page,o=void 0===i?0:i,s=r.limit,a=void 0===s?0:s,u=Math.max(0,o*a)||0,c=a>0?u+a:void 0,f=[],p=0;try{for(v=d(n),g=v.next();!g.done&&(m=h(g.value,2),b=m[0],y=m[1],++p<=u||(f.push(this.getKeyForItem(e,b,y)),p!==c));g=v.next());}catch(e){_={error:e}}finally{try{g&&!g.done&&(S=v.return)&&S.call(v)}finally{if(_)throw _.error}}return[4,this.storage.multiGet(f)];case 1:return w=l.sent(),[2,w.filter((function(e){return h(e,2)[1]})).map((function(e){var t=h(e,2)[1];return JSON.parse(t)}))]}}))}))},e.prototype.delete=function(e,t){return f(this,void 0,void 0,(function(){var n,r;return l(this,(function(i){switch(i.label){case 0:return n=this.getCollectionIndex(t).get(e),r=this.getKeyForItem(t,e,n),this.getCollectionIndex(t).delete(e),[4,this.storage.removeItem(r)];case 1:return i.sent(),[2]}}))}))},e.prototype.clear=function(){return f(this,void 0,void 0,(function(){var e,t;return l(this,(function(n){switch(n.label){case 0:return[4,this.storage.getAllKeys()];case 1:return e=n.sent(),t=e.filter((function(e){return e.startsWith(p)})),[4,this.storage.multiRemove(t)];case 2:return n.sent(),this._collectionInMemoryIndex.clear(),[2]}}))}))},e.prototype.getKeyForItem=function(e,t,n){return this.getKeyPrefixForStoreItems(e)+"::"+n+"::"+t},e.prototype.getLegacyKeyForItem=function(e,t){return this.getKeyPrefixForStoreItems(e)+"::"+t},e.prototype.getKeyPrefixForStoreItems=function(e){return p+"::"+e+"::Data"},e}(),m=n(9),b=n(245);function y(e){return(y="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var w=function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function s(e){try{u(r.next(e))}catch(e){o(e)}}function a(e){try{u(r.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}u((r=r.apply(e,t||[])).next())}))},_=function(e,t){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(i=s.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},M=function(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},A=new r.a("DataStore"),I=function(){function e(){}return e.prototype.getStorenameForModel=function(e){var t=this.namespaceResolver(e),n=e.name;return this.getStorename(t,n)},e.prototype.getStorename=function(e,t){return e+"_"+t},e.prototype.setUp=function(e,t,n,r){return w(this,void 0,void 0,(function(){var i,o=this;return _(this,(function(s){switch(s.label){case 0:return this.initPromise?[3,1]:(this.initPromise=new Promise((function(e,t){o.resolve=e,o.reject=t})),[3,3]);case 1:return[4,this.initPromise];case 2:return s.sent(),[2];case 3:this.schema=e,this.namespaceResolver=t,this.modelInstanceCreator=n,this.getModelConstructorByModelName=r,s.label=4;case 4:return s.trys.push([4,7,,8]),this.db?[3,6]:(this.db=new g,[4,this.db.init()]);case 5:s.sent(),this.resolve(),s.label=6;case 6:return[3,8];case 7:return i=s.sent(),this.reject(i),[3,8];case 8:return[2]}}))}))},e.prototype.save=function(e,t){var n,r;return w(this,void 0,void 0,(function(){var s,a,u,c,f,l,d,h,p,v,g,b,y,w,E,M,I,k,O,x,C,T=this;return _(this,(function(_){switch(_.label){case 0:return s=Object.getPrototypeOf(e).constructor,a=this.getStorenameForModel(s),u=Object(o.x)(s.name,e,this.schema.namespaces[this.namespaceResolver(s)],this.modelInstanceCreator,this.getModelConstructorByModelName),c=this.namespaceResolver(s),f=new Set,l=Object.values(u).map((function(e){var t=e.modelName,n=e.item,r=e.instance,i=T.getStorename(c,t);return f.add(i),{storeName:i,item:n,instance:r}})),[4,this.db.get(e.id,a)];case 1:if(d=_.sent(),t&&d&&(h=m.a.getPredicates(t),p=h.predicates,v=h.type,!Object(o.y)(d,v,p)))throw g="Conditional update failed",A.error(g,{model:d,condition:p}),new Error(g);b=[],_.label=2;case 2:_.trys.push([2,11,12,17]),y=S(l),_.label=3;case 3:return[4,y.next()];case 4:return(w=_.sent()).done?[3,10]:(E=w.value,M=E.storeName,I=E.item,k=E.instance,O=I.id,[4,this.db.get(O,M)]);case 5:return x=_.sent()?i.c.UPDATE:i.c.INSERT,O!==e.id?[3,7]:[4,this.db.save(I,M)];case 6:return _.sent(),b.push([k,x]),[3,9];case 7:return x!==i.c.INSERT?[3,9]:[4,this.db.save(I,M)];case 8:_.sent(),b.push([k,x]),_.label=9;case 9:return[3,3];case 10:return[3,17];case 11:return C=_.sent(),n={error:C},[3,17];case 12:return _.trys.push([12,,15,16]),w&&!w.done&&(r=y.return)?[4,r.call(y)]:[3,14];case 13:_.sent(),_.label=14;case 14:return[3,16];case 15:if(n)throw n.error;return[7];case 16:return[7];case 17:return[2,b]}}))}))},e.prototype.load=function(e,t,n){var r,i,s,a,u,c,f,l,d,h;return w(this,void 0,void 0,(function(){var p,v,g,m,b,y,w,E,M,A,I,k,O,x,C,T,P,N,R=this;return _(this,(function(_){switch(_.label){case 0:if(p=this.schema.namespaces[e],v=p.relationships[t].relationTypes,g=v.map((function(t){var n=t.modelName;return R.getStorename(e,n)})),m=this.getModelConstructorByModelName(e,t),0===g.length)return[2,n.map((function(e){return R.modelInstanceCreator(m,e)}))];_.label=1;case 1:_.trys.push([1,34,35,40]),b=S(v),_.label=2;case 2:return[4,b.next()];case 3:if((y=_.sent()).done)return[3,33];switch(w=y.value,E=w.fieldName,M=w.modelName,A=w.targetName,I=w.relationType,k=this.getStorename(e,M),O=this.getModelConstructorByModelName(e,M),I){case"HAS_ONE":return[3,4];case"BELONGS_TO":return[3,17];case"HAS_MANY":return[3,30]}return[3,31];case 4:_.trys.push([4,10,11,16]),r=S(n),_.label=5;case 5:return[4,r.next()];case 6:return(i=_.sent()).done?[3,9]:(C=i.value)[E]?[4,this.db.get(C[E],k)]:[3,8];case 7:T=_.sent(),C[E]=T&&this.modelInstanceCreator(O,T),_.label=8;case 8:return[3,5];case 9:return[3,16];case 10:return x=_.sent(),f={error:x},[3,16];case 11:return _.trys.push([11,,14,15]),i&&!i.done&&(l=r.return)?[4,l.call(r)]:[3,13];case 12:_.sent(),_.label=13;case 13:return[3,15];case 14:if(f)throw f.error;return[7];case 15:return[7];case 16:return[3,32];case 17:_.trys.push([17,23,24,29]),s=S(n),_.label=18;case 18:return[4,s.next()];case 19:return(a=_.sent()).done?[3,22]:(C=a.value)[A]?[4,this.db.get(C[A],k)]:[3,21];case 20:T=_.sent(),C[E]=T&&this.modelInstanceCreator(O,T),delete C[A],_.label=21;case 21:return[3,18];case 22:return[3,29];case 23:return P=_.sent(),d={error:P},[3,29];case 24:return _.trys.push([24,,27,28]),a&&!a.done&&(h=s.return)?[4,h.call(s)]:[3,26];case 25:_.sent(),_.label=26;case 26:return[3,28];case 27:if(d)throw d.error;return[7];case 28:return[7];case 29:case 30:return[3,32];case 31:return Object(o.f)(I),[3,32];case 32:return[3,2];case 33:return[3,40];case 34:return N=_.sent(),u={error:N},[3,40];case 35:return _.trys.push([35,,38,39]),y&&!y.done&&(c=b.return)?[4,c.call(b)]:[3,37];case 36:_.sent(),_.label=37;case 37:return[3,39];case 38:if(u)throw u.error;return[7];case 39:return[7];case 40:return[2,n.map((function(e){return R.modelInstanceCreator(m,e)}))]}}))}))},e.prototype.query=function(e,t,n){return w(this,void 0,void 0,(function(){var r,s,a,u,c,f,l,d,h,p,v,g,b,y;return _(this,(function(w){switch(w.label){case 0:return r=this.getStorenameForModel(e),s=this.namespaceResolver(e),a=n&&n.sort,t?(u=m.a.getPredicates(t))?(c=u.predicates,f=u.type,(l=1===c.length&&c.find((function(e){return Object(i.k)(e)&&"id"===e.field&&"eq"===e.operator})))?(d=l.operand,[4,this.db.get(d,r)]):[3,4]):[3,7]:[3,7];case 1:return(h=w.sent())?[4,this.load(s,e.name,[h])]:[3,3];case 2:return p=E.apply(void 0,[w.sent(),1]),[2,[p[0]]];case 3:return[2,[]];case 4:return[4,this.db.getAll(r)];case 5:return v=w.sent(),g=c?v.filter((function(e){return Object(o.y)(e,f,c)})):v,[4,this.load(s,e.name,this.inMemoryPagination(g,n))];case 6:return[2,w.sent()];case 7:return a?[4,this.db.getAll(r)]:[3,10];case 8:return b=w.sent(),[4,this.load(s,e.name,this.inMemoryPagination(b,n))];case 9:return[2,w.sent()];case 10:return[4,this.db.getAll(r,n)];case 11:return y=w.sent(),[4,this.load(s,e.name,y)];case 12:return[2,w.sent()]}}))}))},e.prototype.inMemoryPagination=function(e,t){if(t){if(t.sort){var n=b.a.getPredicates(t.sort);if(n.length){var r=Object(o.w)(n);e.sort(r)}}var i=t.page,s=void 0===i?0:i,a=t.limit,u=void 0===a?0:a,c=Math.max(0,s*u)||0,f=u>0?c+u:e.length;return e.slice(c,f)}return e},e.prototype.queryOne=function(e,t){return void 0===t&&(t=i.d.FIRST),w(this,void 0,void 0,(function(){var n,r;return _(this,(function(i){switch(i.label){case 0:return n=this.getStorenameForModel(e),[4,this.db.getOne(t,n)];case 1:return[2,(r=i.sent())&&this.modelInstanceCreator(e,r)]}}))}))},e.prototype.delete=function(e,t){return w(this,void 0,void 0,(function(){var n,r,i,s,a,u,c,f,l,d,h,p,v;return _(this,(function(g){switch(g.label){case 0:return n=[],Object(o.s)(e)?(s=e,a=this.namespaceResolver(s),[4,this.query(s,t)]):[3,8];case 1:return r=g.sent(),p=this.schema.namespaces[a].relationships[s.name].relationTypes,void 0===t?[3,4]:[4,this.deleteTraverse(p,r,s.name,a,n)];case 2:return g.sent(),[4,this.deleteItem(n)];case 3:return g.sent(),v=n.reduce((function(e,t){var n=t.items;return e.concat(n)}),[]),[2,[r,v]];case 4:return[4,this.deleteTraverse(p,r,s.name,a,n)];case 5:return g.sent(),[4,this.deleteItem(n)];case 6:return g.sent(),v=n.reduce((function(e,t){var n=t.items;return e.concat(n)}),[]),[2,[r,v]];case 7:return[3,15];case 8:return i=e,s=Object.getPrototypeOf(i).constructor,a=this.namespaceResolver(s),u=this.getStorenameForModel(s),t?[4,this.db.get(i.id,u)]:[3,11];case 9:if(void 0===(c=g.sent()))return h="Model instance not found in storage",A.warn(h,{model:i}),[2,[[i],[]]];if(f=m.a.getPredicates(t),l=f.predicates,d=f.type,!Object(o.y)(c,d,l))throw h="Conditional update failed",A.error(h,{model:c,condition:l}),new Error(h);return p=this.schema.namespaces[a].relationships[s.name].relationTypes,[4,this.deleteTraverse(p,[i],s.name,a,n)];case 10:return g.sent(),[3,13];case 11:return p=this.schema.namespaces[a].relationships[s.name].relationTypes,[4,this.deleteTraverse(p,[i],s.name,a,n)];case 12:g.sent(),g.label=13;case 13:return[4,this.deleteItem(n)];case 14:return g.sent(),v=n.reduce((function(e,t){var n=t.items;return e.concat(n)}),[]),[2,[[i],v]];case 15:return[2]}}))}))},e.prototype.deleteItem=function(e){var t,n,r,i,o,s;return w(this,void 0,void 0,(function(){var a,u,c,f,l,d,h,p,v;return _(this,(function(g){switch(g.label){case 0:g.trys.push([0,17,18,23]),t=S(e),g.label=1;case 1:return[4,t.next()];case 2:if((n=g.sent()).done)return[3,16];a=n.value,u=a.storeName,c=a.items,g.label=3;case 3:g.trys.push([3,9,10,15]),f=S(c),g.label=4;case 4:return[4,f.next()];case 5:return(l=g.sent()).done?[3,8]:(d=l.value)?"object"!==y(d)?[3,7]:(h=d.id,[4,this.db.delete(h,u)]):[3,7];case 6:g.sent(),g.label=7;case 7:return[3,4];case 8:return[3,15];case 9:return p=g.sent(),o={error:p},[3,15];case 10:return g.trys.push([10,,13,14]),l&&!l.done&&(s=f.return)?[4,s.call(f)]:[3,12];case 11:g.sent(),g.label=12;case 12:return[3,14];case 13:if(o)throw o.error;return[7];case 14:return[7];case 15:return[3,1];case 16:return[3,23];case 17:return v=g.sent(),r={error:v},[3,23];case 18:return g.trys.push([18,,21,22]),n&&!n.done&&(i=t.return)?[4,i.call(t)]:[3,20];case 19:g.sent(),g.label=20;case 20:return[3,22];case 21:if(r)throw r.error;return[7];case 22:return[7];case 23:return[2]}}))}))},e.prototype.deleteTraverse=function(e,t,n,r,i){var s,a,u,c,f,l,d,h,p,v,g,m;return w(this,void 0,void 0,(function(){var b,y,w,E,M,A,I,k,O,x,C,T,P=this;return _(this,(function(_){switch(_.label){case 0:_.trys.push([0,35,36,41]),s=S(e),_.label=1;case 1:return[4,s.next()];case 2:if((a=_.sent()).done)return[3,34];switch(b=a.value,y=b.relationType,w=b.modelName,E=this.getStorename(r,w),M=Object(o.g)(this.schema.namespaces[r].relationships[w].relationTypes,n)||Object(o.h)(this.schema.namespaces[r].relationships[w].indexes,b.associatedWith),y){case"HAS_ONE":return[3,3];case"HAS_MANY":return[3,17];case"BELONGS_TO":return[3,31]}return[3,32];case 3:_.trys.push([3,10,11,16]),u=S(t),_.label=4;case 4:return[4,u.next()];case 5:return(c=_.sent()).done?[3,9]:(k=c.value,[4,this.db.getAll(E)]);case 6:return O=_.sent(),A=O.filter((function(e){return e[M]===k.id})),[4,this.deleteTraverse(this.schema.namespaces[r].relationships[w].relationTypes,A,w,r,i)];case 7:_.sent(),_.label=8;case 8:return[3,4];case 9:return[3,16];case 10:return I=_.sent(),p={error:I},[3,16];case 11:return _.trys.push([11,,14,15]),c&&!c.done&&(v=u.return)?[4,v.call(u)]:[3,13];case 12:_.sent(),_.label=13;case 13:return[3,15];case 14:if(p)throw p.error;return[7];case 15:return[7];case 16:return[3,33];case 17:_.trys.push([17,24,25,30]),f=S(t),_.label=18;case 18:return[4,f.next()];case 19:return(l=_.sent()).done?[3,23]:(k=l.value,[4,this.db.getAll(E)]);case 20:return O=_.sent(),x=O.filter((function(e){return e[M]===k.id})),[4,this.deleteTraverse(this.schema.namespaces[r].relationships[w].relationTypes,x,w,r,i)];case 21:_.sent(),_.label=22;case 22:return[3,18];case 23:return[3,30];case 24:return C=_.sent(),g={error:C},[3,30];case 25:return _.trys.push([25,,28,29]),l&&!l.done&&(m=f.return)?[4,m.call(f)]:[3,27];case 26:_.sent(),_.label=27;case 27:return[3,29];case 28:if(g)throw g.error;return[7];case 29:return[7];case 30:case 31:return[3,33];case 32:return Object(o.f)(y),[3,33];case 33:return[3,1];case 34:return[3,41];case 35:return T=_.sent(),d={error:T},[3,41];case 36:return _.trys.push([36,,39,40]),a&&!a.done&&(h=s.return)?[4,h.call(s)]:[3,38];case 37:_.sent(),_.label=38;case 38:return[3,40];case 39:if(d)throw d.error;return[7];case 40:return[7];case 41:return i.push({storeName:this.getStorename(r,n),items:t.map((function(e){return P.modelInstanceCreator(P.getModelConstructorByModelName(r,n),e)}))}),[2]}}))}))},e.prototype.clear=function(){return w(this,void 0,void 0,(function(){return _(this,(function(e){switch(e.label){case 0:return[4,this.db.clear()];case 1:return e.sent(),this.db=void 0,this.initPromise=void 0,[2]}}))}))},e.prototype.batchSave=function(e,t){return w(this,void 0,void 0,(function(){var n,r,i,s,a,u,c,f,l,d,h;return _(this,(function(p){switch(p.label){case 0:n=e.name,r=this.namespaceResolver(e),i=this.getStorename(r,n),s=[],a=function(t){var n=t.id,r=Object(o.x)(e.name,u.modelInstanceCreator(e,t),u.schema.namespaces[u.namespaceResolver(e)],u.modelInstanceCreator,u.getModelConstructorByModelName).find((function(e){return e.instance.id===n})).instance;s.push(r)},u=this;try{for(c=M(t),f=c.next();!f.done;f=c.next())l=f.value,a(l)}catch(e){d={error:e}}finally{try{f&&!f.done&&(h=c.return)&&h.call(c)}finally{if(d)throw d.error}}return[4,this.db.batchSave(i,s)];case 1:return[2,p.sent()]}}))}))},e}();t.default=new I},function(e,t,n){"use strict";n.r(t),n.d(t,"fromUtf8",(function(){return r})),n.d(t,"toUtf8",(function(){return i}));var r=function(e){return"function"==typeof TextEncoder?function(e){return(new TextEncoder).encode(e)}(e):function(e){for(var t=[],n=0,r=e.length;n>6|192,63&i|128);else if(n+1>18|240,o>>12&63|128,o>>6&63|128,63&o|128)}else t.push(i>>12|224,i>>6&63|128,63&i|128)}return Uint8Array.from(t)}(e)},i=function(e){return"function"==typeof TextDecoder?function(e){return new TextDecoder("utf-8").decode(e)}(e):function(e){for(var t="",n=0,r=e.length;n0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s},c=function(){for(var e=[],t=0;te)&&n}}(n))}}])})); - -// version: 3.3.18 diff --git a/docs/javascript/extra.js b/docs/javascript/extra.js index a7b76cf2b1..f0df000448 100644 --- a/docs/javascript/extra.js +++ b/docs/javascript/extra.js @@ -1,54 +1,9 @@ -const Amplify = window.aws_amplify.Amplify; -const Analytics = Amplify.Analytics; -const KinesisFirehoseProvider = window.aws_amplify.AWSKinesisFirehoseProvider; - -const awsconfig = { - aws_project_region: 'eu-west-1', - aws_cognito_identity_pool_id: - 'eu-west-1:3df3caec-4bb6-4891-b154-ee940c8264b8', - aws_cognito_region: 'eu-west-1', - aws_kinesis_firehose_stream_name: 'ClickStreamKinesisFirehose-OGX7PQdrynUo', -}; - -const RUNTIME = 'typescript'; -const BASE_ORIGIN = 'docs.powertools.aws.dev'; - function copyToClipboard(e) { e.preventDefault(); navigator.clipboard.writeText(e.target.textContent); alert$.next('Copied to clipboard'); } -function enableSearchOnBlurElement() { - if (document.location.hostname !== BASE_ORIGIN) return; // prevent unnecessary data - /* Register handler to log search on blur */ - document.addEventListener('DOMContentLoaded', () => { - recordPageView({ - prevLocation: document.referrer, - }); - if (document.forms.search) { - const query = document.forms.search.query; - query.addEventListener('blur', function () { - // If Search result is ever actionable - // we should populate `value` - if (this.value) { - console.info(`Search value: ${this.value}`); - recordPageView({ - searchPattern: this.value, - }); - } - }); - } - }); - - // Register handler for page sections when browser history is changed - window.onpopstate = () => { - recordPageView({ - prevLocation: document.referrer, - }); - }; -} - function enableClipboardElements() { const copyElements = document.querySelectorAll('.copyMe'); copyElements.forEach((element) => { @@ -62,33 +17,7 @@ const attachListeners = () => { }; const init = () => { - Analytics.addPluggable(new KinesisFirehoseProvider()); - Amplify.configure(awsconfig); - - Analytics.configure({ - AWSKinesisFirehose: { - region: awsconfig.aws_project_region, - }, - }); - attachListeners(); }; -const recordPageView = ({ prevLocation, searchPattern }) => { - Analytics.record( - { - data: { - // Do not count page view for search - url: searchPattern ? null : window.location.href, - section: searchPattern ? null : location.pathname, - previous: prevLocation || null, - search: searchPattern || null, - language: RUNTIME, - }, - streamName: awsconfig.aws_kinesis_firehose_stream_name, - }, - 'AWSKinesisFirehose' - ); -}; - init(); diff --git a/docs/maintainers.md b/docs/maintainers.md index 1ad48a25b7..c8217e3480 100644 --- a/docs/maintainers.md +++ b/docs/maintainers.md @@ -13,11 +13,11 @@ This is document explains who the maintainers are, their responsibilities, and h ## Current Maintainers -| Maintainer | GitHub ID | Affiliation | -| ------------------ | --------------------------------------------------------------------------- | ----------- | -| Andrea Amorosi | [dreamorosi](https://github.com/dreamorosi){target="_blank" rel="nofollow"} | Amazon | -| Swopnil Dangol | [sdangol](https://github.com/sdangol){target="_blank" rel="nofollow"} | Amazon | -| Stefano Vozza | [svozza](https://github.com/svozza){target="_blank" rel="nofollow"} | Amazon | +| Maintainer | GitHub ID | Affiliation | +| -------------- | --------------------------------------------------------------------------- | ----------- | +| Andrea Amorosi | [dreamorosi](https://github.com/dreamorosi){target="_blank" rel="nofollow"} | Amazon | +| Swopnil Dangol | [sdangol](https://github.com/sdangol){target="_blank" rel="nofollow"} | Amazon | +| Stefano Vozza | [svozza](https://github.com/svozza){target="_blank" rel="nofollow"} | Amazon | ## Emeritus @@ -126,7 +126,7 @@ See [Common scenarios](#common-scenarios) section for additional guidance. Manage [labels](#labels), review issues regularly, and create new labels as needed by the project. Remove `triage` label when you're able to confirm the validity of a request, a bug can be reproduced, etc. Give priority to the original author for implementation, unless it is a sensitive task that is best handled by maintainers. -Make sure issues are assigned to our [board of activities](https://github.com/orgs/awslabs/projects/7/) and have the right [status](https://docs.powertools.aws.dev/lambda/typescript/latest/roadmap/#roadmap-status-definition). +Make sure issues are assigned to our [board of activities](https://github.com/orgs/awslabs/projects/7/) and have the right [status](https://docs.aws.amazon.com/powertools/typescript/latest/roadmap/#roadmap-status-definition). Use our [labels](#labels) to signal good first issues to new community members, and to set expectation that this might need additional feedback from the author, other customers, experienced community members and/or maintainers. @@ -151,7 +151,7 @@ RFC is a collaborative process to help us get to the most optimal solution given Make sure you ask these questions in mind when reviewing: - Does it use our [RFC template](https://github.com/aws-powertools/powertools-lambda-typescript/discussions/new?category=rfcs)? -- Does the match our [Tenets](https://docs.powertools.aws.dev/lambda/typescript/latest/#tenets)? +- Does the match our [Tenets](https://docs.aws.amazon.com/powertools/typescript/latest/#tenets)? - Does the proposal address the use case? If so, is the recommended usage explicit? - Does it focus on the mechanics to solve the use case over fine-grained implementation details? - Can anyone familiar with the code base implement it? @@ -330,7 +330,7 @@ Keep the `main` branch at production quality at all times. Backport features as ### Manage Roadmap -See [Roadmap section](https://docs.powertools.aws.dev/lambda/typescript/latest/roadmap/) +See [Roadmap section](https://docs.aws.amazon.com/powertools/typescript/latest/roadmap/) Ensure the repo highlights features that should be elevated to the project roadmap. Be clear about the feature’s status, priority, target version, and whether or not it should be elevated to the roadmap. diff --git a/docs/overrides/main.html b/docs/overrides/main.html index 0d556b6813..64dcbf5499 100644 --- a/docs/overrides/main.html +++ b/docs/overrides/main.html @@ -5,4 +5,9 @@ Click here to go to latest. +{% endblock %} + +{% block extrahead %} + + {% endblock %} \ No newline at end of file diff --git a/docs/we_made_this.md b/docs/we_made_this.md index e152664295..b9c045a7b3 100644 --- a/docs/we_made_this.md +++ b/docs/we_made_this.md @@ -11,7 +11,7 @@ This space is dedicated to highlight our awesome community content featuring Pow ## Connect -[![Join our Discord](https://dcbadge.vercel.app/api/server/B8zZKbbyET)](https://discord.gg/B8zZKbbyET){target="_blank"} +[![Join our Discord](https://img.shields.io/badge/Discord-Join_Community-7289da.svg)](https://discord.gg/B8zZKbbyET){target="_blank"} Join us on [Discord](https://discord.gg/B8zZKbbyET){target="_blank"} to connect with the Powertools community 👋. Ask questions, learn from each other, contribute, hang out with key contributors, and more! diff --git a/examples/app/functions/get-all-items.ts b/examples/app/functions/get-all-items.ts index d662dc9460..1a7637c509 100644 --- a/examples/app/functions/get-all-items.ts +++ b/examples/app/functions/get-all-items.ts @@ -17,7 +17,7 @@ import { logger, metrics, tracer } from '#powertools'; * It is the best choice if your existing code base relies on the Middy middleware engine. * Powertools for AWS Lambda (TypeScript) offers compatible Middy middleware to make this integration seamless. * - * Find more Information in the docs: https://docs.powertools.aws.dev/lambda/typescript/ + * Find more Information in the docs: https://docs.aws.amazon.com/powertools/typescript/ * * Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format * @param {Object} event - API Gateway Lambda Proxy Input Format diff --git a/examples/app/functions/get-by-id.ts b/examples/app/functions/get-by-id.ts index 5ecb975019..ee90d80a55 100644 --- a/examples/app/functions/get-by-id.ts +++ b/examples/app/functions/get-by-id.ts @@ -16,7 +16,7 @@ import { logger, metrics, tracer } from '#powertools'; * Use TypeScript method decorators if you prefer writing your business logic using TypeScript Classes. * If you aren’t using Classes, this requires the most significant refactoring. * - * Find more Information in the docs: https://docs.powertools.aws.dev/lambda/typescript/ + * Find more Information in the docs: https://docs.aws.amazon.com/powertools/typescript/ * * Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format * @param {APIGatewayProxyEvent} event - API Gateway Lambda Proxy Input Format diff --git a/examples/snippets/event-handler/appsync-graphql/templates/gettingStartedSam.yaml b/examples/snippets/event-handler/appsync-graphql/templates/gettingStartedSam.yaml index 57e05a6c37..6d0c0ddee5 100644 --- a/examples/snippets/event-handler/appsync-graphql/templates/gettingStartedSam.yaml +++ b/examples/snippets/event-handler/appsync-graphql/templates/gettingStartedSam.yaml @@ -9,7 +9,7 @@ Globals: Runtime: nodejs22.x Environment: Variables: - # Powertools for AWS Lambda (TypeScript) env vars: https://docs.powertools.aws.dev/lambda/typescript/latest/environment-variables/ + # Powertools for AWS Lambda (TypeScript) env vars: https://docs.aws.amazon.com/powertools/typescript/latest/environment-variables/ POWERTOOLS_LOG_LEVEL: INFO POWERTOOLS_LOGGER_SAMPLE_RATE: 0.1 POWERTOOLS_LOGGER_LOG_EVENT: true diff --git a/mkdocs.yml b/mkdocs.yml index c1af2e07d9..0eacd1d117 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -3,7 +3,7 @@ site_description: Powertools for AWS Lambda (TypeScript) site_author: Amazon Web Services repo_url: https://github.com/aws-powertools/powertools-lambda-typescript edit_uri: edit/main/docs -site_url: https://docs.powertools.aws.dev/lambda/typescript/latest +site_url: https://docs.aws.amazon.com/powertools/typescript/latest/ watch: [ docs, packages/batch/src, @@ -179,7 +179,6 @@ plugins: - getting-started/typescript-settings.md - getting-started/lambda-layers.md Features: - - features/index.md - features/tracer.md - features/logger.md - features/metrics.md @@ -202,9 +201,9 @@ plugins: extra_css: - stylesheets/extra.css extra_javascript: - - javascript/aws-amplify.min.js - javascript/extra.js - - https://docs.powertools.aws.dev/shared/mermaid.min.js + - https://docs.aws.amazon.com/powertools/shared/mermaid.min.js + - https://docs.aws.amazon.com/assets/js/awsdocs-boot.js extra: version: diff --git a/packages/batch/README.md b/packages/batch/README.md index d52de8c4b9..c5015019cb 100644 --- a/packages/batch/README.md +++ b/packages/batch/README.md @@ -1,6 +1,6 @@ # Powertools for AWS Lambda (TypeScript) - Batch Processing Utility -Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.powertools.aws.dev/lambda/typescript/latest/#features). +Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.aws.amazon.com/powertools/typescript/latest/#features). You can use the library in both TypeScript and JavaScript code bases. @@ -143,7 +143,7 @@ export const handler: SQSHandler = async (event, context) => }); ``` -Check the [docs](https://docs.powertools.aws.dev/lambda/typescript/latest/features/batch/) for more examples. +Check the [docs](https://docs.aws.amazon.com/powertools/typescript/latest/features/batch/) for more examples. ## Contribute @@ -190,11 +190,11 @@ The following companies, among others, use Powertools: ### Sharing your work -Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.powertools.aws.dev/lambda/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). +Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.aws.amazon.com/powertools/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). ### Using Lambda Layer -This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.powertools.aws.dev/lambda/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. +This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.aws.amazon.com/powertools/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. ## License diff --git a/packages/commons/README.md b/packages/commons/README.md index cb969b8d6e..e894a581c6 100644 --- a/packages/commons/README.md +++ b/packages/commons/README.md @@ -1,6 +1,6 @@ # Powertools for AWS Lambda (TypeScript) -Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.powertools.aws.dev/lambda/typescript/latest/#features). +Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.aws.amazon.com/powertools/typescript/latest/#features). You can use the library in both TypeScript and JavaScript code bases. @@ -42,18 +42,7 @@ if (isTruthy(truthyValue)) { } ``` -Here's a full list of type utilities available in the package: - -- [`isInteger`](https://docs.powertools.aws.dev/lambda/typescript/latest/api/functions/_aws_lambda_powertools_commons.isIntegerNumber.html) -- [`isNull`](https://docs.powertools.aws.dev/lambda/typescript/latest/api/functions/_aws_lambda_powertools_commons.isNull.html) -- [`isNullOrUndefined`](https://docs.powertools.aws.dev/lambda/typescript/latest/api/functions/_aws_lambda_powertools_commons.isNullOrUndefined.html) -- [`isNumber`](https://docs.powertools.aws.dev/lambda/typescript/latest/api/functions/_aws_lambda_powertools_commons.isNumber.html) -- [`isRecord`](https://docs.powertools.aws.dev/lambda/typescript/latest/api/functions/_aws_lambda_powertools_commons.isRecord.html) -- [`isStrictEqual`](https://docs.powertools.aws.dev/lambda/typescript/latest/api/functions/_aws_lambda_powertools_commons.isStrictEqual.html) -- [`isString`](https://docs.powertools.aws.dev/lambda/typescript/latest/api/functions/_aws_lambda_powertools_commons.isString.html) -- [`isTruthy`](https://docs.powertools.aws.dev/lambda/typescript/latest/api/functions/_aws_lambda_powertools_commons.isTruthy.html) - -Many of these utilities also double as type guards, which you can use to narrow down the type of an object or value. +You can find a full list of type utilities available [in the API docs](https://docs.aws.amazon.com/powertools/typescript/latest/api/modules/_aws-lambda-powertools_commons.typeUtils.html). Many of these utilities also double as type guards, which you can use to narrow down the type of an object or value. ### Base64 utils @@ -140,11 +129,11 @@ The following companies, among others, use Powertools: ### Sharing your work -Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.powertools.aws.dev/lambda/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). +Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.aws.amazon.com/powertools/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). ### Using Lambda Layer -This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.powertools.aws.dev/lambda/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. +This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.aws.amazon.com/powertools/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. ## License diff --git a/packages/event-handler/README.md b/packages/event-handler/README.md index 27bd79b460..4f8ded82c2 100644 --- a/packages/event-handler/README.md +++ b/packages/event-handler/README.md @@ -1,6 +1,6 @@ # Powertools for AWS Lambda (TypeScript) - Event Handler Utility -Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.powertools.aws.dev/lambda/typescript/latest/#features). +Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.aws.amazon.com/powertools/typescript/latest/#features). You can use the library in both TypeScript and JavaScript code bases. @@ -211,7 +211,7 @@ export const handler = async (event: unknown, context: Context) => app.resolve(event, context); ``` -See the [documentation](https://docs.powertools.aws.dev/lambda/typescript/latest/features/event-handler/appsync-events) for more details on how to use the AppSync event handler. +See the [documentation](https://docs.aws.amazon.com/powertools/typescript/latest/features/event-handler/appsync-events) for more details on how to use the AppSync event handler. ## Bedrock Agent Functions @@ -295,7 +295,7 @@ export const handler = async (event: unknown, context: Context) => app.resolve(event, context); ``` -See the [documentation](https://docs.powertools.aws.dev/lambda/typescript/latest/features/event-handler/appsync-events) for more details on how to use the AppSync event handler. +See the [documentation](https://docs.aws.amazon.com/powertools/typescript/latest/features/event-handler/appsync-events) for more details on how to use the AppSync event handler. ## Contribute @@ -342,11 +342,11 @@ The following companies, among others, use Powertools: ### Sharing your work -Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.powertools.aws.dev/lambda/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). +Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.aws.amazon.com/powertools/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). ### Using Lambda Layer -This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.powertools.aws.dev/lambda/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. +This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.aws.amazon.com/powertools/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. ## License diff --git a/packages/idempotency/README.md b/packages/idempotency/README.md index 7d5bd610f3..93da48cac7 100644 --- a/packages/idempotency/README.md +++ b/packages/idempotency/README.md @@ -1,7 +1,7 @@ # Powertools for AWS Lambda (TypeScript) - Idempotency Utility Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement -Serverless [best practices and increase developer velocity](https://docs.powertools.aws.dev/lambda/typescript/latest/#features). +Serverless [best practices and increase developer velocity](https://docs.aws.amazon.com/powertools/typescript/latest/#features). You can use the package in both TypeScript and JavaScript code bases. @@ -38,7 +38,7 @@ npm i @aws-lambda-powertools/idempotency @aws-sdk/client-dynamodb @aws-sdk/lib-d ``` Next, review the IAM permissions attached to your AWS Lambda function and make sure you allow -the [actions detailed](https://docs.powertools.aws.dev/lambda/typescript/latest/features/idempotency/#iam-permissions) +the [actions detailed](https://docs.aws.amazon.com/powertools/typescript/latest/features/idempotency/#iam-permissions) in the documentation of the utility. ### Function wrapper @@ -163,7 +163,7 @@ export const handler = makeIdempotent(myHandler, { ``` Additionally, you can also use one of -the [JMESPath built-in functions](https://docs.powertools.aws.dev/lambda/typescript/latest/features/jmespath/#built-in-jmespath-functions) +the [JMESPath built-in functions](https://docs.aws.amazon.com/powertools/typescript/latest/features/jmespath/#built-in-jmespath-functions) like `powertools_json()` to decode keys and use parts of the payload as the idempotency key. ```ts @@ -190,7 +190,7 @@ export const handler = makeIdempotent(myHandler, { }); ``` -Check the [docs](https://docs.powertools.aws.dev/lambda/typescript/latest/features/idempotency/) for more examples. +Check the [docs](https://docs.aws.amazon.com/powertools/typescript/latest/features/idempotency/) for more examples. ### Decorator @@ -254,7 +254,7 @@ export const handler = handlerClass.handler.bind(handlerClass); ``` The decorator configuration options are identical with the ones of the `makeIdempotent` function. Check -the [docs](https://docs.powertools.aws.dev/lambda/typescript/latest/features/idempotency/) for more examples. +the [docs](https://docs.aws.amazon.com/powertools/typescript/latest/features/idempotency/) for more examples. ### Middy middleware @@ -297,7 +297,7 @@ export const handler = middy( ); ``` -Check the [docs](https://docs.powertools.aws.dev/lambda/typescript/latest/features/idempotency/) for more examples. +Check the [docs](https://docs.aws.amazon.com/powertools/typescript/latest/features/idempotency/) for more examples. ### DynamoDB persistence layer @@ -306,7 +306,7 @@ payload, status for progress, expiration, and much more. You can customize most of the configuration options of the table, i.e the names of the attributes. See -the [API documentation](https://docs.powertools.aws.dev/lambda/typescript/latest/api/types/_aws_lambda_powertools_idempotency.types.DynamoDBPersistenceOptions.html) +the [API documentation](https://docs.aws.amazon.com/powertools/typescript/latest/api/types/_aws-lambda-powertools_idempotency.types.DynamoDBPersistenceOptions.html) for more details. ## Contribute @@ -357,11 +357,11 @@ The following companies, among others, use Powertools: ### Sharing your work -Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.powertools.aws.dev/lambda/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). +Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.aws.amazon.com/powertools/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). ### Using Lambda Layer -This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.powertools.aws.dev/lambda/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. +This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.aws.amazon.com/powertools/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. ## License diff --git a/packages/idempotency/src/IdempotencyConfig.ts b/packages/idempotency/src/IdempotencyConfig.ts index c26318aa60..9766568581 100644 --- a/packages/idempotency/src/IdempotencyConfig.ts +++ b/packages/idempotency/src/IdempotencyConfig.ts @@ -31,7 +31,7 @@ class IdempotencyConfig { * Options for parsing JMESPath expressions. * * By default, you can use any of the {@link https://jmespath.org/specification.html | JMESPath built-in functions} as well as the - * {@link https://docs.powertools.aws.dev/lambda/typescript/latest/api/classes/_aws_lambda_powertools_jmespath.PowertoolsFunctions.PowertoolsFunctions.html | custom functions provided} + * {@link https://docs.aws.amazon.com/powertools/typescript/latest/api/classes/_aws-lambda-powertools_jmespath.PowertoolsFunctions.PowertoolsFunctions.html | custom functions provided} * by the `@aws-lambda-powertools/jmespath` package. */ public jmesPathOptions: JMESPathParsingOptions; diff --git a/packages/idempotency/src/persistence/CachePersistenceLayer.ts b/packages/idempotency/src/persistence/CachePersistenceLayer.ts index 0b48eae3a3..fe27981da6 100644 --- a/packages/idempotency/src/persistence/CachePersistenceLayer.ts +++ b/packages/idempotency/src/persistence/CachePersistenceLayer.ts @@ -27,7 +27,7 @@ import { IdempotencyRecord } from './IdempotencyRecord.js'; * * You must provide your own connected client instance by passing it through the `client` option. * - * See the {@link https://docs.powertools.aws.dev/lambda/typescript/latest/features/idempotency/ Idempotency documentation} + * See the {@link https://docs.aws.amazon.com/powertools/typescript/latest/features/idempotency/ Idempotency documentation} * for more details on the configuration and usage patterns. * * **Using Valkey Glide Client** diff --git a/packages/idempotency/src/persistence/DynamoDBPersistenceLayer.ts b/packages/idempotency/src/persistence/DynamoDBPersistenceLayer.ts index 6dfbeb63f5..930d41d1db 100644 --- a/packages/idempotency/src/persistence/DynamoDBPersistenceLayer.ts +++ b/packages/idempotency/src/persistence/DynamoDBPersistenceLayer.ts @@ -34,7 +34,7 @@ import { IdempotencyRecord } from './IdempotencyRecord.js'; * With default configuration you don't need to create the client beforehand, the persistence layer will create it for you. * You can also bring your own AWS SDK V3 client, or configure the client with the `clientConfig` option. * - * See the {@link https://docs.powertools.aws.dev/lambda/python/latest/features/idempotency/ Idempotency documentation} for more details + * See the {@link https://docs.aws.amazon.com/powertools/python/latest/features/idempotency/ Idempotency documentation} for more details * on the IAM permissions and DynamoDB table configuration. * * @example diff --git a/packages/idempotency/src/types/ConfigServiceInterface.ts b/packages/idempotency/src/types/ConfigServiceInterface.ts index c4d8f11b25..5b173cad66 100644 --- a/packages/idempotency/src/types/ConfigServiceInterface.ts +++ b/packages/idempotency/src/types/ConfigServiceInterface.ts @@ -5,7 +5,7 @@ import type { ConfigServiceInterface as ConfigServiceBaseInterface } from '@aws- * * @interface * @see https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/#environment-variables + * @see https://docs.aws.amazon.com/powertools/typescript/latest/#environment-variables */ interface ConfigServiceInterface extends ConfigServiceBaseInterface { /** diff --git a/packages/jmespath/README.md b/packages/jmespath/README.md index a3f1805715..099aca92da 100644 --- a/packages/jmespath/README.md +++ b/packages/jmespath/README.md @@ -1,6 +1,6 @@ # Powertools for AWS Lambda (TypeScript) - JMESPath Utility -Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.powertools.aws.dev/lambda/typescript/latest/#features). +Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.aws.amazon.com/powertools/typescript/latest/#features). You can use the package in both TypeScript and JavaScript code bases. @@ -90,7 +90,7 @@ export const handler = async (event: MyEvent): Promise => { }; ``` -The library provides [a set of built-in envelopes](https://docs.powertools.aws.dev/lambda/typescript/latest/features/jmespath/#built-in-envelopes) to help you extract data from common event sources, such as S3, SQS, and SNS, and more. +The library provides [a set of built-in envelopes](https://docs.aws.amazon.com/powertools/typescript/latest/features/jmespath/#built-in-envelopes) to help you extract data from common event sources, such as S3, SQS, and SNS, and more. ```ts import { @@ -216,11 +216,11 @@ The following companies, among others, use Powertools: ### Sharing your work -Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.powertools.aws.dev/lambda/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). +Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.aws.amazon.com/powertools/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). ### Using Lambda Layer -This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.powertools.aws.dev/lambda/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. +This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.aws.amazon.com/powertools/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. ## License diff --git a/packages/kafka/README.md b/packages/kafka/README.md index 1143d130bb..ba8eee63a5 100644 --- a/packages/kafka/README.md +++ b/packages/kafka/README.md @@ -1,6 +1,6 @@ # Powertools for AWS Lambda (TypeScript) - Kafka Utility -Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.powertools.aws.dev/lambda/typescript/latest/#features). +Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.aws.amazon.com/powertools/typescript/latest/#features). You can use the package in both TypeScript and JavaScript code bases. @@ -248,7 +248,7 @@ export const handler = kafkaConsumer( ); ``` -See the [documentation](https://docs.powertools.aws.dev/lambda/typescript/latest/features/kafka) for more details on how to use the Kafka utility. +See the [documentation](https://docs.aws.amazon.com/powertools/typescript/latest/features/kafka) for more details on how to use the Kafka utility. ## Contribute @@ -295,11 +295,11 @@ The following companies, among others, use Powertools: ### Sharing your work -Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.powertools.aws.dev/lambda/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). +Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.aws.amazon.com/powertools/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). ### Using Lambda Layer -This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.powertools.aws.dev/lambda/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. +This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.aws.amazon.com/powertools/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. ## License diff --git a/packages/logger/README.md b/packages/logger/README.md index a40ff7733f..c5f7057fad 100644 --- a/packages/logger/README.md +++ b/packages/logger/README.md @@ -1,6 +1,6 @@ # Powertools for AWS Lambda (TypeScript) -Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.powertools.aws.dev/lambda/typescript/latest/#features). +Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.aws.amazon.com/powertools/typescript/latest/#features). You can use the library in both TypeScript and JavaScript code bases. @@ -253,11 +253,11 @@ The following companies, among others, use Powertools: ### Sharing your work -Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.powertools.aws.dev/lambda/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). +Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.aws.amazon.com/powertools/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). ### Using Lambda Layer -This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.powertools.aws.dev/lambda/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. +This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.aws.amazon.com/powertools/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. ## License diff --git a/packages/logger/src/Logger.ts b/packages/logger/src/Logger.ts index 6f79cedfaf..bb46a499e6 100644 --- a/packages/logger/src/Logger.ts +++ b/packages/logger/src/Logger.ts @@ -101,7 +101,7 @@ import type { * * If instead you use Middy.js middlewares, you use the {@link "middleware/middy".injectLambdaContext | `injectLambdaContext()`} middleware. * - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/core/logger/ + * @see https://docs.aws.amazon.com/powertools/typescript/latest/core/logger/ */ class Logger extends Utility implements LoggerInterface { /** diff --git a/packages/logger/src/types/ConfigServiceInterface.ts b/packages/logger/src/types/ConfigServiceInterface.ts index 8aee3737fb..1b21fd5978 100644 --- a/packages/logger/src/types/ConfigServiceInterface.ts +++ b/packages/logger/src/types/ConfigServiceInterface.ts @@ -5,7 +5,7 @@ import type { ConfigServiceInterface as ConfigServiceBaseInterface } from '@aws- * * @interface * @see https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/#environment-variables + * @see https://docs.aws.amazon.com/powertools/typescript/latest/#environment-variables */ interface ConfigServiceInterface extends ConfigServiceBaseInterface { /** diff --git a/packages/logger/src/types/Logger.ts b/packages/logger/src/types/Logger.ts index e127f9441d..b0b71a990d 100644 --- a/packages/logger/src/types/Logger.ts +++ b/packages/logger/src/types/Logger.ts @@ -89,7 +89,7 @@ type BaseConstructorOptions = { /** * The percentage rate at which the log level is `DEBUG`. * - * See {@link https://docs.powertools.aws.dev/lambda/typescript/latest/core/logger/#sampling-debug-logs | Sampling debug logs} for more information. + * See {@link https://docs.aws.amazon.com/powertools/typescript/latest/core/logger/#sampling-debug-logs | Sampling debug logs} for more information. */ sampleRateValue?: number; /** @@ -159,7 +159,7 @@ type LogFormatterOption = { /** * The custom log formatter to process log attributes. * - * See {@link https://docs.powertools.aws.dev/lambda/typescript/latest/core/logger/#custom-log-formatter-bring-your-own-formatter | Custom Log Formatters} for more information. + * See {@link https://docs.aws.amazon.com/powertools/typescript/latest/core/logger/#custom-log-formatter-bring-your-own-formatter | Custom Log Formatters} for more information. */ logFormatter?: LogFormatter; /** diff --git a/packages/logger/src/types/logKeys.ts b/packages/logger/src/types/logKeys.ts index ad4966fd41..8de523dcb2 100644 --- a/packages/logger/src/types/logKeys.ts +++ b/packages/logger/src/types/logKeys.ts @@ -54,7 +54,7 @@ type Environment = 'dev' | 'local' | 'staging' | 'prod' | AutocompletableString; /** * Standard keys that are included in every log item when using the default log formatter. * - * See {@link https://docs.powertools.aws.dev/lambda/python/latest/core/logger/#standard-structured-keys | Standard structured keys} for more information. + * See {@link https://docs.aws.amazon.com/powertools/python/latest/core/logger/#standard-structured-keys | Standard structured keys} for more information. */ type PowertoolsStandardKeys = { /** @@ -72,7 +72,7 @@ type PowertoolsStandardKeys = { /** * The percentage rate at which the log level is `DEBUG`. * - * See {@link https://docs.powertools.aws.dev/lambda/typescript/latest/core/logger/#sampling-debug-logs | Sampling debug logs} for more information. + * See {@link https://docs.aws.amazon.com/powertools/typescript/latest/core/logger/#sampling-debug-logs | Sampling debug logs} for more information. * * @example 0.1 */ @@ -107,7 +107,7 @@ type PowertoolsStandardKeys = { * Additional keys that are added to the log item when using the default log formatter and * having added AWS Lambda context. * - * See {@link https://docs.powertools.aws.dev/lambda/typescript/latest/core/logger/#capturing-lambda-context-info | Capturing Lambda context info} for more information. + * See {@link https://docs.aws.amazon.com/powertools/typescript/latest/core/logger/#capturing-lambda-context-info | Capturing Lambda context info} for more information. */ type PowertoolsLambdaContextKeys = { /** diff --git a/packages/metrics/README.md b/packages/metrics/README.md index 9d6dc17afc..ab531fee05 100644 --- a/packages/metrics/README.md +++ b/packages/metrics/README.md @@ -1,6 +1,6 @@ # Powertools for AWS Lambda (TypeScript) -Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.powertools.aws.dev/lambda/typescript/latest/#features). +Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.aws.amazon.com/powertools/typescript/latest/#features). You can use the library in both TypeScript and JavaScript code bases. @@ -28,7 +28,7 @@ To get started, install the library by running: npm i @aws-lambda-powertools/metrics ``` -After initializing the Metrics class, you can add metrics using the [https://docs.powertools.aws.dev/lambda/typescript/latest/core/metrics/#creating-metrics](`addMetric()`) method. The metrics are stored in a buffer and are flushed when calling [https://docs.powertools.aws.dev/lambda/typescript/latest/core/metrics/#flushing-metrics](`publishStoredMetrics()`). +After initializing the Metrics class, you can add metrics using the [https://docs.aws.amazon.com/powertools/typescript/latest/core/metrics/#creating-metrics](`addMetric()`) method. The metrics are stored in a buffer and are flushed when calling [https://docs.aws.amazon.com/powertools/typescript/latest/core/metrics/#flushing-metrics](`publishStoredMetrics()`). Each metric can also have dimensions and metadata added to it. @@ -178,11 +178,11 @@ The following companies, among others, use Powertools: ### Sharing your work -Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.powertools.aws.dev/lambda/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). +Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.aws.amazon.com/powertools/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). ### Using Lambda Layer -This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.powertools.aws.dev/lambda/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. +This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.aws.amazon.com/powertools/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. ## License diff --git a/packages/metrics/src/types/ConfigServiceInterface.ts b/packages/metrics/src/types/ConfigServiceInterface.ts index 68a86e1571..280a33a395 100644 --- a/packages/metrics/src/types/ConfigServiceInterface.ts +++ b/packages/metrics/src/types/ConfigServiceInterface.ts @@ -5,7 +5,7 @@ import type { ConfigServiceInterface as ConfigServiceBaseInterface } from '@aws- * * @interface * @see https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/#environment-variables + * @see https://docs.aws.amazon.com/powertools/typescript/latest/#environment-variables */ interface ConfigServiceInterface extends ConfigServiceBaseInterface { /** diff --git a/packages/parameters/README.md b/packages/parameters/README.md index 539fd33dd7..953ebdedb7 100644 --- a/packages/parameters/README.md +++ b/packages/parameters/README.md @@ -1,6 +1,6 @@ # Powertools for AWS Lambda (TypeScript) -Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.powertools.aws.dev/lambda/typescript/latest/#features). +Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.aws.amazon.com/powertools/typescript/latest/#features). You can use the package in both TypeScript and JavaScript code bases. @@ -39,7 +39,7 @@ To get started, install the library and the corresponding AWS SDK for JavaScript npm install @aws-lambda-powertools/parameters @aws-sdk/client-ssm ``` -Next, review the IAM permissions attached to your AWS Lambda function and make sure you allow the [actions detailed](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/#iam-permissions) in the documentation of the utility. +Next, review the IAM permissions attached to your AWS Lambda function and make sure you allow the [actions detailed](https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/#iam-permissions) in the documentation of the utility. You can retrieve a single parameter using the `getParameter` high-level function. @@ -95,7 +95,7 @@ export const handler = async (): Promise => { }; ``` -Check the [docs](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/#fetching-parameters) for more examples, and [the advanced section](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/#advanced) for details about caching, transforms, customizing the underlying SDK, and more. +Check the [docs](https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/#fetching-parameters) for more examples, and [the advanced section](https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/#advanced) for details about caching, transforms, customizing the underlying SDK, and more. ### Getting secrets from Amazon Secrets Manager @@ -105,7 +105,7 @@ To get started, install the library and the corresponding AWS SDK for JavaScript npm install @aws-lambda-powertools/parameters @aws-sdk/client-secrets-manager ``` -Next, review the IAM permissions attached to your AWS Lambda function and make sure you allow the [actions detailed](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/#iam-permissions) in the documentation of the utility. +Next, review the IAM permissions attached to your AWS Lambda function and make sure you allow the [actions detailed](https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/#iam-permissions) in the documentation of the utility. You can fetch secrets stored in Secrets Manager using the `getSecret` function: @@ -119,7 +119,7 @@ export const handler = async (): Promise => { }; ``` -Check the [docs](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/#fetching-secrets) for more examples, and [the advanced section](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/#advanced) for details about caching, transforms, customizing the underlying SDK, and more. +Check the [docs](https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/#fetching-secrets) for more examples, and [the advanced section](https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/#advanced) for details about caching, transforms, customizing the underlying SDK, and more. ### Retrieving values from Amazon DynamoDB @@ -129,7 +129,7 @@ To get started, install the library and the corresponding AWS SDK for JavaScript npm install @aws-lambda-powertools/parameters @aws-sdk/client-dynamodb @aws-sdk/util-dynamodb ``` -Next, review the IAM permissions attached to your AWS Lambda function and make sure you allow the [actions detailed](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/#iam-permissions) in the documentation of the utility. +Next, review the IAM permissions attached to your AWS Lambda function and make sure you allow the [actions detailed](https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/#iam-permissions) in the documentation of the utility. You can retrieve a single parameter from DynamoDB using the `DynamoDBProvider.get()` method: @@ -166,7 +166,7 @@ export const handler = async (): Promise => { }; ``` -Check the [docs](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/#fetching-secrets) for more examples, and [the advanced section](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/#advanced) for details about caching, transforms, customizing the underlying SDK, and more. +Check the [docs](https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/#fetching-secrets) for more examples, and [the advanced section](https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/#advanced) for details about caching, transforms, customizing the underlying SDK, and more. ### Fetching configs from AWS AppConfig @@ -176,7 +176,7 @@ To get started, install the library and the corresponding AWS SDK for JavaScript npm install @aws-lambda-powertools/parameters @aws-sdk/client-appconfigdata ``` -Next, review the IAM permissions attached to your AWS Lambda function and make sure you allow the [actions detailed](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/#iam-permissions) in the documentation of the utility. +Next, review the IAM permissions attached to your AWS Lambda function and make sure you allow the [actions detailed](https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/#iam-permissions) in the documentation of the utility. You can fetch application configurations in AWS AppConfig using the `getAppConfig` function: @@ -193,7 +193,7 @@ export const handler = async (): Promise => { }; ``` -Check the [docs](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/#fetching-app-configurations) for more examples, and [the advanced section](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/#advanced) for details about caching, transforms, customizing the underlying SDK, and more. +Check the [docs](https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/#fetching-app-configurations) for more examples, and [the advanced section](https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/#advanced) for details about caching, transforms, customizing the underlying SDK, and more. ## Contribute @@ -243,11 +243,11 @@ The following companies, among others, use Powertools: ### Sharing your work -Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.powertools.aws.dev/lambda/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). +Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.aws.amazon.com/powertools/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). ### Using Lambda Layer -This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.powertools.aws.dev/lambda/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. +This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.aws.amazon.com/powertools/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. ## License diff --git a/packages/parameters/src/appconfig/AppConfigProvider.ts b/packages/parameters/src/appconfig/AppConfigProvider.ts index c78bdadf26..338916ef08 100644 --- a/packages/parameters/src/appconfig/AppConfigProvider.ts +++ b/packages/parameters/src/appconfig/AppConfigProvider.ts @@ -175,7 +175,7 @@ import type { * * This object must be an instance of the [AWS SDK v3 for JavaScript AppConfig Data client](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-appconfigdata/classes/appconfigdataclient.html). * - * For more usage examples, see [our documentation](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/). + * For more usage examples, see [our documentation](https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/). */ class AppConfigProvider extends BaseProvider { public declare client: AppConfigDataClient; @@ -229,7 +229,7 @@ class AppConfigProvider extends BaseProvider { * }; * ``` * - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * @see https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/ * * @param name - The name of the configuration profile to retrieve * @param options - Optional options to configure the provider diff --git a/packages/parameters/src/appconfig/getAppConfig.ts b/packages/parameters/src/appconfig/getAppConfig.ts index 0a3e11996a..b8d7dfb0a9 100644 --- a/packages/parameters/src/appconfig/getAppConfig.ts +++ b/packages/parameters/src/appconfig/getAppConfig.ts @@ -131,7 +131,7 @@ import { AppConfigProvider } from './AppConfigProvider.js'; * * For greater flexibility such as configuring the underlying SDK client used by built-in providers, you can use the {@link AppConfigProvider | `AppConfigProvider`} class. * - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * @see https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/ * * @param name - The name of the configuration profile to retrieve * @param options - Options to configure the provider diff --git a/packages/parameters/src/dynamodb/DynamoDBProvider.ts b/packages/parameters/src/dynamodb/DynamoDBProvider.ts index a35127e2e4..951273b766 100644 --- a/packages/parameters/src/dynamodb/DynamoDBProvider.ts +++ b/packages/parameters/src/dynamodb/DynamoDBProvider.ts @@ -225,7 +225,7 @@ import type { * * This object must be an instance of the [AWS SDK v3 for JavaScript DynamoDB client](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-dynamodb/classes/dynamodbclient.html). * - * For more usage examples, see [our documentation](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/). + * For more usage examples, see [our documentation](https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/). */ class DynamoDBProvider extends BaseProvider { public declare client: DynamoDBClient; @@ -266,7 +266,7 @@ class DynamoDBProvider extends BaseProvider { * }; * ``` * - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * @see https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/ * * @param name - The name of the value to retrieve (partition key) * @param options - Optional options to configure the provider @@ -310,7 +310,7 @@ class DynamoDBProvider extends BaseProvider { * }; * ``` * - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * @see https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/ * * @param path - The path of the values to retrieve (partition key) * @param options - Optional options to configure the provider diff --git a/packages/parameters/src/secrets/SecretsProvider.ts b/packages/parameters/src/secrets/SecretsProvider.ts index f247a7aca8..a53dfc120a 100644 --- a/packages/parameters/src/secrets/SecretsProvider.ts +++ b/packages/parameters/src/secrets/SecretsProvider.ts @@ -133,9 +133,9 @@ import type { * * This object must be an instance of the [AWS SDK v3 for JavaScript Secrets Manager client](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-secrets-manager/classes/secretsmanagerclient.html). * - * For more usage examples, see [our documentation](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/). + * For more usage examples, see [our documentation](https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/). * - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * @see https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/ */ class SecretsProvider extends BaseProvider { public declare client: SecretsManagerClient; @@ -164,7 +164,7 @@ class SecretsProvider extends BaseProvider { * }; * ``` * - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * @see https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/ * * @param name - The name of the secret to retrieve * @param options - Optional options to configure the provider diff --git a/packages/parameters/src/secrets/getSecret.ts b/packages/parameters/src/secrets/getSecret.ts index f1d04849e2..811ffd398e 100644 --- a/packages/parameters/src/secrets/getSecret.ts +++ b/packages/parameters/src/secrets/getSecret.ts @@ -88,7 +88,7 @@ import { SecretsProvider } from './SecretsProvider.js'; * * For greater flexibility such as configuring the underlying SDK client used by built-in providers, you can use the {@link SecretsProvider} class. * - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * @see https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/ * * @param name - The name of the secret to retrieve * @param options - Optional options to configure the provider diff --git a/packages/parameters/src/ssm/SSMProvider.ts b/packages/parameters/src/ssm/SSMProvider.ts index 03d47ef78b..8b693dc757 100644 --- a/packages/parameters/src/ssm/SSMProvider.ts +++ b/packages/parameters/src/ssm/SSMProvider.ts @@ -260,7 +260,7 @@ import type { * * This object must be an instance of the [AWS SDK v3 for JavaScript SSM client](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-ssm/classes/ssmclient.html). * - * For more usage examples, see [our documentation](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/). + * For more usage examples, see [our documentation](https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/). */ class SSMProvider extends BaseProvider { public declare client: SSMClient; @@ -289,7 +289,7 @@ class SSMProvider extends BaseProvider { * }; * ``` - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * @see https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/ * * @param name - The name of the parameter to retrieve * @param options - Optional options to configure the provider @@ -330,7 +330,7 @@ class SSMProvider extends BaseProvider { * }; * ``` * - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * @see https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/ * * @param name - The name of the parameter * @param options - Options to configure the parameter @@ -387,7 +387,7 @@ class SSMProvider extends BaseProvider { * * For usage examples check {@link SSMProvider | `SSMProvider`}. * - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * @see https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/ * * @param path - The path of the parameters to retrieve * @param options - Optional options to configure the retrieval @@ -456,7 +456,7 @@ class SSMProvider extends BaseProvider { * └────────────────────┘ * ``` * - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * @see https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/ * * @param parameters - Object containing parameter names and any optional overrides * @param options - Options to configure the retrieval diff --git a/packages/parameters/src/ssm/getParameter.ts b/packages/parameters/src/ssm/getParameter.ts index 359caebf7d..eca7e770c1 100644 --- a/packages/parameters/src/ssm/getParameter.ts +++ b/packages/parameters/src/ssm/getParameter.ts @@ -111,7 +111,7 @@ import { SSMProvider } from './SSMProvider.js'; * * For greater flexibility such as configuring the underlying SDK client used by built-in providers, you can use the {@link SSMProvider} class. * - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * @see https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/ * * @param name - The name of the parameter to retrieve * @param options - Optional options to configure the provider diff --git a/packages/parameters/src/ssm/getParameters.ts b/packages/parameters/src/ssm/getParameters.ts index b8aca01a0d..7cef0f6c33 100644 --- a/packages/parameters/src/ssm/getParameters.ts +++ b/packages/parameters/src/ssm/getParameters.ts @@ -112,7 +112,7 @@ import { SSMProvider } from './SSMProvider.js'; * * For greater flexibility such as configuring the underlying SDK client used by built-in providers, you can use the {@link SSMProvider} class. * - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * @see https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/ * * @param path - The path of the parameters to retrieve * @param options - Optional options to configure the provider diff --git a/packages/parameters/src/ssm/getParametersByName.ts b/packages/parameters/src/ssm/getParametersByName.ts index 57c5043c08..163d0947b3 100644 --- a/packages/parameters/src/ssm/getParametersByName.ts +++ b/packages/parameters/src/ssm/getParametersByName.ts @@ -133,7 +133,7 @@ import { SSMProvider } from './SSMProvider.js'; * └────────────────────┘ * ``` * - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * @see https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/ * * @param parameters - The path of the parameters to retrieve * @param options - Options to configure the provider diff --git a/packages/parameters/src/ssm/setParameter.ts b/packages/parameters/src/ssm/setParameter.ts index 21adbefff6..b4e38ce1db 100644 --- a/packages/parameters/src/ssm/setParameter.ts +++ b/packages/parameters/src/ssm/setParameter.ts @@ -58,7 +58,7 @@ import { SSMProvider } from './SSMProvider.js'; * * For greater flexibility such as configuring the underlying SDK client used by built-in providers, you can use the {@link SSMProvider} utility. * - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/features/parameters/ + * @see https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/ * * @param name - Name of the parameter * @param options - Options to configure the parameter diff --git a/packages/parser/README.md b/packages/parser/README.md index 8c976cdc2b..7959984ae9 100644 --- a/packages/parser/README.md +++ b/packages/parser/README.md @@ -1,6 +1,6 @@ # Powertools for AWS Lambda (TypeScript) - Parser Utility -Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.powertools.aws.dev/lambda/typescript/latest/#features). +Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.aws.amazon.com/powertools/typescript/latest/#features). You can use the package in both TypeScript and JavaScript code bases. @@ -43,7 +43,7 @@ npm install @aws-lambda-powertools/parser zod You can parse inbound events using the `parser` decorator, Middy.js middleware, or [manually](#manual-parsing) using built-in envelopes and schemas. -When using the decorator or middleware, you can specify a schema to parse the event: this can be a [built-in Zod schema](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parser/#built-in-schemas) or a custom schema you defined. Custom schemas can be defined using Zod or any other [Standard Schema compatible library](https://standardschema.dev/#what-schema-libraries-implement-the-spec). +When using the decorator or middleware, you can specify a schema to parse the event: this can be a [built-in Zod schema](https://docs.aws.amazon.com/powertools/typescript/latest/features/parser/#built-in-schemas) or a custom schema you defined. Custom schemas can be defined using Zod or any other [Standard Schema compatible library](https://standardschema.dev/#what-schema-libraries-implement-the-spec). ### Middy.js Middleware @@ -253,7 +253,7 @@ export const handler = middy(lambdaHandler).use( ); ``` -See the [safe parsing](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parser#safe-parsing) section in the documentation for more details. +See the [safe parsing](https://docs.aws.amazon.com/powertools/typescript/latest/features/parser#safe-parsing) section in the documentation for more details. ### Built-in schemas and envelopes @@ -298,7 +298,7 @@ const myFunction = new Lambda(); export const handler = myFunction.handler.bind(myFunction); ``` -Check the utility documentation for a complete list of built-in [schemas](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parser/#built-in-schemas) and [envelopes](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parser/#built-in-envelopes). +Check the utility documentation for a complete list of built-in [schemas](https://docs.aws.amazon.com/powertools/typescript/latest/features/parser/#built-in-schemas) and [envelopes](https://docs.aws.amazon.com/powertools/typescript/latest/features/parser/#built-in-envelopes). ## Contribute @@ -348,11 +348,11 @@ The following companies, among others, use Powertools: ### Sharing your work -Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.powertools.aws.dev/lambda/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). +Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.aws.amazon.com/powertools/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). ### Using Lambda Layer -This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.powertools.aws.dev/lambda/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. +This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.aws.amazon.com/powertools/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. ## License diff --git a/packages/tracer/README.md b/packages/tracer/README.md index faf68ac001..75544d8399 100644 --- a/packages/tracer/README.md +++ b/packages/tracer/README.md @@ -1,6 +1,6 @@ # Powertools for AWS Lambda (TypeScript) -Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.powertools.aws.dev/lambda/typescript/latest/#features). +Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.aws.amazon.com/powertools/typescript/latest/#features). You can use the library in both TypeScript and JavaScript code bases. @@ -164,11 +164,11 @@ The following companies, among others, use Powertools: ### Sharing your work -Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.powertools.aws.dev/lambda/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). +Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.aws.amazon.com/powertools/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). ### Using Lambda Layer -This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.powertools.aws.dev/lambda/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. +This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.aws.amazon.com/powertools/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. ## License diff --git a/packages/tracer/src/Tracer.ts b/packages/tracer/src/Tracer.ts index b498f7e74e..738ef9955a 100644 --- a/packages/tracer/src/Tracer.ts +++ b/packages/tracer/src/Tracer.ts @@ -597,7 +597,7 @@ class Tracer extends Utility implements TracerInterface { * Usually you won't need to call this method unless you are creating custom subsegments or using manual mode. * * @see https://docs.aws.amazon.com/xray/latest/devguide/xray-concepts.html#xray-concepts-segments - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/core/tracer/#escape-hatch-mechanism + * @see https://docs.aws.amazon.com/powertools/typescript/latest/core/tracer/#escape-hatch-mechanism * * @example * ```typescript diff --git a/packages/tracer/src/types/ConfigServiceInterface.ts b/packages/tracer/src/types/ConfigServiceInterface.ts index 8ac7b0bcd8..a0888bb295 100644 --- a/packages/tracer/src/types/ConfigServiceInterface.ts +++ b/packages/tracer/src/types/ConfigServiceInterface.ts @@ -5,7 +5,7 @@ import type { ConfigServiceInterface as ConfigServiceBaseInterface } from '@aws- * * @interface * @see https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/#environment-variables + * @see https://docs.aws.amazon.com/powertools/typescript/latest/#environment-variables */ interface ConfigServiceInterface extends ConfigServiceBaseInterface { /** diff --git a/packages/validation/README.md b/packages/validation/README.md index 17302f3f67..5c5215de80 100644 --- a/packages/validation/README.md +++ b/packages/validation/README.md @@ -2,7 +2,7 @@ This utility provides JSON Schema validation for events and responses, including JMESPath support to unwrap events before validation. -Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.powertools.aws.dev/lambda/typescript/latest/#features). You can use the library in both TypeScript and JavaScript code bases. +Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.aws.amazon.com/powertools/typescript/latest/#features). You can use the library in both TypeScript and JavaScript code bases. To get started, install the package by running: @@ -225,7 +225,7 @@ const validatedData = validate({ }); ``` -For more information on how to use the `validate` function, please refer to the [documentation](https://docs.powertools.aws.dev/lambda/typescript/latest/features/validation). +For more information on how to use the `validate` function, please refer to the [documentation](https://docs.aws.amazon.com/powertools/typescript/latest/features/validation). ## Contribute @@ -272,11 +272,11 @@ The following companies, among others, use Powertools: ### Sharing your work -Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.powertools.aws.dev/lambda/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). +Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has [already shared](https://docs.aws.amazon.com/powertools/typescript/latest/we_made_this) about Powertools for AWS Lambda (TypeScript). ### Using Lambda Layer -This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.powertools.aws.dev/lambda/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. +This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.aws.amazon.com/powertools/typescript/latest/getting-started/lambda-layers/), you can add Powertools as a dev dependency to not impact the development process. ## License From ca5b7b06fe3b2cd2f4b6a118c9bd5eccde11931e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 15:30:08 +0100 Subject: [PATCH 221/255] chore(deps-dev): bump zod from 4.1.11 to 4.1.12 (#4621) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- examples/snippets/package.json | 2 +- package-lock.json | 14 +++++++------- packages/batch/package.json | 2 +- packages/kafka/package.json | 2 +- packages/parser/package.json | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/examples/snippets/package.json b/examples/snippets/package.json index d4c0389940..27cb73b35d 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -44,7 +44,7 @@ "@valkey/valkey-glide": "^2.1.0", "aws-sdk": "^2.1692.0", "aws-sdk-client-mock": "^4.1.0", - "zod": "^4.1.11" + "zod": "^4.1.12" }, "dependencies": { "arktype": "^2.1.22", diff --git a/package-lock.json b/package-lock.json index 8f09ca2f63..fd45eff48e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -105,7 +105,7 @@ "@valkey/valkey-glide": "^2.1.0", "aws-sdk": "^2.1692.0", "aws-sdk-client-mock": "^4.1.0", - "zod": "^4.1.11" + "zod": "^4.1.12" } }, "examples/snippets/node_modules/@valkey/valkey-glide": { @@ -10650,9 +10650,9 @@ } }, "node_modules/zod": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz", - "integrity": "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", + "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", "dev": true, "license": "MIT", "funding": { @@ -10670,7 +10670,7 @@ "devDependencies": { "@aws-lambda-powertools/parser": "2.27.0", "@aws-lambda-powertools/testing-utils": "file:../testing", - "zod": "^4.1.11" + "zod": "^4.1.12" } }, "packages/commons": { @@ -10747,7 +10747,7 @@ "devDependencies": { "avro-js": "^1.12.0", "protobufjs": "^7.5.4", - "zod": "^4.1.11" + "zod": "^4.1.12" }, "peerDependencies": { "arktype": ">=2.0.0", @@ -10868,7 +10868,7 @@ "@standard-schema/spec": "^1.0.0" }, "devDependencies": { - "zod": "^4.1.11" + "zod": "^4.1.12" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x", diff --git a/packages/batch/package.json b/packages/batch/package.json index ae2ba0818c..c71388a41b 100644 --- a/packages/batch/package.json +++ b/packages/batch/package.json @@ -88,6 +88,6 @@ "devDependencies": { "@aws-lambda-powertools/parser": "2.27.0", "@aws-lambda-powertools/testing-utils": "file:../testing", - "zod": "^4.1.11" + "zod": "^4.1.12" } } diff --git a/packages/kafka/package.json b/packages/kafka/package.json index 783d42b4a0..6bb4b5f8c1 100644 --- a/packages/kafka/package.json +++ b/packages/kafka/package.json @@ -117,6 +117,6 @@ "devDependencies": { "avro-js": "^1.12.0", "protobufjs": "^7.5.4", - "zod": "^4.1.11" + "zod": "^4.1.12" } } diff --git a/packages/parser/package.json b/packages/parser/package.json index 0c7f631c29..ca051a07db 100644 --- a/packages/parser/package.json +++ b/packages/parser/package.json @@ -216,6 +216,6 @@ } }, "devDependencies": { - "zod": "^4.1.11" + "zod": "^4.1.12" } } From 39d4029a5beed5b86bfba26e22775a3057736a90 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 15:32:08 +0100 Subject: [PATCH 222/255] chore(deps): bump @types/aws-lambda from 8.10.153 to 8.10.155 (#4617) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- examples/app/package.json | 4 ++-- package-lock.json | 12 ++++++------ package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 35ea342418..cd626f1dea 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -29,7 +29,7 @@ "#errors": "./functions/commons/errors.js" }, "devDependencies": { - "@types/aws-lambda": "^8.10.153", + "@types/aws-lambda": "^8.10.155", "@types/node": "24.7.0", "aws-cdk-lib": "^2.219.0", "constructs": "^10.4.2", @@ -48,7 +48,7 @@ "@aws-sdk/client-ssm": "^3.901.0", "@aws-sdk/lib-dynamodb": "^3.902.0", "@middy/core": "^4.7.0", - "@types/aws-lambda": "^8.10.153", + "@types/aws-lambda": "^8.10.155", "@types/node": "24.7.0", "aws-cdk": "^2.1029.4", "constructs": "^10.4.2", diff --git a/package-lock.json b/package-lock.json index fd45eff48e..d97f23f3aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ ], "devDependencies": { "@biomejs/biome": "^2.2.5", - "@types/aws-lambda": "^8.10.153", + "@types/aws-lambda": "^8.10.155", "@types/node": "^24.7.0", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", @@ -59,7 +59,7 @@ "@aws-sdk/client-ssm": "^3.901.0", "@aws-sdk/lib-dynamodb": "^3.902.0", "@middy/core": "^4.7.0", - "@types/aws-lambda": "^8.10.153", + "@types/aws-lambda": "^8.10.155", "@types/node": "24.7.0", "aws-cdk": "^2.1029.4", "constructs": "^10.4.2", @@ -67,7 +67,7 @@ "typescript": "^5.9.3" }, "devDependencies": { - "@types/aws-lambda": "^8.10.153", + "@types/aws-lambda": "^8.10.155", "@types/node": "24.7.0", "aws-cdk-lib": "^2.219.0", "constructs": "^10.4.2", @@ -5008,9 +5008,9 @@ "license": "MIT" }, "node_modules/@types/aws-lambda": { - "version": "8.10.153", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.153.tgz", - "integrity": "sha512-j5zuETAQtPKuU8ZeqtcLdqLxQeNffX1Dd1Sr3tP56rYZD21Ph49iIqWbiHHqwLXugsMPSsgX/bAZI29Patlbbw==", + "version": "8.10.155", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.155.tgz", + "integrity": "sha512-wd1XgoL0gy/ybo7WozUKQBd+IOgUkdfG6uUGI0fQOTEq06FBFdO7tmPDSxgjkFkl8GlfApvk5TvqZlAl0g+Lbg==", "dev": true, "license": "MIT" }, diff --git a/package.json b/package.json index 5122836f24..3165ce7276 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript#readme", "devDependencies": { "@biomejs/biome": "^2.2.5", - "@types/aws-lambda": "^8.10.153", + "@types/aws-lambda": "^8.10.155", "@types/node": "^24.7.0", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", From 30ad9455be5af3e8e10e54e9a15bf79761605df1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Oct 2025 10:35:56 +0100 Subject: [PATCH 223/255] chore(deps): bump aws-actions/configure-aws-credentials from 5.0.0 to 5.1.0 (#4620) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Swopnil Dangol --- .github/workflows/bootstrap_region.yml | 4 ++-- .github/workflows/layer_balance.yml | 2 +- .github/workflows/layers_partition_verify.yml | 4 ++-- .github/workflows/layers_partitions.yml | 4 ++-- .github/workflows/reusable_deploy_layer_stack.yml | 2 +- .github/workflows/reusable_publish_docs.yml | 2 +- .github/workflows/run-e2e-tests.yml | 2 +- .github/workflows/update_ssm.yml | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/bootstrap_region.yml b/.github/workflows/bootstrap_region.yml index b0f879148f..6cfc53d87a 100644 --- a/.github/workflows/bootstrap_region.yml +++ b/.github/workflows/bootstrap_region.yml @@ -54,7 +54,7 @@ jobs: uses: aws-powertools/actions/.github/actions/cached-node-modules@29979bc5339bf54f76a11ac36ff67701986bb0f0 - id: credentials name: AWS Credentials - uses: aws-actions/configure-aws-credentials@a03048d87541d1d9fcf2ecf528a4a65ba9bd7838 + uses: aws-actions/configure-aws-credentials@00943011d9042930efac3dcd3a170e4273319bc8 with: aws-region: ${{ inputs.region }} role-to-assume: ${{ secrets.REGION_IAM_ROLE }} @@ -84,7 +84,7 @@ jobs: steps: - id: credentials name: AWS Credentials - uses: aws-actions/configure-aws-credentials@a03048d87541d1d9fcf2ecf528a4a65ba9bd7838 + uses: aws-actions/configure-aws-credentials@00943011d9042930efac3dcd3a170e4273319bc8 with: aws-region: us-east-1 role-to-assume: ${{ secrets.REGION_IAM_ROLE }} diff --git a/.github/workflows/layer_balance.yml b/.github/workflows/layer_balance.yml index 06804a4b87..34aa1e830e 100644 --- a/.github/workflows/layer_balance.yml +++ b/.github/workflows/layer_balance.yml @@ -45,7 +45,7 @@ jobs: steps: - id: credentials name: AWS Credentials - uses: aws-actions/configure-aws-credentials@a03048d87541d1d9fcf2ecf528a4a65ba9bd7838 + uses: aws-actions/configure-aws-credentials@00943011d9042930efac3dcd3a170e4273319bc8 with: aws-region: us-east-1 role-to-assume: ${{ secrets.REGION_IAM_ROLE }} diff --git a/.github/workflows/layers_partition_verify.yml b/.github/workflows/layers_partition_verify.yml index 82eddb210e..c57d1337ef 100644 --- a/.github/workflows/layers_partition_verify.yml +++ b/.github/workflows/layers_partition_verify.yml @@ -84,7 +84,7 @@ jobs: environment: Prod (Readonly) steps: - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@a03048d87541d1d9fcf2ecf528a4a65ba9bd7838 # v5.0.0 + uses: aws-actions/configure-aws-credentials@00943011d9042930efac3dcd3a170e4273319bc8 # v5.1.0 with: role-to-assume: ${{ secrets.AWS_IAM_ROLE }} aws-region: us-east-1 @@ -127,7 +127,7 @@ jobs: run: | echo 'CONVERTED_REGION=${{ matrix.region }}' | tr 'a-z\-' 'A-Z_' >> "$GITHUB_OUTPUT" - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@a03048d87541d1d9fcf2ecf528a4a65ba9bd7838 # v5.0.0 + uses: aws-actions/configure-aws-credentials@00943011d9042930efac3dcd3a170e4273319bc8 # v5.1.0 with: # Dynamic secret access is safe here - secrets are scoped per environment role-to-assume: ${{ secrets[format('IAM_ROLE_{0}', steps.transform.outputs.CONVERTED_REGION)] }} diff --git a/.github/workflows/layers_partitions.yml b/.github/workflows/layers_partitions.yml index 246771a50b..27e0ffc892 100644 --- a/.github/workflows/layers_partitions.yml +++ b/.github/workflows/layers_partitions.yml @@ -93,7 +93,7 @@ jobs: environment: Prod (Readonly) steps: - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@a03048d87541d1d9fcf2ecf528a4a65ba9bd7838 # v5.0.0 + uses: aws-actions/configure-aws-credentials@00943011d9042930efac3dcd3a170e4273319bc8 # v5.1.0 with: role-to-assume: ${{ secrets.AWS_IAM_ROLE }} aws-region: us-east-1 @@ -151,7 +151,7 @@ jobs: run: | echo 'CONVERTED_REGION=${{ matrix.region }}' | tr 'a-z\-' 'A-Z_' >> "$GITHUB_OUTPUT" - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@a03048d87541d1d9fcf2ecf528a4a65ba9bd7838 # v5.0.0 + uses: aws-actions/configure-aws-credentials@00943011d9042930efac3dcd3a170e4273319bc8 # v5.1.0 with: # Dynamic secret access is safe here - secrets are scoped per environment role-to-assume: ${{ secrets[format('IAM_ROLE_{0}', steps.transform.outputs.CONVERTED_REGION)] }} diff --git a/.github/workflows/reusable_deploy_layer_stack.yml b/.github/workflows/reusable_deploy_layer_stack.yml index f0219619de..060c7e8ef4 100644 --- a/.github/workflows/reusable_deploy_layer_stack.yml +++ b/.github/workflows/reusable_deploy_layer_stack.yml @@ -75,7 +75,7 @@ jobs: - name: checkout uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: aws credentials - uses: aws-actions/configure-aws-credentials@a03048d87541d1d9fcf2ecf528a4a65ba9bd7838 # v5.0.0 + uses: aws-actions/configure-aws-credentials@00943011d9042930efac3dcd3a170e4273319bc8 # v5.1.0 with: aws-region: ${{ matrix.region }} role-to-assume: ${{ secrets.target-account-role }} diff --git a/.github/workflows/reusable_publish_docs.yml b/.github/workflows/reusable_publish_docs.yml index 79943e3ba2..1c0cc45e45 100644 --- a/.github/workflows/reusable_publish_docs.yml +++ b/.github/workflows/reusable_publish_docs.yml @@ -90,7 +90,7 @@ jobs: rm -rf site mkdocs build - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@a03048d87541d1d9fcf2ecf528a4a65ba9bd7838 # v5.0.0 + uses: aws-actions/configure-aws-credentials@00943011d9042930efac3dcd3a170e4273319bc8 # v5.1.0 with: aws-region: us-east-1 role-to-assume: ${{ secrets.AWS_DOCS_ROLE_ARN }} diff --git a/.github/workflows/run-e2e-tests.yml b/.github/workflows/run-e2e-tests.yml index 6d28f1f807..91c67e66db 100644 --- a/.github/workflows/run-e2e-tests.yml +++ b/.github/workflows/run-e2e-tests.yml @@ -58,7 +58,7 @@ jobs: with: node-version: '22' - name: Setup AWS credentials - uses: aws-actions/configure-aws-credentials@a03048d87541d1d9fcf2ecf528a4a65ba9bd7838 # v5.0.0 + uses: aws-actions/configure-aws-credentials@00943011d9042930efac3dcd3a170e4273319bc8 # v5.1.0 with: role-to-assume: ${{ secrets.E2E_IAM_ROLE_ARN }} aws-region: eu-west-1 diff --git a/.github/workflows/update_ssm.yml b/.github/workflows/update_ssm.yml index 157fa6ac55..5e7105a411 100644 --- a/.github/workflows/update_ssm.yml +++ b/.github/workflows/update_ssm.yml @@ -121,7 +121,7 @@ jobs: run: | echo 'CONVERTED_REGION=${{ matrix.region }}' | tr 'a-z\-' 'A-Z_' >> "$GITHUB_OUTPUT" - id: creds - uses: aws-actions/configure-aws-credentials@a03048d87541d1d9fcf2ecf528a4a65ba9bd7838 + uses: aws-actions/configure-aws-credentials@00943011d9042930efac3dcd3a170e4273319bc8 with: aws-region: ${{ matrix.region }} # Dynamic secret access is safe here - secrets are scoped per environment From 0fa7850aeb06677ee3d8e4142aaa80d9b49322ab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Oct 2025 18:22:26 +0100 Subject: [PATCH 224/255] chore(deps): bump @valkey/valkey-glide from 2.1.0 to 2.1.1 (#4625) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/snippets/package.json | 2 +- package-lock.json | 62 +++++++++++++++++----------------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/examples/snippets/package.json b/examples/snippets/package.json index 27cb73b35d..3543ee552f 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -41,7 +41,7 @@ "@aws-sdk/util-dynamodb": "^3.902.0", "@middy/core": "^4.7.0", "@redis/client": "^5.8.3", - "@valkey/valkey-glide": "^2.1.0", + "@valkey/valkey-glide": "^2.1.1", "aws-sdk": "^2.1692.0", "aws-sdk-client-mock": "^4.1.0", "zod": "^4.1.12" diff --git a/package-lock.json b/package-lock.json index d97f23f3aa..6868c3a2c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -102,16 +102,16 @@ "@aws-sdk/util-dynamodb": "^3.902.0", "@middy/core": "^4.7.0", "@redis/client": "^5.8.3", - "@valkey/valkey-glide": "^2.1.0", + "@valkey/valkey-glide": "^2.1.1", "aws-sdk": "^2.1692.0", "aws-sdk-client-mock": "^4.1.0", "zod": "^4.1.12" } }, "examples/snippets/node_modules/@valkey/valkey-glide": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@valkey/valkey-glide/-/valkey-glide-2.1.0.tgz", - "integrity": "sha512-iBvkF9KpKrIbuqa91DI47v5yCgqdQ7yxuHMbZmetmXWcUP/skhIsX6luhz333YSbVmKT5mfGAjbo24+9smVwrA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@valkey/valkey-glide/-/valkey-glide-2.1.1.tgz", + "integrity": "sha512-mHPSnNuMAjyNsHpNgeLQ0JwTSf+paGXCkjhrGF5CUfUTz/jxkEKnuZIvD5R45BkrftrHBvs9PL+NhwhTHEsxhg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -122,12 +122,12 @@ "node": ">=16" }, "optionalDependencies": { - "@valkey/valkey-glide-darwin-arm64": "2.1.0", - "@valkey/valkey-glide-darwin-x64": "2.1.0", - "@valkey/valkey-glide-linux-arm64-gnu": "2.1.0", - "@valkey/valkey-glide-linux-arm64-musl": "2.1.0", - "@valkey/valkey-glide-linux-x64-gnu": "2.1.0", - "@valkey/valkey-glide-linux-x64-musl": "2.1.0" + "@valkey/valkey-glide-darwin-arm64": "2.1.1", + "@valkey/valkey-glide-darwin-x64": "2.1.1", + "@valkey/valkey-glide-linux-arm64-gnu": "2.1.1", + "@valkey/valkey-glide-linux-arm64-musl": "2.1.1", + "@valkey/valkey-glide-linux-x64-gnu": "2.1.1", + "@valkey/valkey-glide-linux-x64-musl": "2.1.1" } }, "layers": { @@ -5161,9 +5161,9 @@ } }, "node_modules/@valkey/valkey-glide-darwin-arm64": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-darwin-arm64/-/valkey-glide-darwin-arm64-2.1.0.tgz", - "integrity": "sha512-2tey4RLhnZcna0ny0KfON8jhPb+i8D6cSN84AQEzX/YnXjn+c4mia0g625xnf0qYc8Qhb/v4QwehDIziOuy+dA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-darwin-arm64/-/valkey-glide-darwin-arm64-2.1.1.tgz", + "integrity": "sha512-a6W0PsIes8xSK41V34cZgSu8jmUhqVCZkbpThlm7ysVapL2mzB4qrJXjK4rlYk5TT47Xv7VCynTzFI1Esfehxg==", "cpu": [ "arm64" ], @@ -5175,9 +5175,9 @@ ] }, "node_modules/@valkey/valkey-glide-darwin-x64": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-darwin-x64/-/valkey-glide-darwin-x64-2.1.0.tgz", - "integrity": "sha512-DmSJNZKYeAE9O/ety1Gs2hx12Ay5YJrJ2Ryr77ZytuNSYP3G9XRTMTEHfqStoid3B0xRA30rYtaksIDDeJMkow==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-darwin-x64/-/valkey-glide-darwin-x64-2.1.1.tgz", + "integrity": "sha512-GiiPsN5SPbCu5c1Jbv6dHuA85R1Mzhj/LwjvM/RZ/zqVT+VESuYDEXw0yPj0ap0C4uq91Seb6pqlIvGQ3z3u1A==", "cpu": [ "x64" ], @@ -5215,9 +5215,9 @@ } }, "node_modules/@valkey/valkey-glide-linux-arm64-gnu": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-linux-arm64-gnu/-/valkey-glide-linux-arm64-gnu-2.1.0.tgz", - "integrity": "sha512-3nl43vPgZiswxtKglCSV9RXF03EU0Pe2d5+pU1hLh9w8MzvjgYWXwdLNzwSdVqm5DXHm06u4UhpXIVYrH8MW5A==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-linux-arm64-gnu/-/valkey-glide-linux-arm64-gnu-2.1.1.tgz", + "integrity": "sha512-yDDv3CeDXbLjB6+CtYZ+AyE9i5ABCp+eHaXFrqpWtjAw20o5RQokcK1Q22MiB/Q0Py6QQVd0opfISDsExQ6hKw==", "cpu": [ "arm64" ], @@ -5229,9 +5229,9 @@ ] }, "node_modules/@valkey/valkey-glide-linux-arm64-musl": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-linux-arm64-musl/-/valkey-glide-linux-arm64-musl-2.1.0.tgz", - "integrity": "sha512-v7T3XLl8U+U6z+0Ys1vLmvOXWZ/ykHYQ98XgyxT9Th7WGx8K4gA+veh+7GyTDMtQ7d5kwUV+AKLRTywh7xPxEQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-linux-arm64-musl/-/valkey-glide-linux-arm64-musl-2.1.1.tgz", + "integrity": "sha512-7YWJbjJrag9xA2YIpnnXh7t/44e0dAhOBM9s9gHmCzE10/eWC7P8H4oSEQCY42Qci974I4PQJA/pJTz3JjNdbw==", "cpu": [ "arm64" ], @@ -5351,9 +5351,9 @@ } }, "node_modules/@valkey/valkey-glide-linux-x64-gnu": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-linux-x64-gnu/-/valkey-glide-linux-x64-gnu-2.1.0.tgz", - "integrity": "sha512-rTjyQeu6EdIxHq/gurUWJAFfAimxqpxVnYJ+E8d4yfdswZQyFvDkAUNSusgq3b3v5FZAVff4ij7UX1eXosL45Q==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-linux-x64-gnu/-/valkey-glide-linux-x64-gnu-2.1.1.tgz", + "integrity": "sha512-zuebTeAEvNuba6r8YlTJx0tBc7ugGwrBURtdTvdz9eknbCk89O9tfu98QFPI4cN/w9/qdO2C+6eeXrYqwloRxA==", "cpu": [ "x64" ], @@ -5365,9 +5365,9 @@ ] }, "node_modules/@valkey/valkey-glide-linux-x64-musl": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-linux-x64-musl/-/valkey-glide-linux-x64-musl-2.1.0.tgz", - "integrity": "sha512-5NNTR6kSQd2MvVYILj8pR/1yfyRQixhE+ir9mpzSRbsaGvLGZCMASmlMhrJpC0kwR3yTSy5J+x5PTJTmnKULpg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-linux-x64-musl/-/valkey-glide-linux-x64-musl-2.1.1.tgz", + "integrity": "sha512-o2hl0UpyuOX3GwPxT+cUdiGFeMxDD6SpbrlIQb2YR70Pxn5i7oDNxLnMKMsFr4ZDn9FtcnX4H3rDD93jhZS5wg==", "cpu": [ "x64" ], @@ -7131,9 +7131,9 @@ } }, "node_modules/detect-libc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.0.tgz", - "integrity": "sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "license": "Apache-2.0", "optional": true, "peer": true, From 5cb6797b66c18ddf8a266fce50b8c1dab4c25b29 Mon Sep 17 00:00:00 2001 From: Aleksandr Karo Date: Thu, 9 Oct 2025 22:19:27 +0100 Subject: [PATCH 225/255] fix(logger): correct persistentLogAttributes warning behavior (#4627) --- packages/logger/src/Logger.ts | 7 ++++++- packages/logger/tests/unit/workingWithkeys.test.ts | 9 +++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/logger/src/Logger.ts b/packages/logger/src/Logger.ts index bb46a499e6..9c409d6d26 100644 --- a/packages/logger/src/Logger.ts +++ b/packages/logger/src/Logger.ts @@ -1291,7 +1291,12 @@ class Logger extends Utility implements LoggerInterface { correlationIdSearchFn, } = options; - if (persistentLogAttributes && persistentKeys) { + if ( + persistentLogAttributes && + Object.keys(persistentLogAttributes).length > 0 && + persistentKeys && + Object.keys(persistentKeys).length > 0 + ) { this.warn( 'Both persistentLogAttributes and persistentKeys options were provided. Using persistentKeys as persistentLogAttributes is deprecated and will be removed in future releases' ); diff --git a/packages/logger/tests/unit/workingWithkeys.test.ts b/packages/logger/tests/unit/workingWithkeys.test.ts index f921ef9b12..64c7b60c67 100644 --- a/packages/logger/tests/unit/workingWithkeys.test.ts +++ b/packages/logger/tests/unit/workingWithkeys.test.ts @@ -622,6 +622,15 @@ describe('Working with keys', () => { ); }); + it('should pass persistentKeys to child with no warning', () => { + // Prepare + const logger = new Logger(); + logger.createChild({ persistentKeys: { abc: 'xyz' } }); + + // Assess + expect(console.warn).toHaveBeenCalledTimes(0); + }); + it("doesn't overwrite standard keys when appending keys", () => { // Prepare const logger = new Logger(); From 742bbd1c7f29c83d47a98608dbef07b3c71a353b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Oct 2025 14:41:25 +0100 Subject: [PATCH 226/255] chore(deps): bump @types/node from 24.7.0 to 24.7.1 (#4628) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/app/package.json | 4 ++-- package-lock.json | 12 ++++++------ package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index cd626f1dea..6bde545779 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -30,7 +30,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.155", - "@types/node": "24.7.0", + "@types/node": "24.7.1", "aws-cdk-lib": "^2.219.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -49,7 +49,7 @@ "@aws-sdk/lib-dynamodb": "^3.902.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.155", - "@types/node": "24.7.0", + "@types/node": "24.7.1", "aws-cdk": "^2.1029.4", "constructs": "^10.4.2", "esbuild": "^0.25.10", diff --git a/package-lock.json b/package-lock.json index 6868c3a2c2..7c8db23f93 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.5", "@types/aws-lambda": "^8.10.155", - "@types/node": "^24.7.0", + "@types/node": "^24.7.1", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.2.3", @@ -60,7 +60,7 @@ "@aws-sdk/lib-dynamodb": "^3.902.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.155", - "@types/node": "24.7.0", + "@types/node": "24.7.1", "aws-cdk": "^2.1029.4", "constructs": "^10.4.2", "esbuild": "^0.25.10", @@ -68,7 +68,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.155", - "@types/node": "24.7.0", + "@types/node": "24.7.1", "aws-cdk-lib": "^2.219.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -5096,9 +5096,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.7.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.0.tgz", - "integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.1.tgz", + "integrity": "sha512-CmyhGZanP88uuC5GpWU9q+fI61j2SkhO3UGMUdfYRE6Bcy0ccyzn1Rqj9YAB/ZY4kOXmNf0ocah5GtphmLMP6Q==", "license": "MIT", "dependencies": { "undici-types": "~7.14.0" diff --git a/package.json b/package.json index 3165ce7276..a76ef00f22 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.5", "@types/aws-lambda": "^8.10.155", - "@types/node": "^24.7.0", + "@types/node": "^24.7.1", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.2.3", From c521edd064b0ae352696ffababbc7a0b0db758bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Oct 2025 15:12:53 +0100 Subject: [PATCH 227/255] chore(deps): bump github/codeql-action from 3.30.6 to 4.30.7 (#4623) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- .github/workflows/ossf_scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ossf_scorecard.yml b/.github/workflows/ossf_scorecard.yml index 48807df55f..14c79b817b 100644 --- a/.github/workflows/ossf_scorecard.yml +++ b/.github/workflows/ossf_scorecard.yml @@ -43,6 +43,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@64d10c13136e1c5bce3e5fbde8d4906eeaafc885 # v3.29.5 + uses: github/codeql-action/upload-sarif@e296a935590eb16afc0c0108289f68c87e2a89a5 # v4.30.7 with: sarif_file: results.sarif From ada48bbc20b61454586bbd853ee330800b6000d2 Mon Sep 17 00:00:00 2001 From: Asifur Rahman Date: Mon, 13 Oct 2025 15:26:55 +0600 Subject: [PATCH 228/255] feat(event-handler): Add `includeRouter` support to AppSync GraphQL resolver (#4457) Co-authored-by: Stefano Vozza --- .../features/event-handler/appsync-graphql.md | 30 ++ .../appsync-graphql/postRouter.ts | 18 + .../appsync-graphql/splitRouter.ts | 11 + .../appsync-graphql/userRouter.ts | 9 + .../appsync-graphql/AppSyncGraphQLResolver.ts | 44 +++ .../ExceptionHandlerRegistry.ts | 70 +++- .../appsync-graphql/RouteHandlerRegistry.ts | 32 +- .../src/appsync-graphql/Router.ts | 14 + .../src/appsync-graphql/index.ts | 1 + .../AppSyncGraphQLResolver.test.ts | 360 ++++++++++++++++++ 10 files changed, 565 insertions(+), 24 deletions(-) create mode 100644 examples/snippets/event-handler/appsync-graphql/postRouter.ts create mode 100644 examples/snippets/event-handler/appsync-graphql/splitRouter.ts create mode 100644 examples/snippets/event-handler/appsync-graphql/userRouter.ts diff --git a/docs/features/event-handler/appsync-graphql.md b/docs/features/event-handler/appsync-graphql.md index 9112da2c01..fc97428b55 100644 --- a/docs/features/event-handler/appsync-graphql.md +++ b/docs/features/event-handler/appsync-graphql.md @@ -114,6 +114,36 @@ Here's a table with their related scalar as a quick reference: ## Advanced +### Split operations with Router + +As you grow the number of related GraphQL operations a given Lambda function should handle, it is natural to split them into separate files to ease maintenance - That's when the `Router` feature comes handy. + +Let's assume you have `app.ts` as your Lambda function entrypoint and routes in `postRouter.ts` and `userRouter.ts`. This is how you'd use the `Router` feature. + +=== "postRouter.ts" + + We import **Router** instead of **AppSyncGraphQLResolver**; syntax wise is exactly the same. + + ```typescript hl_lines="1 3" + --8<-- "examples/snippets/event-handler/appsync-graphql/postRouter.ts" + ``` + +=== "userRouter.ts" + + We import **Router** instead of **AppSyncGraphQLResolver**; syntax wise is exactly the same. + + ```typescript hl_lines="1 3" + --8<-- "examples/snippets/event-handler/appsync-graphql/userRouter.ts" + ``` + +=== "app.ts" + + We use `includeRouter` method and include all operations registered in the router instances. + + ```typescript hl_lines="3-4 8" + --8<-- "examples/snippets/event-handler/appsync-graphql/splitRouter.ts" + ``` + ### Nested mappings !!! note diff --git a/examples/snippets/event-handler/appsync-graphql/postRouter.ts b/examples/snippets/event-handler/appsync-graphql/postRouter.ts new file mode 100644 index 0000000000..34bebb4e4c --- /dev/null +++ b/examples/snippets/event-handler/appsync-graphql/postRouter.ts @@ -0,0 +1,18 @@ +import { Router } from '@aws-lambda-powertools/event-handler/appsync-graphql'; + +const postRouter = new Router(); + +postRouter.onQuery('getPosts', async () => { + return [{ id: 1, title: 'First post', content: 'Hello world!' }]; +}); + +postRouter.onMutation('createPost', async ({ title, content }) => { + return { + id: Date.now(), + title, + content, + createdAt: new Date().toISOString(), + }; +}); + +export { postRouter }; diff --git a/examples/snippets/event-handler/appsync-graphql/splitRouter.ts b/examples/snippets/event-handler/appsync-graphql/splitRouter.ts new file mode 100644 index 0000000000..2f4948a9d3 --- /dev/null +++ b/examples/snippets/event-handler/appsync-graphql/splitRouter.ts @@ -0,0 +1,11 @@ +import { AppSyncGraphQLResolver } from '@aws-lambda-powertools/event-handler/appsync-graphql'; +import type { Context } from 'aws-lambda'; +import { postRouter } from './postRouter'; +import { userRouter } from './userRouter'; + +const app = new AppSyncGraphQLResolver(); + +app.includeRouter([postRouter, userRouter]); + +export const handler = async (event: unknown, context: Context) => + app.resolve(event, context); diff --git a/examples/snippets/event-handler/appsync-graphql/userRouter.ts b/examples/snippets/event-handler/appsync-graphql/userRouter.ts new file mode 100644 index 0000000000..51e35b82d4 --- /dev/null +++ b/examples/snippets/event-handler/appsync-graphql/userRouter.ts @@ -0,0 +1,9 @@ +import { Router } from '@aws-lambda-powertools/event-handler/appsync-graphql'; + +const userRouter = new Router(); + +userRouter.onQuery('getUsers', async () => { + return [{ id: 1, name: 'John Doe', email: 'john@example.com' }]; +}); + +export { userRouter }; diff --git a/packages/event-handler/src/appsync-graphql/AppSyncGraphQLResolver.ts b/packages/event-handler/src/appsync-graphql/AppSyncGraphQLResolver.ts index 6aede4c554..cb3c9a616c 100644 --- a/packages/event-handler/src/appsync-graphql/AppSyncGraphQLResolver.ts +++ b/packages/event-handler/src/appsync-graphql/AppSyncGraphQLResolver.ts @@ -180,6 +180,50 @@ class AppSyncGraphQLResolver extends Router { ); } + /** + * Includes one or more routers and merges their registries into the current resolver. + * + * This method allows you to compose multiple routers by merging their + * route registries into the current AppSync GraphQL resolver instance. + * All resolver handlers, batch resolver handlers, and exception handlers + * from the included routers will be available in the current resolver. + * + * **Note:** When multiple routers register handlers for the same type and field combination + * (e.g., both `userRouter` and `postRouter` define `Query.getPost`), the handler from the + * last included router takes precedence and will override earlier registrations. + * This behavior also applies to exception handlers registered for the same error class. + * A warning is logged to help you identify potential conflicts when handlers are overridden. + * + * @example + * ```ts + * import { AppSyncGraphQLResolver, Router } from '@aws-lambda-powertools/event-handler/appsync-graphql'; + * + * const postRouter = new Router(); + * postRouter.onQuery('getPosts', async () => [{ id: 1, title: 'Post 1' }]); + * + * const userRouter = new Router(); + * userRouter.onQuery('getUsers', async () => [{ id: 1, name: 'John Doe' }]); + * + * const app = new AppSyncGraphQLResolver(); + * + * app.includeRouter([userRouter, postRouter]); + * + * export const handler = async (event, context) => + * app.resolve(event, context); + * ``` + * + * @param router - The router instance or array of router instances whose registries will be merged + */ + public includeRouter(router: Router | Router[]): void { + const routers = Array.isArray(router) ? router : [router]; + + this.logger.debug('Including router'); + for (const routerToBeIncluded of routers) { + this.mergeRegistriesFrom(routerToBeIncluded); + } + this.logger.debug('Router included successfully'); + } + /** * Executes the provided asynchronous function with error handling. * If the function throws an error, it delegates error processing to `#handleError` diff --git a/packages/event-handler/src/appsync-graphql/ExceptionHandlerRegistry.ts b/packages/event-handler/src/appsync-graphql/ExceptionHandlerRegistry.ts index 261c426b8d..e247f910ca 100644 --- a/packages/event-handler/src/appsync-graphql/ExceptionHandlerRegistry.ts +++ b/packages/event-handler/src/appsync-graphql/ExceptionHandlerRegistry.ts @@ -37,7 +37,44 @@ class ExceptionHandlerRegistry { const errors = Array.isArray(error) ? error : [error]; for (const err of errors) { - this.registerErrorHandler(err, handler); + this.#registerErrorHandler(err, handler); + } + } + + /** + * Resolves and returns the appropriate exception handler for a given error instance. + * + * This method attempts to find a registered exception handler based on the error class name. + * If a matching handler is found, it is returned; otherwise, `null` is returned. + * + * @param error - The error instance for which to resolve an exception handler. + */ + public resolve(error: Error): ExceptionHandler | null { + const errorName = error.name; + this.#logger.debug(`Looking for exception handler for error: ${errorName}`); + + const handlerOptions = this.handlers.get(errorName); + if (handlerOptions) { + this.#logger.debug(`Found exact match for error class: ${errorName}`); + return handlerOptions.handler; + } + + this.#logger.debug(`No exception handler found for error: ${errorName}`); + return null; + } + + /** + * Merges handlers from another ExceptionHandlerRegistry into this registry. + * Existing handlers for the same error class will be replaced and a warning will be logged. + * + * @param otherRegistry - The registry to merge handlers from. + */ + public merge(otherRegistry: ExceptionHandlerRegistry): void { + for (const [errorName, handlerOptions] of otherRegistry.handlers) { + if (this.handlers.has(errorName)) { + this.#warnHandlerOverriding(errorName); + } + this.handlers.set(errorName, handlerOptions); } } @@ -47,7 +84,7 @@ class ExceptionHandlerRegistry { * @param errorClass - The error class to register the handler for. * @param handler - The exception handler function. */ - private registerErrorHandler( + #registerErrorHandler( errorClass: ErrorClass, handler: ExceptionHandler ): void { @@ -56,9 +93,7 @@ class ExceptionHandlerRegistry { this.#logger.debug(`Adding exception handler for error class ${errorName}`); if (this.handlers.has(errorName)) { - this.#logger.warn( - `An exception handler for error class '${errorName}' is already registered. The previous handler will be replaced.` - ); + this.#warnHandlerOverriding(errorName); } this.handlers.set(errorName, { @@ -68,25 +103,18 @@ class ExceptionHandlerRegistry { } /** - * Resolves and returns the appropriate exception handler for a given error instance. + * Logs a warning message when an exception handler is being overridden. * - * This method attempts to find a registered exception handler based on the error class name. - * If a matching handler is found, it is returned; otherwise, `null` is returned. + * This method is called internally when registering a new exception handler + * for an error class that already has a handler registered. It warns the user + * that the previous handler will be replaced with the new one. * - * @param error - The error instance for which to resolve an exception handler. + * @param errorName - The name of the error class for which a handler is being overridden */ - public resolve(error: Error): ExceptionHandler | null { - const errorName = error.name; - this.#logger.debug(`Looking for exception handler for error: ${errorName}`); - - const handlerOptions = this.handlers.get(errorName); - if (handlerOptions) { - this.#logger.debug(`Found exact match for error class: ${errorName}`); - return handlerOptions.handler; - } - - this.#logger.debug(`No exception handler found for error: ${errorName}`); - return null; + #warnHandlerOverriding(errorName: string): void { + this.#logger.warn( + `An exception handler for error class '${errorName}' is already registered. The previous handler will be replaced.` + ); } } diff --git a/packages/event-handler/src/appsync-graphql/RouteHandlerRegistry.ts b/packages/event-handler/src/appsync-graphql/RouteHandlerRegistry.ts index ac6c2ff2aa..14614dbcef 100644 --- a/packages/event-handler/src/appsync-graphql/RouteHandlerRegistry.ts +++ b/packages/event-handler/src/appsync-graphql/RouteHandlerRegistry.ts @@ -50,9 +50,7 @@ class RouteHandlerRegistry { this.#logger.debug(`Adding resolver for field ${typeName}.${fieldName}`); const cacheKey = this.#makeKey(typeName, fieldName); if (this.resolvers.has(cacheKey)) { - this.#logger.warn( - `A resolver for field '${fieldName}' is already registered for '${typeName}'. The previous resolver will be replaced.` - ); + this.#warnResolverOverriding(fieldName, typeName); } this.resolvers.set(cacheKey, { fieldName, @@ -81,6 +79,21 @@ class RouteHandlerRegistry { return this.resolvers.get(this.#makeKey(typeName, fieldName)); } + /** + * Merges handlers from another RouteHandlerRegistry into this registry. + * Existing handlers with the same key will be replaced and a warning will be logged. + * + * @param otherRegistry - The registry to merge handlers from. + */ + public merge(otherRegistry: RouteHandlerRegistry): void { + for (const [key, handler] of otherRegistry.resolvers) { + if (this.resolvers.has(key)) { + this.#warnResolverOverriding(handler.fieldName, handler.typeName); + } + this.resolvers.set(key, handler); + } + } + /** * Generates a unique key by combining the provided GraphQL type name and field name. * @@ -90,6 +103,19 @@ class RouteHandlerRegistry { #makeKey(typeName: string, fieldName: string): string { return `${typeName}.${fieldName}`; } + + /** + * Logs a warning message indicating that a resolver for the specified field and type + * is already registered and will be replaced by a new resolver. + * + * @param fieldName - The name of the field for which the resolver is being overridden. + * @param typeName - The name of the type associated with the field. + */ + #warnResolverOverriding(fieldName: string, typeName: string): void { + this.#logger.warn( + `A resolver for field '${fieldName}' is already registered for '${typeName}'. The previous resolver will be replaced.` + ); + } } export { RouteHandlerRegistry }; diff --git a/packages/event-handler/src/appsync-graphql/Router.ts b/packages/event-handler/src/appsync-graphql/Router.ts index 29745e2663..b84a268fba 100644 --- a/packages/event-handler/src/appsync-graphql/Router.ts +++ b/packages/event-handler/src/appsync-graphql/Router.ts @@ -64,6 +64,20 @@ class Router { this.isDev = isDevMode(); } + /** + * Merges resolver registries from another router into this router. + * + * This method combines the resolver registry, batch resolver registry, and exception handler registry + * from the provided router with the current router's registries. + * + * @param router - The source router whose registries will be merged into this router + */ + protected mergeRegistriesFrom(router: Router): void { + this.resolverRegistry.merge(router.resolverRegistry); + this.batchResolverRegistry.merge(router.batchResolverRegistry); + this.exceptionHandlerRegistry.merge(router.exceptionHandlerRegistry); + } + /** * Register a resolver function for any GraphQL event. * diff --git a/packages/event-handler/src/appsync-graphql/index.ts b/packages/event-handler/src/appsync-graphql/index.ts index bffc35bad1..9e38af73d6 100644 --- a/packages/event-handler/src/appsync-graphql/index.ts +++ b/packages/event-handler/src/appsync-graphql/index.ts @@ -3,6 +3,7 @@ export { InvalidBatchResponseException, ResolverNotFoundException, } from './errors.js'; +export { Router } from './Router.js'; export { awsDate, awsDateTime, diff --git a/packages/event-handler/tests/unit/appsync-graphql/AppSyncGraphQLResolver.test.ts b/packages/event-handler/tests/unit/appsync-graphql/AppSyncGraphQLResolver.test.ts index 1100a41005..15b363a22a 100644 --- a/packages/event-handler/tests/unit/appsync-graphql/AppSyncGraphQLResolver.test.ts +++ b/packages/event-handler/tests/unit/appsync-graphql/AppSyncGraphQLResolver.test.ts @@ -5,7 +5,9 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import { AppSyncGraphQLResolver } from '../../../src/appsync-graphql/AppSyncGraphQLResolver.js'; import { InvalidBatchResponseException, + makeId, ResolverNotFoundException, + Router, } from '../../../src/appsync-graphql/index.js'; import type { ErrorClass } from '../../../src/types/appsync-graphql.js'; import { onGraphqlEventFactory } from '../../helpers/factories.js'; @@ -1327,4 +1329,362 @@ describe('Class: AppSyncGraphQLResolver', () => { }); // #endregion Exception handling + + // #region includeRouter + + it('handles multiple routers and resolves their handlers correctly', async () => { + // Prepare + const userRouter = new Router(); + userRouter.onQuery<{ id: string }>('getUser', async ({ id }) => ({ + id, + name: 'John Doe', + })); + + userRouter.onMutation<{ name: string; email: string }>( + 'createUser', + async ({ name, email }) => ({ + id: makeId(), + name, + email, + }) + ); + + const todoRouter = new Router(); + todoRouter.onQuery<{ id: string }>('getTodo', async ({ id }) => ({ + id, + title: 'Sample Todo', + completed: false, + })); + + const app = new AppSyncGraphQLResolver({ logger: console }); + app.includeRouter([userRouter, todoRouter]); + + // Act + const getUserResult = await app.resolve( + onGraphqlEventFactory('getUser', 'Query', { id: '123' }), + context + ); + const createUserResult = await app.resolve( + onGraphqlEventFactory('createUser', 'Mutation', { + name: 'Jane Doe', + email: 'jane.doe@example.com', + }), + context + ); + const todoResult = await app.resolve( + onGraphqlEventFactory('getTodo', 'Query', { id: '456' }), + context + ); + + // Assess + expect(getUserResult).toEqual({ id: '123', name: 'John Doe' }); + expect(createUserResult).toEqual({ + id: expect.any(String), + name: 'Jane Doe', + email: 'jane.doe@example.com', + }); + expect(todoResult).toEqual({ + id: '456', + title: 'Sample Todo', + completed: false, + }); + }); + + it('handles multiple routers with batch resolvers and resolves their handlers correctly', async () => { + // Prepare + const postRouter = new Router(); + postRouter.onBatchQuery('getPosts', async (events) => + events.map((event) => ({ + id: event.arguments.id, + title: `Post ${event.arguments.id}`, + })) + ); + + const todoRouter = new Router(); + todoRouter.onBatchQuery('getTodos', async (events) => + events.map((event) => ({ + id: event.arguments.id, + title: `Todo ${event.arguments.id}`, + })) + ); + + const app = new AppSyncGraphQLResolver({ logger: console }); + app.includeRouter(postRouter); + app.includeRouter(todoRouter); + + // Act + const postResults = await app.resolve( + [ + onGraphqlEventFactory('getPosts', 'Query', { id: '1' }), + onGraphqlEventFactory('getPosts', 'Query', { id: '2' }), + ], + context + ); + const todoResults = await app.resolve( + [ + onGraphqlEventFactory('getTodos', 'Query', { id: '1' }), + onGraphqlEventFactory('getTodos', 'Query', { id: '2' }), + ], + context + ); + + // Assess + expect(postResults).toEqual([ + { id: '1', title: 'Post 1' }, + { id: '2', title: 'Post 2' }, + ]); + expect(todoResults).toEqual([ + { id: '1', title: 'Todo 1' }, + { id: '2', title: 'Todo 2' }, + ]); + }); + + it('handles multiple routers with exception handlers', async () => { + // Prepare + const firstRouter = new Router(); + firstRouter.exceptionHandler(ValidationError, async (error) => ({ + error: `Handled: ${error.message}`, + type: 'validation', + })); + firstRouter.resolver( + () => { + throw new ValidationError('Test validation error'); + }, + { fieldName: 'firstHandler' } + ); + + const secondRouter = new Router(); + secondRouter.exceptionHandler(EvalError, async (error) => ({ + error: `Handled: ${error.message}`, + type: 'evaluation', + })); + secondRouter.resolver( + () => { + throw new EvalError('Test evaluation error'); + }, + { fieldName: 'secondHandler' } + ); + + const app = new AppSyncGraphQLResolver({ logger: console }); + app.includeRouter(firstRouter); + app.includeRouter(secondRouter); + + // Act + const firstResult = await app.resolve( + onGraphqlEventFactory('firstHandler', 'Query', { shouldThrow: true }), + context + ); + const secondResult = await app.resolve( + onGraphqlEventFactory('secondHandler', 'Query', { shouldThrow: true }), + context + ); + + // Assess + expect(firstResult).toEqual({ + error: 'Handled: Test validation error', + type: 'validation', + }); + expect(secondResult).toEqual({ + error: 'Handled: Test evaluation error', + type: 'evaluation', + }); + }); + + it('handles conflicts when including multiple routers with same resolver', async () => { + // Prepare + const firstRouter = new Router(); + firstRouter.onQuery('getTest', () => ({ + source: 'first', + })); + + const secondRouter = new Router(); + secondRouter.onQuery('getTest', () => ({ + source: 'second', + })); + + const app = new AppSyncGraphQLResolver({ logger: console }); + app.includeRouter(firstRouter); + app.includeRouter(secondRouter); + + // Act + const result = await app.resolve( + onGraphqlEventFactory('getTest', 'Query', {}), + context + ); + + // Assess + expect(result).toEqual({ source: 'second' }); + expect(console.warn).toHaveBeenCalledWith( + "A resolver for field 'getTest' is already registered for 'Query'. The previous resolver will be replaced." + ); + }); + + it('handles conflicts when including multiple routers with same exception handler', async () => { + // Prepare + const firstRouter = new Router(); + firstRouter.exceptionHandler(ValidationError, async (error) => ({ + source: 'first', + message: error.message, + type: 'first_validation', + })); + firstRouter.onQuery('testError', () => { + throw new ValidationError('Test validation error'); + }); + + const secondRouter = new Router(); + secondRouter.exceptionHandler(ValidationError, async (error) => ({ + source: 'second', + message: error.message, + type: 'second_validation', + })); + secondRouter.onQuery('testError', () => { + throw new ValidationError('Test validation error'); + }); + + const app = new AppSyncGraphQLResolver({ logger: console }); + app.includeRouter(firstRouter); + app.includeRouter(secondRouter); + + // Act + const result = await app.resolve( + onGraphqlEventFactory('testError', 'Query', {}), + context + ); + + // Assess + expect(result).toEqual({ + source: 'second', + message: 'Test validation error', + type: 'second_validation', + }); + expect(console.warn).toHaveBeenCalledWith( + "An exception handler for error class 'ValidationError' is already registered. The previous handler will be replaced." + ); + }); + + it('works as a method decorator for `includeRouter`', async () => { + // Prepare + const app = new AppSyncGraphQLResolver(); + + const userRouter = new Router(); + const todoRouter = new Router(); + + class Lambda { + public scope = 'scoped'; + + @userRouter.onQuery('getUser') + getUserById({ id }: { id: string }) { + if (id.length === 0) + throw new ValidationError('User ID cannot be empty'); + return { id, name: 'John Doe', scope: this.scope }; + } + + @userRouter.onMutation('createUser') + createUser({ name, email }: { name: string; email: string }) { + return { id: makeId(), name, email, scope: this.scope }; + } + + @userRouter.exceptionHandler(ValidationError) + handleValidationError(error: ValidationError) { + return { + message: 'UserRouter validation error', + details: error.message, + type: 'user_validation_error', + scope: this.scope, + }; + } + + @todoRouter.onQuery('getTodo') + getTodoById({ id }: { id: string }) { + if (id === 'eval-error') { + throw new EvalError('Todo evaluation error'); + } + return { + id, + title: 'Sample Todo', + completed: false, + scope: this.scope, + }; + } + + @todoRouter.exceptionHandler(EvalError) + handleEvalError(error: EvalError) { + return { + message: 'TodoRouter evaluation error', + details: error.message, + type: 'todo_evaluation_error', + scope: this.scope, + }; + } + handler(event: unknown, context: Context) { + app.includeRouter(userRouter); + app.includeRouter(todoRouter); + return app.resolve(event, context, { + scope: this, + }); + } + } + + const lambda = new Lambda(); + const handler = lambda.handler.bind(lambda); + + // Act + const getUserResult = await handler( + onGraphqlEventFactory('getUser', 'Query', { id: '123' }), + context + ); + const createUserResult = await handler( + onGraphqlEventFactory('createUser', 'Mutation', { + name: 'Jane Doe', + email: 'jane.doe@example.com', + }), + context + ); + const userValidationError = await handler( + onGraphqlEventFactory('getUser', 'Query', { id: '' }), + context + ); + + const getTodoResult = await handler( + onGraphqlEventFactory('getTodo', 'Query', { id: '456' }), + context + ); + const todoEvalError = await handler( + onGraphqlEventFactory('getTodo', 'Query', { id: 'eval-error' }), + context + ); + + // Assess + expect(getUserResult).toEqual({ + id: '123', + name: 'John Doe', + scope: 'scoped', + }); + expect(createUserResult).toEqual({ + id: expect.any(String), + name: 'Jane Doe', + email: 'jane.doe@example.com', + scope: 'scoped', + }); + expect(getTodoResult).toEqual({ + id: '456', + title: 'Sample Todo', + completed: false, + scope: 'scoped', + }); + expect(userValidationError).toEqual({ + message: 'UserRouter validation error', + details: 'User ID cannot be empty', + type: 'user_validation_error', + scope: 'scoped', + }); + expect(todoEvalError).toEqual({ + details: 'Todo evaluation error', + message: 'TodoRouter evaluation error', + type: 'todo_evaluation_error', + scope: 'scoped', + }); + }); + + // #endregion includeRouters }); From f46ae7c4b73a428b3a9aeb7e8858adede73637ed Mon Sep 17 00:00:00 2001 From: Stefano Vozza Date: Mon, 13 Oct 2025 10:50:44 +0100 Subject: [PATCH 229/255] fix(event-handler): allow http handlers to return duplex streams (#4629) --- packages/event-handler/src/rest/utils.ts | 4 +-- .../tests/unit/rest/Router/streaming.test.ts | 27 ++++++++++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/packages/event-handler/src/rest/utils.ts b/packages/event-handler/src/rest/utils.ts index caf4ad82f8..e040a3759a 100644 --- a/packages/event-handler/src/rest/utils.ts +++ b/packages/event-handler/src/rest/utils.ts @@ -1,4 +1,4 @@ -import { Readable, Writable } from 'node:stream'; +import { Duplex, Readable, Writable } from 'node:stream'; import { isRecord, isRegExp, @@ -112,7 +112,7 @@ export const isNodeReadableStream = (value: unknown): value is Readable => { return ( value != null && typeof value === 'object' && - value instanceof Readable && + (value instanceof Readable || value instanceof Duplex) && 'readable' in value && 'read' in value && typeof value.read === 'function' diff --git a/packages/event-handler/tests/unit/rest/Router/streaming.test.ts b/packages/event-handler/tests/unit/rest/Router/streaming.test.ts index 16a172b4df..46f29e834c 100644 --- a/packages/event-handler/tests/unit/rest/Router/streaming.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/streaming.test.ts @@ -1,4 +1,4 @@ -import { Readable } from 'node:stream'; +import { Duplex, PassThrough, Readable } from 'node:stream'; import context from '@aws-lambda-powertools/testing-utils/context'; import { describe, expect, it, vi } from 'vitest'; import { UnauthorizedError } from '../../../../src/rest/errors.js'; @@ -306,4 +306,29 @@ describe('Class: Router - Streaming', () => { app.resolveStream(invalidEvent, context, { responseStream }) ).rejects.toThrow(); }); + + it('handles duplex stream body', async () => { + // Prepare + const app = new Router(); + const passThrough = new PassThrough(); + passThrough.write(Buffer.from('{"message":"duplex stream body"}')); + passThrough.end(); + + app.get('/test', () => ({ + statusCode: 200, + body: Duplex.from(passThrough), + })); + + const responseStream = new MockResponseStream(); + + // Act + await app.resolveStream(createTestEvent('/test', 'GET'), context, { + responseStream, + }); + + // Assess + const { prelude, body } = parseStreamOutput(responseStream.chunks); + expect(prelude.statusCode).toBe(200); + expect(JSON.parse(body)).toEqual({ message: 'duplex stream body' }); + }); }); From adc8f60bf3ffedbbb502aaf90b44bec9bea310dd Mon Sep 17 00:00:00 2001 From: Swopnil Dangol Date: Mon, 13 Oct 2025 12:14:38 +0100 Subject: [PATCH 230/255] fix(parser): updated the SQSRecordSchema to make the md5OfMessageAttributes nullable (#4632) --- packages/parser/src/schemas/sqs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/parser/src/schemas/sqs.ts b/packages/parser/src/schemas/sqs.ts index d601d56efd..dc335ac95c 100644 --- a/packages/parser/src/schemas/sqs.ts +++ b/packages/parser/src/schemas/sqs.ts @@ -41,7 +41,7 @@ const SqsRecordSchema = z.object({ attributes: SqsAttributesSchema, messageAttributes: z.record(z.string(), SqsMsgAttributeSchema), md5OfBody: z.string(), - md5OfMessageAttributes: z.string().optional(), + md5OfMessageAttributes: z.string().optional().nullable(), eventSource: z.literal('aws:sqs'), eventSourceARN: z.string(), awsRegion: z.string(), From 827f45a5f2c1419c14f65712e6f8df3e45b02921 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 14:46:26 +0100 Subject: [PATCH 231/255] chore(deps): bump actions/dependency-review-action from 4.8.0 to 4.8.1 (#4635) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/dependency-review.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index 70fb3b9a3e..c3cc0624c4 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -19,4 +19,4 @@ jobs: - name: 'Checkout Repository' uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: 'Dependency Review' - uses: actions/dependency-review-action@56339e523c0409420f6c2c9a2f4292bbb3c07dd3 # v4.8.0 + uses: actions/dependency-review-action@40c09b7dc99638e5ddb0bfd91c1673effc064d8a # v4.8.1 From fbfc7b0cdcb54c667954783e95105fa2fc963ad8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 14:59:51 +0100 Subject: [PATCH 232/255] chore(deps-dev): bump @biomejs/biome from 2.2.5 to 2.2.6 (#4636) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- package-lock.json | 72 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7c8db23f93..de436b5507 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,7 @@ "packages/kafka" ], "devDependencies": { - "@biomejs/biome": "^2.2.5", + "@biomejs/biome": "^2.2.6", "@types/aws-lambda": "^8.10.155", "@types/node": "^24.7.1", "@vitest/coverage-v8": "^3.2.4", @@ -2939,9 +2939,9 @@ } }, "node_modules/@biomejs/biome": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.5.tgz", - "integrity": "sha512-zcIi+163Rc3HtyHbEO7CjeHq8DjQRs40HsGbW6vx2WI0tg8mYQOPouhvHSyEnCBAorfYNnKdR64/IxO7xQ5faw==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.6.tgz", + "integrity": "sha512-yKTCNGhek0rL5OEW1jbLeZX8LHaM8yk7+3JRGv08my+gkpmtb5dDE+54r2ZjZx0ediFEn1pYBOJSmOdDP9xtFw==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -2955,20 +2955,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.2.5", - "@biomejs/cli-darwin-x64": "2.2.5", - "@biomejs/cli-linux-arm64": "2.2.5", - "@biomejs/cli-linux-arm64-musl": "2.2.5", - "@biomejs/cli-linux-x64": "2.2.5", - "@biomejs/cli-linux-x64-musl": "2.2.5", - "@biomejs/cli-win32-arm64": "2.2.5", - "@biomejs/cli-win32-x64": "2.2.5" + "@biomejs/cli-darwin-arm64": "2.2.6", + "@biomejs/cli-darwin-x64": "2.2.6", + "@biomejs/cli-linux-arm64": "2.2.6", + "@biomejs/cli-linux-arm64-musl": "2.2.6", + "@biomejs/cli-linux-x64": "2.2.6", + "@biomejs/cli-linux-x64-musl": "2.2.6", + "@biomejs/cli-win32-arm64": "2.2.6", + "@biomejs/cli-win32-x64": "2.2.6" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.5.tgz", - "integrity": "sha512-MYT+nZ38wEIWVcL5xLyOhYQQ7nlWD0b/4mgATW2c8dvq7R4OQjt/XGXFkXrmtWmQofaIM14L7V8qIz/M+bx5QQ==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.6.tgz", + "integrity": "sha512-UZPmn3M45CjTYulgcrFJFZv7YmK3pTxTJDrFYlNElT2FNnkkX4fsxjExTSMeWKQYoZjvekpH5cvrYZZlWu3yfA==", "cpu": [ "arm64" ], @@ -2983,9 +2983,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.5.tgz", - "integrity": "sha512-FLIEl73fv0R7dI10EnEiZLw+IMz3mWLnF95ASDI0kbx6DDLJjWxE5JxxBfmG+udz1hIDd3fr5wsuP7nwuTRdAg==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.6.tgz", + "integrity": "sha512-HOUIquhHVgh/jvxyClpwlpl/oeMqntlteL89YqjuFDiZ091P0vhHccwz+8muu3nTyHWM5FQslt+4Jdcd67+xWQ==", "cpu": [ "x64" ], @@ -3000,9 +3000,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.5.tgz", - "integrity": "sha512-5DjiiDfHqGgR2MS9D+AZ8kOfrzTGqLKywn8hoXpXXlJXIECGQ32t+gt/uiS2XyGBM2XQhR6ztUvbjZWeccFMoQ==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.6.tgz", + "integrity": "sha512-BpGtuMJGN+o8pQjvYsUKZ+4JEErxdSmcRD/JG3mXoWc6zrcA7OkuyGFN1mDggO0Q1n7qXxo/PcupHk8gzijt5g==", "cpu": [ "arm64" ], @@ -3017,9 +3017,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.5.tgz", - "integrity": "sha512-5Ov2wgAFwqDvQiESnu7b9ufD1faRa+40uwrohgBopeY84El2TnBDoMNXx6iuQdreoFGjwW8vH6k68G21EpNERw==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.6.tgz", + "integrity": "sha512-TjCenQq3N6g1C+5UT3jE1bIiJb5MWQvulpUngTIpFsL4StVAUXucWD0SL9MCW89Tm6awWfeXBbZBAhJwjyFbRQ==", "cpu": [ "arm64" ], @@ -3034,9 +3034,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.5.tgz", - "integrity": "sha512-fq9meKm1AEXeAWan3uCg6XSP5ObA6F/Ovm89TwaMiy1DNIwdgxPkNwxlXJX8iM6oRbFysYeGnT0OG8diCWb9ew==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.6.tgz", + "integrity": "sha512-1HaM/dpI/1Z68zp8ZdT6EiBq+/O/z97a2AiHMl+VAdv5/ELckFt9EvRb8hDHpk8hUMoz03gXkC7VPXOVtU7faA==", "cpu": [ "x64" ], @@ -3051,9 +3051,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.5.tgz", - "integrity": "sha512-AVqLCDb/6K7aPNIcxHaTQj01sl1m989CJIQFQEaiQkGr2EQwyOpaATJ473h+nXDUuAcREhccfRpe/tu+0wu0eQ==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.6.tgz", + "integrity": "sha512-1ZcBux8zVM3JhWN2ZCPaYf0+ogxXG316uaoXJdgoPZcdK/rmRcRY7PqHdAos2ExzvjIdvhQp72UcveI98hgOog==", "cpu": [ "x64" ], @@ -3068,9 +3068,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.5.tgz", - "integrity": "sha512-xaOIad4wBambwJa6mdp1FigYSIF9i7PCqRbvBqtIi9y29QtPVQ13sDGtUnsRoe6SjL10auMzQ6YAe+B3RpZXVg==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.6.tgz", + "integrity": "sha512-h3A88G8PGM1ryTeZyLlSdfC/gz3e95EJw9BZmA6Po412DRqwqPBa2Y9U+4ZSGUAXCsnSQE00jLV8Pyrh0d+jQw==", "cpu": [ "arm64" ], @@ -3085,9 +3085,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.5.tgz", - "integrity": "sha512-F/jhuXCssPFAuciMhHKk00xnCAxJRS/pUzVfXYmOMUp//XW7mO6QeCjsjvnm8L4AO/dG2VOB0O+fJPiJ2uXtIw==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.6.tgz", + "integrity": "sha512-yx0CqeOhPjYQ5ZXgPfu8QYkgBhVJyvWe36as7jRuPrKPO5ylVDfwVtPQ+K/mooNTADW0IhxOZm3aPu16dP8yNQ==", "cpu": [ "x64" ], diff --git a/package.json b/package.json index a76ef00f22..6fd70221c5 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript#readme", "devDependencies": { - "@biomejs/biome": "^2.2.5", + "@biomejs/biome": "^2.2.6", "@types/aws-lambda": "^8.10.155", "@types/node": "^24.7.1", "@vitest/coverage-v8": "^3.2.4", From 2b18f838713c9cd552d4e71af55dc174e0fba409 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 15:13:29 +0100 Subject: [PATCH 233/255] chore(deps): bump the aws-cdk group across 1 directory with 2 updates (#4638) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/app/package.json | 2 +- layers/package.json | 2 +- package-lock.json | 26 +++++++++++++------------- packages/testing/package.json | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 6bde545779..385d240db6 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -50,7 +50,7 @@ "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.155", "@types/node": "24.7.1", - "aws-cdk": "^2.1029.4", + "aws-cdk": "^2.1030.0", "constructs": "^10.4.2", "esbuild": "^0.25.10", "typescript": "^5.9.3" diff --git a/layers/package.json b/layers/package.json index 601c5407d8..b70a51bf6c 100644 --- a/layers/package.json +++ b/layers/package.json @@ -41,7 +41,7 @@ "source-map-support": "^0.5.21" }, "dependencies": { - "aws-cdk": "^2.1029.4", + "aws-cdk": "^2.1030.0", "aws-cdk-lib": "^2.219.0", "esbuild": "^0.25.10", "tsx": "^4.20.6" diff --git a/package-lock.json b/package-lock.json index de436b5507..45f1ab3cd2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,7 +61,7 @@ "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.155", "@types/node": "24.7.1", - "aws-cdk": "^2.1029.4", + "aws-cdk": "^2.1030.0", "constructs": "^10.4.2", "esbuild": "^0.25.10", "typescript": "^5.9.3" @@ -134,7 +134,7 @@ "version": "2.27.0", "license": "MIT-0", "dependencies": { - "aws-cdk": "^2.1029.4", + "aws-cdk": "^2.1030.0", "aws-cdk-lib": "^2.219.0", "esbuild": "^0.25.10", "tsx": "^4.20.6" @@ -317,9 +317,9 @@ } }, "node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "48.12.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-48.12.0.tgz", - "integrity": "sha512-/GNDW8+O5FZldDXVtNJSMnd6+hG8DmwLt02cqlYHqWjpqTap7XzFFv3pqGTl/lL7s97jlbgj/568pLjpUWh2Dw==", + "version": "48.14.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-48.14.0.tgz", + "integrity": "sha512-mo1MaPKsNVh3QSuosREcwIh8TrVZ9deHVLAjzbjkQuTxb/7LGqkf1E5HHxlAt6Z0+z+DZt7dTPIJ92NcR0tjDQ==", "bundleDependencies": [ "jsonschema", "semver" @@ -420,13 +420,13 @@ } }, "node_modules/@aws-cdk/toolkit-lib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/toolkit-lib/-/toolkit-lib-1.9.0.tgz", - "integrity": "sha512-21NxaOmZeRHnYSS0HludVQer7HWDFl7ohoyDJIO5m0Nwa2vfIeRQdCVj+ueqHFoDCil3iSoeLrTGuV/YtAdhEQ==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/toolkit-lib/-/toolkit-lib-1.10.0.tgz", + "integrity": "sha512-lG1GzKYd9hLJXvUSivVMvgNb5DKvwD0buQUusWVhYtT1hu8ls9O0ZQzE5tgXLYMOBrq1Jd/qnks+psTwORmrYg==", "license": "Apache-2.0", "dependencies": { "@aws-cdk/cdk-assets-lib": "^1", - "@aws-cdk/cloud-assembly-schema": ">=48.12.0", + "@aws-cdk/cloud-assembly-schema": ">=48.13.0", "@aws-cdk/cloudformation-diff": "^2", "@aws-cdk/cx-api": "^2", "@aws-sdk/client-appsync": "^3", @@ -5985,9 +5985,9 @@ } }, "node_modules/aws-cdk": { - "version": "2.1029.4", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.1029.4.tgz", - "integrity": "sha512-rJa8QLd8WHaoTEjPLqVwmNpDMmyJycVaxdr/Evr/1MDLq+WCovP46IqPaXfH0q/jY0gCsga9or907tEayK5xcg==", + "version": "2.1030.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.1030.0.tgz", + "integrity": "sha512-jYgOy1Hqx8cOTWW9On9xpypXLecjOqSZ4X2q5U0Gzd14xI+HLmpaRJV5ILJ8vYrLKVbqjhiog0pdxAC7vwF9uQ==", "license": "Apache-2.0", "bin": { "cdk": "bin/cdk" @@ -10888,7 +10888,7 @@ "version": "2.27.0", "license": "MIT-0", "dependencies": { - "@aws-cdk/toolkit-lib": "^1.9.0", + "@aws-cdk/toolkit-lib": "^1.10.0", "@aws-sdk/client-lambda": "^3.901.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.219.0", diff --git a/packages/testing/package.json b/packages/testing/package.json index e269cbf84f..52df9c8cd6 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -98,7 +98,7 @@ }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/testing#readme", "dependencies": { - "@aws-cdk/toolkit-lib": "^1.9.0", + "@aws-cdk/toolkit-lib": "^1.10.0", "@aws-sdk/client-lambda": "^3.901.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.219.0", From c7fbbc94d981734cc4b235c7e104b7e14b79874b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 16:41:19 +0100 Subject: [PATCH 234/255] chore(deps): bump github/codeql-action from 4.30.7 to 4.30.8 (#4639) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Swopnil Dangol --- .github/workflows/ossf_scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ossf_scorecard.yml b/.github/workflows/ossf_scorecard.yml index 14c79b817b..93d63483be 100644 --- a/.github/workflows/ossf_scorecard.yml +++ b/.github/workflows/ossf_scorecard.yml @@ -43,6 +43,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@e296a935590eb16afc0c0108289f68c87e2a89a5 # v4.30.7 + uses: github/codeql-action/upload-sarif@f443b600d91635bebf5b0d9ebc620189c0d6fba5 # v4.30.8 with: sarif_file: results.sarif From 554c7142b4302e3b287c6895d6ad057b399e9083 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 16:58:44 +0100 Subject: [PATCH 235/255] chore(deps-dev): bump lint-staged from 16.2.3 to 16.2.4 (#4640) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Swopnil Dangol --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 45f1ab3cd2..c3dac4b713 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "@types/node": "^24.7.1", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", - "lint-staged": "^16.2.3", + "lint-staged": "^16.2.4", "markdownlint-cli2": "^0.18.1", "middy5": "npm:@middy/core@^5.4.3", "middy6": "npm:@middy/core@^6.0.0", @@ -8038,16 +8038,16 @@ } }, "node_modules/lint-staged": { - "version": "16.2.3", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.3.tgz", - "integrity": "sha512-1OnJEESB9zZqsp61XHH2fvpS1es3hRCxMplF/AJUDa8Ho8VrscYDIuxGrj3m8KPXbcWZ8fT9XTMUhEQmOVKpKw==", + "version": "16.2.4", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.4.tgz", + "integrity": "sha512-Pkyr/wd90oAyXk98i/2KwfkIhoYQUMtss769FIT9hFM5ogYZwrk+GRE46yKXSg2ZGhcJ1p38Gf5gmI5Ohjg2yg==", "dev": true, "license": "MIT", "dependencies": { "commander": "^14.0.1", "listr2": "^9.0.4", "micromatch": "^4.0.8", - "nano-spawn": "^1.0.3", + "nano-spawn": "^2.0.0", "pidtree": "^0.6.0", "string-argv": "^0.3.2", "yaml": "^2.8.1" @@ -8991,9 +8991,9 @@ "dev": true }, "node_modules/nano-spawn": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-1.0.3.tgz", - "integrity": "sha512-jtpsQDetTnvS2Ts1fiRdci5rx0VYws5jGyC+4IYOTnIQ/wwdf6JdomlHBwqC3bJYOvaKu0C2GSZ1A60anrYpaA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-2.0.0.tgz", + "integrity": "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 6fd70221c5..30198e4b81 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "@types/node": "^24.7.1", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", - "lint-staged": "^16.2.3", + "lint-staged": "^16.2.4", "markdownlint-cli2": "^0.18.1", "middy5": "npm:@middy/core@^5.4.3", "middy6": "npm:@middy/core@^6.0.0", From 5dab224fa5a341ff6e00b819690090594dbcd811 Mon Sep 17 00:00:00 2001 From: Mario DeSousa Date: Mon, 13 Oct 2025 12:05:20 -0400 Subject: [PATCH 236/255] fix(idempotency): add null check for idempotencyHandler before calling handleMiddyOnError (#4643) Co-authored-by: Stefano Vozza --- .../src/middleware/makeHandlerIdempotent.ts | 2 +- .../tests/unit/makeIdempotent.test.ts | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/idempotency/src/middleware/makeHandlerIdempotent.ts b/packages/idempotency/src/middleware/makeHandlerIdempotent.ts index 0d75c65ab0..60c647a6ae 100644 --- a/packages/idempotency/src/middleware/makeHandlerIdempotent.ts +++ b/packages/idempotency/src/middleware/makeHandlerIdempotent.ts @@ -180,7 +180,7 @@ const makeHandlerIdempotent = ( } const idempotencyHandler = getIdempotencyHandlerFromRequestInternal(request); - await idempotencyHandler.handleMiddyOnError(); + await idempotencyHandler?.handleMiddyOnError(); }; return { diff --git a/packages/idempotency/tests/unit/makeIdempotent.test.ts b/packages/idempotency/tests/unit/makeIdempotent.test.ts index 1c8a15e99b..bd4e39238e 100644 --- a/packages/idempotency/tests/unit/makeIdempotent.test.ts +++ b/packages/idempotency/tests/unit/makeIdempotent.test.ts @@ -112,6 +112,28 @@ describe('Function: makeIdempotent', () => { expect(deleteRecordSpy).toHaveBeenCalledWith(event); }); + it('handles an execution that throws an early middleware error (middleware)', async () => { + // Prepare + const handler = middy(fnSuccessfull) + .use({ before: fnError }) + .use(makeHandlerIdempotent(mockIdempotencyOptions)); + const saveInProgressSpy = vi.spyOn( + mockIdempotencyOptions.persistenceStore, + 'saveInProgress' + ); + const deleteRecordSpy = vi.spyOn( + mockIdempotencyOptions.persistenceStore, + 'deleteRecord' + ); + + // Act && Assess + await expect(handler(event, context)).rejects.toThrowError( + 'Something went wrong' + ); + expect(saveInProgressSpy).toHaveBeenCalledTimes(0); + expect(deleteRecordSpy).toHaveBeenCalledTimes(0); + }); + it.each([ { type: 'wrapper', From 750ba1d083a09f64b0ac2d7958cbf2119e86ef8b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 17:08:15 +0100 Subject: [PATCH 237/255] chore(deps-dev): bump the typescript group across 1 directory with 2 updates (#4641) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza Co-authored-by: Swopnil Dangol --- package-lock.json | 16 ++++++++-------- package.json | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index c3dac4b713..0884c6f6cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,8 +36,8 @@ "markdownlint-cli2": "^0.18.1", "middy5": "npm:@middy/core@^5.4.3", "middy6": "npm:@middy/core@^6.0.0", - "typedoc": "^0.28.13", - "typedoc-plugin-missing-exports": "^4.1.0", + "typedoc": "^0.28.14", + "typedoc-plugin-missing-exports": "^4.1.2", "typescript": "^5.9.3", "vitest": "^3.0.9" }, @@ -10018,9 +10018,9 @@ } }, "node_modules/typedoc": { - "version": "0.28.13", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.13.tgz", - "integrity": "sha512-dNWY8msnYB2a+7Audha+aTF1Pu3euiE7ySp53w8kEsXoYw7dMouV5A1UsTUY345aB152RHnmRMDiovuBi7BD+w==", + "version": "0.28.14", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.14.tgz", + "integrity": "sha512-ftJYPvpVfQvFzpkoSfHLkJybdA/geDJ8BGQt/ZnkkhnBYoYW6lBgPQXu6vqLxO4X75dA55hX8Af847H5KXlEFA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -10042,9 +10042,9 @@ } }, "node_modules/typedoc-plugin-missing-exports": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-4.1.0.tgz", - "integrity": "sha512-p1M5jXnEbQ4qqy0erJz41BBZEDb8XDrbLjndlH4RhYEcymbdQr0xLF6yUw1GWBrhSIfkU98m3BELMAiQh+R1zA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-4.1.2.tgz", + "integrity": "sha512-WNoeWX9+8X3E3riuYPduilUTFefl1K+Z+5bmYqNeH5qcWjtnTRMbRzGdEQ4XXn1WEO4WCIlU0vf46Ca2y/mspg==", "dev": true, "license": "MIT", "peerDependencies": { diff --git a/package.json b/package.json index 30198e4b81..9678567d08 100644 --- a/package.json +++ b/package.json @@ -59,8 +59,8 @@ "markdownlint-cli2": "^0.18.1", "middy5": "npm:@middy/core@^5.4.3", "middy6": "npm:@middy/core@^6.0.0", - "typedoc": "^0.28.13", - "typedoc-plugin-missing-exports": "^4.1.0", + "typedoc": "^0.28.14", + "typedoc-plugin-missing-exports": "^4.1.2", "typescript": "^5.9.3", "vitest": "^3.0.9" }, From e2b9f12dccae08403c2c941c8b28cfd358999b3c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 17:13:18 +0100 Subject: [PATCH 238/255] chore(deps): bump @types/node from 24.7.1 to 24.7.2 (#4642) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Swopnil Dangol --- examples/app/package.json | 4 ++-- package-lock.json | 12 ++++++------ package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 385d240db6..3e36ec5e77 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -30,7 +30,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.155", - "@types/node": "24.7.1", + "@types/node": "24.7.2", "aws-cdk-lib": "^2.219.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -49,7 +49,7 @@ "@aws-sdk/lib-dynamodb": "^3.902.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.155", - "@types/node": "24.7.1", + "@types/node": "24.7.2", "aws-cdk": "^2.1030.0", "constructs": "^10.4.2", "esbuild": "^0.25.10", diff --git a/package-lock.json b/package-lock.json index 0884c6f6cd..0cf41dbd7e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.6", "@types/aws-lambda": "^8.10.155", - "@types/node": "^24.7.1", + "@types/node": "^24.7.2", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.2.4", @@ -60,7 +60,7 @@ "@aws-sdk/lib-dynamodb": "^3.902.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.155", - "@types/node": "24.7.1", + "@types/node": "24.7.2", "aws-cdk": "^2.1030.0", "constructs": "^10.4.2", "esbuild": "^0.25.10", @@ -68,7 +68,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.155", - "@types/node": "24.7.1", + "@types/node": "24.7.2", "aws-cdk-lib": "^2.219.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -5096,9 +5096,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.1.tgz", - "integrity": "sha512-CmyhGZanP88uuC5GpWU9q+fI61j2SkhO3UGMUdfYRE6Bcy0ccyzn1Rqj9YAB/ZY4kOXmNf0ocah5GtphmLMP6Q==", + "version": "24.7.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.2.tgz", + "integrity": "sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA==", "license": "MIT", "dependencies": { "undici-types": "~7.14.0" diff --git a/package.json b/package.json index 9678567d08..9068abc2f6 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.6", "@types/aws-lambda": "^8.10.155", - "@types/node": "^24.7.1", + "@types/node": "^24.7.2", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.2.4", From afb56bec003d083fbab79977b96cb8805c15d491 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Oct 2025 15:35:36 +0100 Subject: [PATCH 239/255] chore(deps): bump the aws-sdk-v3 group across 1 directory with 49 updates (#4637) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/app/package.json | 4 +- examples/snippets/package.json | 10 +- package-lock.json | 1279 ++++++++++++++--------------- packages/idempotency/package.json | 4 +- packages/metrics/package.json | 2 +- packages/parameters/package.json | 10 +- packages/testing/package.json | 2 +- packages/tracer/package.json | 4 +- 8 files changed, 657 insertions(+), 658 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 3e36ec5e77..8db7346c32 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -45,8 +45,8 @@ "@aws-lambda-powertools/metrics": "^2.27.0", "@aws-lambda-powertools/parameters": "^2.27.0", "@aws-lambda-powertools/tracer": "^2.27.0", - "@aws-sdk/client-ssm": "^3.901.0", - "@aws-sdk/lib-dynamodb": "^3.902.0", + "@aws-sdk/client-ssm": "^3.908.0", + "@aws-sdk/lib-dynamodb": "^3.908.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.155", "@types/node": "24.7.2", diff --git a/examples/snippets/package.json b/examples/snippets/package.json index 3543ee552f..4f0a723a78 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -34,11 +34,11 @@ "@aws-lambda-powertools/parameters": "^2.27.0", "@aws-lambda-powertools/parser": "^2.27.0", "@aws-lambda-powertools/tracer": "^2.27.0", - "@aws-sdk/client-appconfigdata": "^3.901.0", - "@aws-sdk/client-dynamodb": "^3.902.0", - "@aws-sdk/client-secrets-manager": "^3.901.0", - "@aws-sdk/client-ssm": "^3.901.0", - "@aws-sdk/util-dynamodb": "^3.902.0", + "@aws-sdk/client-appconfigdata": "^3.908.0", + "@aws-sdk/client-dynamodb": "^3.908.0", + "@aws-sdk/client-secrets-manager": "^3.908.0", + "@aws-sdk/client-ssm": "^3.908.0", + "@aws-sdk/util-dynamodb": "^3.908.0", "@middy/core": "^4.7.0", "@redis/client": "^5.8.3", "@valkey/valkey-glide": "^2.1.1", diff --git a/package-lock.json b/package-lock.json index 0cf41dbd7e..ef960405cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,8 +56,8 @@ "@aws-lambda-powertools/metrics": "^2.27.0", "@aws-lambda-powertools/parameters": "^2.27.0", "@aws-lambda-powertools/tracer": "^2.27.0", - "@aws-sdk/client-ssm": "^3.901.0", - "@aws-sdk/lib-dynamodb": "^3.902.0", + "@aws-sdk/client-ssm": "^3.908.0", + "@aws-sdk/lib-dynamodb": "^3.908.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.155", "@types/node": "24.7.2", @@ -95,11 +95,11 @@ "@aws-lambda-powertools/parameters": "^2.27.0", "@aws-lambda-powertools/parser": "^2.27.0", "@aws-lambda-powertools/tracer": "^2.27.0", - "@aws-sdk/client-appconfigdata": "^3.901.0", - "@aws-sdk/client-dynamodb": "^3.902.0", - "@aws-sdk/client-secrets-manager": "^3.901.0", - "@aws-sdk/client-ssm": "^3.901.0", - "@aws-sdk/util-dynamodb": "^3.902.0", + "@aws-sdk/client-appconfigdata": "^3.908.0", + "@aws-sdk/client-dynamodb": "^3.908.0", + "@aws-sdk/client-secrets-manager": "^3.908.0", + "@aws-sdk/client-ssm": "^3.908.0", + "@aws-sdk/util-dynamodb": "^3.908.0", "@middy/core": "^4.7.0", "@redis/client": "^5.8.3", "@valkey/valkey-glide": "^2.1.1", @@ -874,50 +874,50 @@ "link": true }, "node_modules/@aws-sdk/client-appconfigdata": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.901.0.tgz", - "integrity": "sha512-OnYxUW20qJRWcL1PScPtny1y30hN1wNRYqaAjnkFfT+GFMoBCNwGXNIYJnZ8L9i1Hd+459K7hOJLbnm6oUYa7g==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.908.0.tgz", + "integrity": "sha512-tnxI3wxoH4LfMZdc3h/Wckef+0vJlV/CGJ6hAfB/13E9p4Wg8iXn44OI5EoizwpoA/sSjdFjl4ujWMP/U8VzKw==", "dev": true, "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", - "@smithy/util-stream": "^4.4.0", + "@smithy/util-stream": "^4.5.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -926,49 +926,49 @@ } }, "node_modules/@aws-sdk/client-appsync": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-appsync/-/client-appsync-3.901.0.tgz", - "integrity": "sha512-f5f14lmX7YrJ8htuEA8KAGmRuPHOyJ6/PaQpuPsquW19PWlq5weDDAZA9DD9SsBQDBM3DVQ+KRUf0t95bRweAA==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appsync/-/client-appsync-3.908.0.tgz", + "integrity": "sha512-TZOKJvVH3q6DHwQl/OA3qCrzhVDnbpyLQkd1eN90sBTWCXYUWlpsY9Ap2N/Hr6+Yu+I1Cce1h9iYN1kBvHBtXA==", "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", - "@smithy/util-stream": "^4.4.0", + "@smithy/util-stream": "^4.5.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -977,45 +977,45 @@ } }, "node_modules/@aws-sdk/client-cloudcontrol": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudcontrol/-/client-cloudcontrol-3.901.0.tgz", - "integrity": "sha512-V2aR2ZGwbWbAloCzs23Yl4VaE4cuvcobh0pqKj9qYS5c+mnjj537gkl0ZcTet1ohkGVODPb7cQ1VJkOecs8Lfw==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudcontrol/-/client-cloudcontrol-3.908.0.tgz", + "integrity": "sha512-zV2FCEStVqZcX4qa3puUhkR9DF2djyl0z/Do5llzH+/tqZkDSDZLjsCknnaylcBApvZbe5BCXXMkchNvzIKXvw==", "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -1029,45 +1029,45 @@ } }, "node_modules/@aws-sdk/client-cloudformation": { - "version": "3.902.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.902.0.tgz", - "integrity": "sha512-YqhLj8DQmvt66YJngoT5ZAEOEuQXJdtAxQXzbdJo3eaKqnwvER2v0WLDalxXZ/7tXj7lKsNPEf3K0ov/BOpRUA==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.908.0.tgz", + "integrity": "sha512-390QRnJnIgKNoVg+GiBbeirCz5G3eqrJUZAZMP0lp8HV94+CexoTMtnV35XmebFtt0C3P0L6ZlTL4HX6T6//Bw==", "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -1081,47 +1081,47 @@ } }, "node_modules/@aws-sdk/client-cloudwatch": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.901.0.tgz", - "integrity": "sha512-zWZEgOb3V8cMsYfrzExScBNg60+knIQt84ysX2zouzVWdd93q6UlR1fzqSonflEpojibrwJRgL5dOG9wkdze1g==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.908.0.tgz", + "integrity": "sha512-r/c6Eh06FSPGMkLPeEu9VvO7hEn01rf4a9lFFfapCsAieQoNwuOw2ZMOR6OmuhpOZ1H02bU41mQqr+SCNMbqfw==", "dev": true, "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@smithy/hash-node": "^4.2.0", "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-compression": "^4.3.0", + "@smithy/middleware-compression": "^4.3.1", "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.0", - "@smithy/middleware-retry": "^4.4.0", + "@smithy/middleware-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -1134,48 +1134,48 @@ } }, "node_modules/@aws-sdk/client-cloudwatch-logs": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.901.0.tgz", - "integrity": "sha512-36T3Vev/StVPPkZG8zhs+Pzch4T1LtwGZgPluF5nyaRO+s/1KbzwUEaKV/6Ts3DvdA6bq8aNBQ0psss6+r0LDw==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.908.0.tgz", + "integrity": "sha512-UHozlv3xajFaWV0qltEeT3ApN4rHC6hBxywDkCxCUK+avkzaQFpExnCCkc6EU+sZm4SFFI4zImVYThvggYj3Lw==", "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", + "@smithy/core": "^3.15.0", "@smithy/eventstream-serde-browser": "^4.2.0", "@smithy/eventstream-serde-config-resolver": "^4.3.0", "@smithy/eventstream-serde-node": "^4.2.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -1188,45 +1188,45 @@ } }, "node_modules/@aws-sdk/client-codebuild": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-codebuild/-/client-codebuild-3.901.0.tgz", - "integrity": "sha512-UV4dn04Y7xIjXEGe+DigjKHPrgob2j6cLhBAD+gO+v1sUQOXDYHZS0EKQKY3rIWjs96+LabaoMxY1CQWwpliGg==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-codebuild/-/client-codebuild-3.908.0.tgz", + "integrity": "sha512-RnfwyKRPoRBtXMKz6dLaagfebnKiTr8iIOoOr6Pe9i6w5w+POZ1Jvoy922iqBX/drv1CC6bNmIYw5zllmOD9Ag==", "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -1238,45 +1238,45 @@ } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.901.0.tgz", - "integrity": "sha512-cDJ+npYeAiS9u/52RwR0AHgneEF+rnyxiYm4d/c4FTI6xTQId3hSD0zdK0EgZ1wfoMk0/+5Ft6mYk0V6JN+cbQ==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.908.0.tgz", + "integrity": "sha512-XEva6l07dtF+6QNzTZHB+PEOX03sdcOudh+XVa4UjlUPlqrl/LAk/MzRxbw6pHScG5DPMx6Iyeicm7pJBOTdYg==", "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -1288,46 +1288,46 @@ } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.902.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.902.0.tgz", - "integrity": "sha512-WoBzn00MEvnhKFkrFPpqDjHxaqOriwJ2N00/GsoppHiMMPqinN53wB/phur7BsvhQCZZMbnIWrslcZcQxOzFLg==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.908.0.tgz", + "integrity": "sha512-8706EETITZZ5V7kwyxcZvDk1LDDaoUi5uZyh9jv0fyoKZtQHyNjsNHCpRWTW/DN/K/xy5MG1foMrCvdAqs0H5A==", "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -1341,46 +1341,46 @@ } }, "node_modules/@aws-sdk/client-ec2": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ec2/-/client-ec2-3.901.0.tgz", - "integrity": "sha512-0/bhQfS8ytQseA4jfY+dHS9mkl8q89KPeYeIRYjun+TxemQ6+Xgi3itY7ZKwN4cMTYX8ct6T0oOkRy0cVU7Z4Q==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ec2/-/client-ec2-3.908.0.tgz", + "integrity": "sha512-hiCFSXaapBicoGWINGfoWzzKFT06fZ6HyJNHrbRpusHqHrERDD5oIImYhyQEE5mmv9LgFGe02Sim1O2jL9xSjA==", "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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-sdk-ec2": "3.901.0", - "@aws-sdk/middleware-user-agent": "3.901.0", + "@aws-sdk/middleware-sdk-ec2": "3.908.0", + "@aws-sdk/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -1394,45 +1394,45 @@ } }, "node_modules/@aws-sdk/client-ecr": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.901.0.tgz", - "integrity": "sha512-Rd+Ky6kBAbQwVUfd04ZigRsKf9Hc71U2fQHPWu+hkvOS7CypeS38u+HxeTJDn4T6E8ijKBo4UcoNROsgxil5sA==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.908.0.tgz", + "integrity": "sha512-sLTUfD+DvWnuMwC8I9mKFnlqoqfD5wnx9YDTCrfJl9XZhgIq2qOLCbS47b/yG6Ec7PfuRYXHdz/rus91SC12QA==", "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -1445,45 +1445,45 @@ } }, "node_modules/@aws-sdk/client-ecs": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecs/-/client-ecs-3.901.0.tgz", - "integrity": "sha512-D6Aa5XiIFye87bUxD0oGw/kfVS6Jz67fbqLiK8flFdEiNc1JBWkNy4rOhSVWOA79WbWmA9UV9yH9nQzs9o9GWQ==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecs/-/client-ecs-3.908.0.tgz", + "integrity": "sha512-HVgwoj/+VhM/7DWv7UgoKWP+AmtxCm1Tnc964+rCECzuSCcC3cYXOf0LZJLmaUxCQHLEzNuANsAMyl9jCzXenw==", "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -1497,45 +1497,45 @@ } }, "node_modules/@aws-sdk/client-elastic-load-balancing-v2": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-elastic-load-balancing-v2/-/client-elastic-load-balancing-v2-3.901.0.tgz", - "integrity": "sha512-kC6GNaBogiIS9HVsreIwc4MpKy/9Kuz2H3ytoSsYwSC7zswKxrtJcrqCBuprUR9rUETdz5EhCgIfI6IPdCIOKw==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-elastic-load-balancing-v2/-/client-elastic-load-balancing-v2-3.908.0.tgz", + "integrity": "sha512-iTkv7e50/HY87ENQIjcy0EkZG5boSKIe109OoXoqsSjlyqiPwvOs5MC3dWDx2loWVA9B4AP09Mc7i6bolo9qFA==", "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -1548,45 +1548,45 @@ } }, "node_modules/@aws-sdk/client-iam": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-iam/-/client-iam-3.901.0.tgz", - "integrity": "sha512-rQAMK+hAyOUHW5ZOk94UyHCDndklSW1Aq2OIZa9l9icwdQpDPZQSAWb+ki+GVk9eII8Hpwq+BCc18Fki1lvtLw==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-iam/-/client-iam-3.908.0.tgz", + "integrity": "sha512-kdRYgL/5qt1KOpOp0MHxMoVE3xnVzfj2doyaXQ6eruUP4n+KY3GZFSamQds1/muK6YycgUiNt4umqtSIDCpb7Q==", "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -1599,45 +1599,45 @@ } }, "node_modules/@aws-sdk/client-kms": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.901.0.tgz", - "integrity": "sha512-QpQCzGL3++2nanUsh4mOoWFHN510OgYrB70t6xNcz6CWaFedYcsX0Zjq6UAulWoQ2UGnMZkvZ4MElG0AQBu92w==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.908.0.tgz", + "integrity": "sha512-C5D6F/JcIKMTMj7vVFfRGkFqMcFKG05mMp9wFLs+Eh+0vfNC41JyrKzyBGoUO4fIEhkKqxSFom7n73Cc4R69cQ==", "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -1649,52 +1649,52 @@ } }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.901.0.tgz", - "integrity": "sha512-4h6dgXKMGuK/hplMpdKbxQDtjy2laVoOO7Mml4/DPO6TVu8TIP6JQXo3SLCE6BUkqchZdXVKGtD7YCWsEBilcw==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.908.0.tgz", + "integrity": "sha512-g5Fb4da8lUzjv1XEZSzpxTDtPcQHVHqqMOfjTWtBBwKqacRqM6L+M79WKeMt/Wm3Lul1EWKzyOSpq7qYO9zHRw==", "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", + "@smithy/core": "^3.15.0", "@smithy/eventstream-serde-browser": "^4.2.0", "@smithy/eventstream-serde-config-resolver": "^4.3.0", "@smithy/eventstream-serde-node": "^4.2.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", - "@smithy/util-stream": "^4.4.0", + "@smithy/util-stream": "^4.5.0", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.0", "tslib": "^2.6.2" @@ -1704,47 +1704,47 @@ } }, "node_modules/@aws-sdk/client-route-53": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-route-53/-/client-route-53-3.901.0.tgz", - "integrity": "sha512-rxBB4nodmoq4H893PFQWuuqGP8786p/qWym88p+96ErN1nONyuZQZvF7VeLXg1HgfILLq5UAIcZBGXgdjg7OIA==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-route-53/-/client-route-53-3.908.0.tgz", + "integrity": "sha512-AnlwPR4+g0IjGdgQasQrgLER7bb1gYSUkrMmpx8/mhZ7jO8OQPBaL0qMRqmH5iYm2dMyB3QG+i9OPy4XBf+Lfg==", "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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-sdk-route53": "3.901.0", - "@aws-sdk/middleware-user-agent": "3.901.0", + "@aws-sdk/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@aws-sdk/xml-builder": "3.901.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -1757,64 +1757,64 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.901.0.tgz", - "integrity": "sha512-wyKhZ51ur1tFuguZ6PgrUsot9KopqD0Tmxw8O8P/N3suQDxFPr0Yo7Y77ezDRDZQ95Ml3C0jlvx79HCo8VxdWA==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.908.0.tgz", + "integrity": "sha512-c/89iG3of8UEiWbRK014DoHLy8PLLTJtM9IvYLPsvrf83kpV2P/K9WrdbjW4h6e5qt9XPgfNTZ8U607mt7pdmA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.901.0", - "@aws-sdk/credential-provider-node": "3.901.0", + "@aws-sdk/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.0", "@aws-sdk/middleware-bucket-endpoint": "3.901.0", "@aws-sdk/middleware-expect-continue": "3.901.0", - "@aws-sdk/middleware-flexible-checksums": "3.901.0", + "@aws-sdk/middleware-flexible-checksums": "3.908.0", "@aws-sdk/middleware-host-header": "3.901.0", "@aws-sdk/middleware-location-constraint": "3.901.0", "@aws-sdk/middleware-logger": "3.901.0", "@aws-sdk/middleware-recursion-detection": "3.901.0", - "@aws-sdk/middleware-sdk-s3": "3.901.0", + "@aws-sdk/middleware-sdk-s3": "3.908.0", "@aws-sdk/middleware-ssec": "3.901.0", - "@aws-sdk/middleware-user-agent": "3.901.0", + "@aws-sdk/middleware-user-agent": "3.908.0", "@aws-sdk/region-config-resolver": "3.901.0", - "@aws-sdk/signature-v4-multi-region": "3.901.0", + "@aws-sdk/signature-v4-multi-region": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@aws-sdk/xml-builder": "3.901.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", + "@smithy/core": "^3.15.0", "@smithy/eventstream-serde-browser": "^4.2.0", "@smithy/eventstream-serde-config-resolver": "^4.3.0", "@smithy/eventstream-serde-node": "^4.2.0", - "@smithy/fetch-http-handler": "^5.3.0", - "@smithy/hash-blob-browser": "^4.2.0", + "@smithy/fetch-http-handler": "^5.3.1", + "@smithy/hash-blob-browser": "^4.2.1", "@smithy/hash-node": "^4.2.0", "@smithy/hash-stream-node": "^4.2.0", "@smithy/invalid-dependency": "^4.2.0", "@smithy/md5-js": "^4.2.0", "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.0", - "@smithy/middleware-retry": "^4.4.0", + "@smithy/middleware-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", - "@smithy/util-stream": "^4.4.0", + "@smithy/util-stream": "^4.5.0", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.0", "@smithy/uuid": "^1.1.0", @@ -1825,45 +1825,45 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.901.0.tgz", - "integrity": "sha512-k5HEJfPiwgGVAjDGRPbysD3K2W0iMKQUv3zKTqHLFxog6X7JBrKGNgQwwtdz3vE5z9SFjGov7cFS1T1QuLVKQg==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.908.0.tgz", + "integrity": "sha512-OJVKq6vzG2w0B+Al4Hx+iLRVt2GuRopu5Obs8YzD2gzl4WIFqk6gK7SFr+vNFZAfd5VjsKhXpbgYD7JWnDIacg==", "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -1876,45 +1876,45 @@ } }, "node_modules/@aws-sdk/client-sfn": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sfn/-/client-sfn-3.901.0.tgz", - "integrity": "sha512-B7j+vMTEYxTifn4uG3ZQVVOSpIHwLU/tfJ98h15eDt/D29To/OucmkGMqjdQ+a55c5PQ/lP3FdJxOR9ZbWMjGw==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sfn/-/client-sfn-3.908.0.tgz", + "integrity": "sha512-NYU+tB+cR0ycedoHTLq0ljWW3hRtEdXe0w2RS3/zSjDeZGFvQMigkIgyLTq6ZvTijdTWCfheh2C9whR4LMEdjg==", "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -1927,45 +1927,45 @@ } }, "node_modules/@aws-sdk/client-ssm": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.901.0.tgz", - "integrity": "sha512-u0GoXcrxHIBpITZIfw8AUabjQutCbRFAoHl+zT0qLylZ5dOOVydP2++CI+DK6Z7ZcOluJorQ+z/53IniZqkjZA==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.908.0.tgz", + "integrity": "sha512-bEkjw0tFilts/dDOrFh2CAGw1tMyGHrBeRqbb+47UOzUCqewgxngopsL4qJwHxPL6tUk37sYgMMGYXo6U9p9mA==", "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -1979,44 +1979,44 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.901.0.tgz", - "integrity": "sha512-sGyDjjkJ7ppaE+bAKL/Q5IvVCxtoyBIzN+7+hWTS/mUxWJ9EOq9238IqmVIIK6sYNIzEf9yhobfMARasPYVTNg==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.908.0.tgz", + "integrity": "sha512-PseFMWvtac+Q+zaY9DMISE+2+glNh0ROJ1yR4gMzeafNHSwkdYu4qcgxLWIOnIodGydBv/tQ6nzHPzExXnUUgw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.901.0", + "@aws-sdk/core": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -2028,45 +2028,45 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.901.0.tgz", - "integrity": "sha512-3NQm7RShoX+cqhFcECMunNh5B2emGM5Yfi/HhMi4ZawjwTYh28pnFmc7d30zj7KG0PYQp9cUXUi5eKlCwIsx+g==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.908.0.tgz", + "integrity": "sha512-B2/yJIAEjsU04zyRVZ439hmX6QRDgksntfEtV7INN8jiqdcsDHUiAG1t+xY5CLX9YTjzI8pnK50kNeDZPasMFw==", "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -2078,46 +2078,46 @@ } }, "node_modules/@aws-sdk/client-xray": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.901.0.tgz", - "integrity": "sha512-hcElujjrdIFmkI0MvuZntIwTE3bX7q15rvkGy7DcIYA+FXQbdnyxN1rRST+KIiCwM3BYV+IY6t3Qc++buW1M0Q==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.908.0.tgz", + "integrity": "sha512-KpZdHpVWZ7QLPwNAykJmuWvFlFJArTjmnDB9bCUE7PHwGbMCbXuuZPPxJHeNL5reWddQhHgMdqNIREH7kv2Q4g==", "dev": true, "license": "Apache-2.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/core": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -2129,21 +2129,21 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.901.0.tgz", - "integrity": "sha512-brKAc3y64tdhyuEf+OPIUln86bRTqkLgb9xkd6kUdIeA5+qmp/N6amItQz+RN4k4O3kqkCPYnAd3LonTKluobw==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.908.0.tgz", + "integrity": "sha512-okl6FC2cQT1Oidvmnmvyp/IEvqENBagKO0ww4YV5UtBkf0VlhAymCWkZqhovtklsqgq0otag2VRPAgnrMt6nVQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.901.0", "@aws-sdk/xml-builder": "3.901.0", - "@smithy/core": "^3.14.0", + "@smithy/core": "^3.15.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/property-provider": "^4.2.0", "@smithy/protocol-http": "^5.3.0", "@smithy/signature-v4": "^5.3.0", - "@smithy/smithy-client": "^4.7.0", + "@smithy/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" @@ -2153,12 +2153,12 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.901.0.tgz", - "integrity": "sha512-irVFwiiEC+JRFQTZwI7264LOGXRjqdp3AvmqiEmmZS0+sJsEaF65prCs+nzw6J1WqQ6IZKClKKQsH7x8FfOPrQ==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.908.0.tgz", + "integrity": "sha512-Lmb5GatPNDY5cODfwH3XGWpKZqg/lh7ghCn4Y9BTMi5W9Z/E2Jq5YF7yaLobOjOpx+lVoxS+EsVrtSm6p3ffuw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.901.0", + "@aws-sdk/client-cognito-identity": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/property-provider": "^4.2.0", "@smithy/types": "^4.6.0", @@ -2169,12 +2169,12 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.901.0.tgz", - "integrity": "sha512-5hAdVl3tBuARh3zX5MLJ1P/d+Kr5kXtDU3xm1pxUEF4xt2XkEEpwiX5fbkNkz2rbh3BCt2gOHsAbh6b3M7n+DA==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.908.0.tgz", + "integrity": "sha512-FK2YuxoI5CxUflPOIMbVAwDbi6Xvu+2sXopXLmrHc2PfI39M3vmjEoQwYCP8WuQSRb+TbAP3xAkxHjFSBFR35w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.901.0", + "@aws-sdk/core": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/property-provider": "^4.2.0", "@smithy/types": "^4.6.0", @@ -2185,20 +2185,20 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.901.0.tgz", - "integrity": "sha512-Ggr7+0M6QZEsrqRkK7iyJLf4LkIAacAxHz9c4dm9hnDdU7vqrlJm6g73IxMJXWN1bIV7IxfpzB11DsRrB/oNjQ==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.908.0.tgz", + "integrity": "sha512-eLbz0geVW9EykujQNnYfR35Of8MreI6pau5K6XDFDUSWO9GF8wqH7CQwbXpXHBlCTHtq4QSLxzorD8U5CROhUw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.901.0", + "@aws-sdk/core": "3.908.0", "@aws-sdk/types": "3.901.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/fetch-http-handler": "^5.3.1", "@smithy/node-http-handler": "^4.3.0", "@smithy/property-provider": "^4.2.0", "@smithy/protocol-http": "^5.3.0", - "@smithy/smithy-client": "^4.7.0", + "@smithy/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", - "@smithy/util-stream": "^4.4.0", + "@smithy/util-stream": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2206,18 +2206,18 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.901.0.tgz", - "integrity": "sha512-zxadcDS0hNJgv8n4hFYJNOXyfjaNE1vvqIiF/JzZSQpSSYXzCd+WxXef5bQh+W3giDtRUmkvP5JLbamEFjZKyw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.901.0", - "@aws-sdk/credential-provider-env": "3.901.0", - "@aws-sdk/credential-provider-http": "3.901.0", - "@aws-sdk/credential-provider-process": "3.901.0", - "@aws-sdk/credential-provider-sso": "3.901.0", - "@aws-sdk/credential-provider-web-identity": "3.901.0", - "@aws-sdk/nested-clients": "3.901.0", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.908.0.tgz", + "integrity": "sha512-7Cgnv5wabgFtsgr+Uc/76EfPNGyxmbG8aICn3g3D3iJlcO4uuOZI8a77i0afoDdchZrTC6TG6UusS/NAW6zEoQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.908.0", + "@aws-sdk/credential-provider-env": "3.908.0", + "@aws-sdk/credential-provider-http": "3.908.0", + "@aws-sdk/credential-provider-process": "3.908.0", + "@aws-sdk/credential-provider-sso": "3.908.0", + "@aws-sdk/credential-provider-web-identity": "3.908.0", + "@aws-sdk/nested-clients": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/credential-provider-imds": "^4.2.0", "@smithy/property-provider": "^4.2.0", @@ -2230,17 +2230,17 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.901.0.tgz", - "integrity": "sha512-dPuFzMF7L1s/lQyT3wDxqLe82PyTH+5o1jdfseTEln64LJMl0ZMWaKX/C1UFNDxaTd35Cgt1bDbjjAWHMiKSFQ==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.908.0.tgz", + "integrity": "sha512-8OKbykpGw5bdfF/pLTf8YfUi1Kl8o1CTjBqWQTsLOkE3Ho3hsp1eQx8Cz4ttrpv0919kb+lox62DgmAOEmTr1w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.901.0", - "@aws-sdk/credential-provider-http": "3.901.0", - "@aws-sdk/credential-provider-ini": "3.901.0", - "@aws-sdk/credential-provider-process": "3.901.0", - "@aws-sdk/credential-provider-sso": "3.901.0", - "@aws-sdk/credential-provider-web-identity": "3.901.0", + "@aws-sdk/credential-provider-env": "3.908.0", + "@aws-sdk/credential-provider-http": "3.908.0", + "@aws-sdk/credential-provider-ini": "3.908.0", + "@aws-sdk/credential-provider-process": "3.908.0", + "@aws-sdk/credential-provider-sso": "3.908.0", + "@aws-sdk/credential-provider-web-identity": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/credential-provider-imds": "^4.2.0", "@smithy/property-provider": "^4.2.0", @@ -2253,12 +2253,12 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.901.0.tgz", - "integrity": "sha512-/IWgmgM3Cl1wTdJA5HqKMAojxLkYchh5kDuphApxKhupLu6Pu0JBOHU8A5GGeFvOycyaVwosod6zDduINZxe+A==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.908.0.tgz", + "integrity": "sha512-sWnbkGjDPBi6sODUzrAh5BCDpnPw0wpK8UC/hWI13Q8KGfyatAmCBfr+9OeO3+xBHa8N5AskMncr7C4qS846yQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.901.0", + "@aws-sdk/core": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/property-provider": "^4.2.0", "@smithy/shared-ini-file-loader": "^4.3.0", @@ -2270,14 +2270,14 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.901.0.tgz", - "integrity": "sha512-SjmqZQHmqFSET7+6xcZgtH7yEyh5q53LN87GqwYlJZ6KJ5oNw11acUNEhUOL1xTSJEvaWqwTIkS2zqrzLcM9bw==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.908.0.tgz", + "integrity": "sha512-WV/aOzuS6ZZhrkPty6TJ3ZG24iS8NXP0m3GuTVuZ5tKi9Guss31/PJ1CrKPRCYGm15CsIjf+mrUxVnNYv9ap5g==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.901.0", - "@aws-sdk/core": "3.901.0", - "@aws-sdk/token-providers": "3.901.0", + "@aws-sdk/client-sso": "3.908.0", + "@aws-sdk/core": "3.908.0", + "@aws-sdk/token-providers": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/property-provider": "^4.2.0", "@smithy/shared-ini-file-loader": "^4.3.0", @@ -2289,13 +2289,13 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.901.0.tgz", - "integrity": "sha512-NYjy/6NLxH9m01+pfpB4ql8QgAorJcu8tw69kzHwUd/ql6wUDTbC7HcXqtKlIwWjzjgj2BKL7j6SyFapgCuafA==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.908.0.tgz", + "integrity": "sha512-9xWrFn6nWlF5KlV4XYW+7E6F33S3wUUEGRZ/+pgDhkIZd527ycT2nPG2dZ3fWUZMlRmzijP20QIJDqEbbGWe1Q==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.901.0", - "@aws-sdk/nested-clients": "3.901.0", + "@aws-sdk/core": "3.908.0", + "@aws-sdk/nested-clients": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/property-provider": "^4.2.0", "@smithy/shared-ini-file-loader": "^4.3.0", @@ -2307,25 +2307,25 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.901.0.tgz", - "integrity": "sha512-jaJ+sVF9xuBwYiQznjrbDkw2W8/aQijGGdzroDL1mJfwyZA0hj3zfYUion+iWwjYhb0vS0bAyrIHtjtTfA2Qpw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.901.0", - "@aws-sdk/core": "3.901.0", - "@aws-sdk/credential-provider-cognito-identity": "3.901.0", - "@aws-sdk/credential-provider-env": "3.901.0", - "@aws-sdk/credential-provider-http": "3.901.0", - "@aws-sdk/credential-provider-ini": "3.901.0", - "@aws-sdk/credential-provider-node": "3.901.0", - "@aws-sdk/credential-provider-process": "3.901.0", - "@aws-sdk/credential-provider-sso": "3.901.0", - "@aws-sdk/credential-provider-web-identity": "3.901.0", - "@aws-sdk/nested-clients": "3.901.0", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.908.0.tgz", + "integrity": "sha512-WuAttxDemeKyMAgNEwBdgz11/W8IOosDxAU9GOk8ZbNJI/Cp0SiCp5p9bu0hlroq2V4HxECIRIMNeJZLh7fIgg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.908.0", + "@aws-sdk/core": "3.908.0", + "@aws-sdk/credential-provider-cognito-identity": "3.908.0", + "@aws-sdk/credential-provider-env": "3.908.0", + "@aws-sdk/credential-provider-http": "3.908.0", + "@aws-sdk/credential-provider-ini": "3.908.0", + "@aws-sdk/credential-provider-node": "3.908.0", + "@aws-sdk/credential-provider-process": "3.908.0", + "@aws-sdk/credential-provider-sso": "3.908.0", + "@aws-sdk/credential-provider-web-identity": "3.908.0", + "@aws-sdk/nested-clients": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", + "@smithy/core": "^3.15.0", "@smithy/credential-provider-imds": "^4.2.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/property-provider": "^4.2.0", @@ -2337,9 +2337,9 @@ } }, "node_modules/@aws-sdk/ec2-metadata-service": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/ec2-metadata-service/-/ec2-metadata-service-3.901.0.tgz", - "integrity": "sha512-wpPwGdUkIKr1BggcPMoWSL7HGgFU4tS2zAfffChY1G6HISzYrj5+jq3CUpZj3Q9MI4ANhFTW37/33+pGF4hzKg==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/ec2-metadata-service/-/ec2-metadata-service-3.908.0.tgz", + "integrity": "sha512-KoPwLw9Z3i/vDq9erUpYPm8mypQJDerWlI64HHspJaAW0grFOYzPs2OqJar2NkCt3ktg+chuhgbMoAiZ2Kyo+w==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.901.0", @@ -2347,7 +2347,7 @@ "@smithy/node-http-handler": "^4.3.0", "@smithy/protocol-http": "^5.3.0", "@smithy/types": "^4.6.0", - "@smithy/util-stream": "^4.4.0", + "@smithy/util-stream": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -2368,15 +2368,15 @@ } }, "node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.902.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.902.0.tgz", - "integrity": "sha512-fe7DAz/57St3lrJoxayu55CJBj8JNhTh2keR+JNtA2lDdY7FZnRalUJse5Mts2gqG5+3zUdPDfMcevu7vhXIzw==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.908.0.tgz", + "integrity": "sha512-XWILSCKbGv0sjDt1wigHiOCzUS5ymR1EuXH77wLzmbUxH94c1qlJIswQ2EY8zYkyoyzrHGMZ3Vxa7e+8xJ4UZQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.901.0", - "@aws-sdk/util-dynamodb": "3.902.0", - "@smithy/core": "^3.14.0", - "@smithy/smithy-client": "^4.7.0", + "@aws-sdk/core": "3.908.0", + "@aws-sdk/util-dynamodb": "3.908.0", + "@smithy/core": "^3.15.0", + "@smithy/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, @@ -2384,18 +2384,18 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.902.0" + "@aws-sdk/client-dynamodb": "^3.908.0" } }, "node_modules/@aws-sdk/lib-storage": { - "version": "3.903.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.903.0.tgz", - "integrity": "sha512-/CFhz/QtPSI9CVAdlW6JrfMyPjnE38a8pzTi8CMCWXu51c1NqzcGXo80LZUwzWkcWk5ZqPWRYzrw43TQ8ia78w==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.908.0.tgz", + "integrity": "sha512-tWYvGPAImOHSGYyau5rrVQA3OS0MV8ZCgf5ywtRIAmMEV4CSctDBP8WR2FrO7shAPKMRkjgdul5f0pZAjOYd2Q==", "license": "Apache-2.0", "dependencies": { "@smithy/abort-controller": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.0", - "@smithy/smithy-client": "^4.7.0", + "@smithy/middleware-endpoint": "^4.3.1", + "@smithy/smithy-client": "^4.7.1", "buffer": "5.6.0", "events": "3.3.0", "stream-browserify": "3.0.0", @@ -2405,7 +2405,7 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-s3": "^3.901.0" + "@aws-sdk/client-s3": "^3.908.0" } }, "node_modules/@aws-sdk/lib-storage/node_modules/events": { @@ -2467,22 +2467,22 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.901.0.tgz", - "integrity": "sha512-63lcKfggVUFyXhE4SsFXShCTCyh7ZHEqXLyYEL4DwX+VWtxutf9t9m3fF0TNUYDE8eEGWiRXhegj8l4FjuW+wA==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.908.0.tgz", + "integrity": "sha512-hYGhNBvdfnxhhywYRkesdxIZD8rvhsp2CBci5kCqrR2o5VvEkn5+waUQtkREtkciEpC4ent4fadg7N9XfTKvgQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.901.0", + "@aws-sdk/core": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/is-array-buffer": "^4.2.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/protocol-http": "^5.3.0", "@smithy/types": "^4.6.0", "@smithy/util-middleware": "^4.2.0", - "@smithy/util-stream": "^4.4.0", + "@smithy/util-stream": "^4.5.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -2550,17 +2550,17 @@ } }, "node_modules/@aws-sdk/middleware-sdk-ec2": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-ec2/-/middleware-sdk-ec2-3.901.0.tgz", - "integrity": "sha512-gzmXVG0Jh0ofNfG8E4eq/iI4Nd4Le4rNMJPmEqE/wNdvmLvPdhXGIpNn1g7RdIkzjFyFZXO41bYL+iXV2egF2A==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-ec2/-/middleware-sdk-ec2-3.908.0.tgz", + "integrity": "sha512-d9RSBcd7vU8CT4N60kDyaYSwa+aIoasGxgZRHXsUn/xiGU/fyRjZhjU0qjh9MWytjrfsxEk1Uk5bZ0nPfKPyeQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.901.0", "@aws-sdk/util-format-url": "3.901.0", - "@smithy/middleware-endpoint": "^4.3.0", + "@smithy/middleware-endpoint": "^4.3.1", "@smithy/protocol-http": "^5.3.0", "@smithy/signature-v4": "^5.3.0", - "@smithy/smithy-client": "^4.7.0", + "@smithy/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, @@ -2583,23 +2583,23 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.901.0.tgz", - "integrity": "sha512-prgjVC3fDT2VIlmQPiw/cLee8r4frTam9GILRUVQyDdNtshNwV3MiaSCLzzQJjKJlLgnBLNUHJCSmvUVtg+3iA==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.908.0.tgz", + "integrity": "sha512-23MbAOHsGaD0kTVMVLumaIM1f9vtDImIn2lSvPullbjFHKS4XxfrKuPumtKDzl8gzcux+98XnmfDRKH0fzkOUA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.901.0", + "@aws-sdk/core": "3.908.0", "@aws-sdk/types": "3.901.0", "@aws-sdk/util-arn-parser": "3.893.0", - "@smithy/core": "^3.14.0", + "@smithy/core": "^3.15.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/protocol-http": "^5.3.0", "@smithy/signature-v4": "^5.3.0", - "@smithy/smithy-client": "^4.7.0", + "@smithy/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.0", - "@smithy/util-stream": "^4.4.0", + "@smithy/util-stream": "^4.5.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -2622,15 +2622,15 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.901.0.tgz", - "integrity": "sha512-Zby4F03fvD9xAgXGPywyk4bC1jCbnyubMEYChLYohD+x20ULQCf+AimF/Btn7YL+hBpzh1+RmqmvZcx+RgwgNQ==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.908.0.tgz", + "integrity": "sha512-R0ePEOku72EvyJWy/D0Z5f/Ifpfxa0U9gySO3stpNhOox87XhsILpcIsCHPy0OHz1a7cMoZsF6rMKSzDeCnogQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.901.0", + "@aws-sdk/core": "3.908.0", "@aws-sdk/types": "3.901.0", "@aws-sdk/util-endpoints": "3.901.0", - "@smithy/core": "^3.14.0", + "@smithy/core": "^3.15.0", "@smithy/protocol-http": "^5.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" @@ -2640,44 +2640,44 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.901.0.tgz", - "integrity": "sha512-feAAAMsVwctk2Tms40ONybvpfJPLCmSdI+G+OTrNpizkGLNl6ik2Ng2RzxY6UqOfN8abqKP/DOUj1qYDRDG8ag==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.908.0.tgz", + "integrity": "sha512-ZxDYrfxOKXNFHLyvJtT96TJ0p4brZOhwRE4csRXrezEVUN+pNgxuem95YvMALPVhlVqON2CTzr8BX+CcBKvX9Q==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.901.0", + "@aws-sdk/core": "3.908.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/middleware-user-agent": "3.908.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", + "@aws-sdk/util-user-agent-browser": "3.907.0", + "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.14.0", - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/core": "^3.15.0", + "@smithy/fetch-http-handler": "^5.3.1", "@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-endpoint": "^4.3.1", + "@smithy/middleware-retry": "^4.4.1", "@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/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.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-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.0", + "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -2706,12 +2706,12 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.901.0.tgz", - "integrity": "sha512-2IWxbll/pRucp1WQkHi2W5E2SVPGBvk4Is923H7gpNksbVFws18ItjMM8ZpGm44cJEoy1zR5gjhLFklatpuoOw==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.908.0.tgz", + "integrity": "sha512-8OodflIzZM2GVuCGiGK6hqwsbfHRDl4kQcEYzHRg9p91H4h5Y876DPvLRkwM7pSC7LKUL0XkKWWVVjwJbp6/Ig==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.901.0", + "@aws-sdk/middleware-sdk-s3": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/protocol-http": "^5.3.0", "@smithy/signature-v4": "^5.3.0", @@ -2723,13 +2723,13 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.901.0.tgz", - "integrity": "sha512-pJEr1Ggbc/uVTDqp9IbNu9hdr0eQf3yZix3s4Nnyvmg4xmJSGAlbPC9LrNr5u3CDZoc8Z9CuLrvbP4MwYquNpQ==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.908.0.tgz", + "integrity": "sha512-4SosHWRQ8hj1X2yDenCYHParcCjHcd7S+Mdb/lelwF0JBFCNC+dNCI9ws3cP/dFdZO/AIhJQGUBzEQtieloixw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.901.0", - "@aws-sdk/nested-clients": "3.901.0", + "@aws-sdk/core": "3.908.0", + "@aws-sdk/nested-clients": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/property-provider": "^4.2.0", "@smithy/shared-ini-file-loader": "^4.3.0", @@ -2766,9 +2766,9 @@ } }, "node_modules/@aws-sdk/util-dynamodb": { - "version": "3.902.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.902.0.tgz", - "integrity": "sha512-elZ9e671bda7Z1NzNSHiYKktnoXx4z2FJCJf1hpHrA/rMqVmnErNl/QzHZqF+0jH/0UoK7g4LCjJRO5A+reBoQ==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.908.0.tgz", + "integrity": "sha512-shrZvTDxUHVeo5lBr1zNOcorjoFjJUwEtfxj+C3/GTOeZBWqTHXHM+G7P1coeh5X/GCKOmfiyVqalv4oYPOMPw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2777,7 +2777,7 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.902.0" + "@aws-sdk/client-dynamodb": "^3.908.0" } }, "node_modules/@aws-sdk/util-endpoints": { @@ -2824,9 +2824,9 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.901.0.tgz", - "integrity": "sha512-Ntb6V/WFI21Ed4PDgL/8NSfoZQQf9xzrwNgiwvnxgAl/KvAvRBgQtqj5gHsDX8Nj2YmJuVoHfH9BGjL9VQ4WNg==", + "version": "3.907.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.907.0.tgz", + "integrity": "sha512-Hus/2YCQmtCEfr4Ls88d07Q99Ex59uvtktiPTV963Q7w7LHuIT/JBjrbwNxtSm2KlJR9PHNdqxwN+fSuNsMGMQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.901.0", @@ -2836,12 +2836,12 @@ } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.901.0.tgz", - "integrity": "sha512-l59KQP5TY7vPVUfEURc7P5BJKuNg1RSsAKBQW7LHLECXjLqDUbo2SMLrexLBEoArSt6E8QOrIN0C8z/0Xk0jYw==", + "version": "3.908.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.908.0.tgz", + "integrity": "sha512-l6AEaKUAYarcEy8T8NZ+dNZ00VGLs3fW2Cqu1AuPENaSad0/ahEU+VU7MpXS8FhMRGPgplxKVgCTLyTY0Lbssw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.901.0", + "@aws-sdk/middleware-user-agent": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/types": "^4.6.0", @@ -4273,12 +4273,12 @@ } }, "node_modules/@smithy/chunked-blob-reader-native": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.0.tgz", - "integrity": "sha512-HNbGWdyTfSM1nfrZKQjYTvD8k086+M8s1EYkBUdGC++lhxegUp2HgNf5RIt6oOGVvsC26hBCW/11tv8KbwLn/Q==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.1.tgz", + "integrity": "sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -4302,18 +4302,18 @@ } }, "node_modules/@smithy/core": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.14.0.tgz", - "integrity": "sha512-XJ4z5FxvY/t0Dibms/+gLJrI5niRoY0BCmE02fwmPcRYFPI4KI876xaE79YGWIKnEslMbuQPsIEsoU/DXa0DoA==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.15.0.tgz", + "integrity": "sha512-VJWncXgt+ExNn0U2+Y7UywuATtRYaodGQKFo9mDyh70q+fJGedfrqi2XuKU1BhiLeXgg6RZrW7VEKfeqFhHAJA==", "license": "Apache-2.0", "dependencies": { "@smithy/middleware-serde": "^4.2.0", "@smithy/protocol-http": "^5.3.0", "@smithy/types": "^4.6.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-middleware": "^4.2.0", - "@smithy/util-stream": "^4.4.0", + "@smithy/util-stream": "^4.5.0", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" @@ -4409,15 +4409,15 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.0.tgz", - "integrity": "sha512-BG3KSmsx9A//KyIfw+sqNmWFr1YBUr+TwpxFT7yPqAk0yyDh7oSNgzfNH7pS6OC099EGx2ltOULvumCFe8bcgw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.1.tgz", + "integrity": "sha512-3AvYYbB+Dv5EPLqnJIAgYw/9+WzeBiUYS8B+rU0pHq5NMQMvrZmevUROS4V2GAt0jEOn9viBzPLrZE+riTNd5Q==", "license": "Apache-2.0", "dependencies": { "@smithy/protocol-http": "^5.3.0", "@smithy/querystring-builder": "^4.2.0", "@smithy/types": "^4.6.0", - "@smithy/util-base64": "^4.2.0", + "@smithy/util-base64": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -4425,13 +4425,13 @@ } }, "node_modules/@smithy/hash-blob-browser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.0.tgz", - "integrity": "sha512-MWmrRTPqVKpN8NmxmJPTeQuhewTt8Chf+waB38LXHZoA02+BeWYVQ9ViAwHjug8m7lQb1UWuGqp3JoGDOWvvuA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.1.tgz", + "integrity": "sha512-Os9cg1fTXMwuqbvjemELlf+HB5oEeVyZmYsTbAtDQBmjGyibjmbeeqcaw7xOJLIHrkH/u0wAYabNcN6FRTqMRg==", "license": "Apache-2.0", "dependencies": { "@smithy/chunked-blob-reader": "^5.2.0", - "@smithy/chunked-blob-reader-native": "^4.2.0", + "@smithy/chunked-blob-reader-native": "^4.2.1", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, @@ -4508,13 +4508,13 @@ } }, "node_modules/@smithy/middleware-compression": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-4.3.0.tgz", - "integrity": "sha512-I1owX2Jje2CubUKGcVGCKLs6D7iAQRe48YDz9XgYj63828sKTHnFylkiWmmD2R2N6fCRYnsopq/OEGG4R+vASw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-4.3.1.tgz", + "integrity": "sha512-5tvL1KRHscZTxbuSiE5RJ6OCQZT0cz2N6iI9tRxtygdR0tp0WfzoVkys5v+uSZGI9LZL7QO5oMYYZD8BZRGT4g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.14.0", + "@smithy/core": "^3.15.0", "@smithy/is-array-buffer": "^4.2.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/protocol-http": "^5.3.0", @@ -4544,12 +4544,12 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.0.tgz", - "integrity": "sha512-jFVjuQeV8TkxaRlcCNg0GFVgg98tscsmIrIwRFeC74TIUyLE3jmY9xgc1WXrPQYRjQNK3aRoaIk6fhFRGOIoGw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.1.tgz", + "integrity": "sha512-JtM4SjEgImLEJVXdsbvWHYiJ9dtuKE8bqLlvkvGi96LbejDL6qnVpVxEFUximFodoQbg0Gnkyff9EKUhFhVJFw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.14.0", + "@smithy/core": "^3.15.0", "@smithy/middleware-serde": "^4.2.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/shared-ini-file-loader": "^4.3.0", @@ -4563,15 +4563,15 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.0.tgz", - "integrity": "sha512-yaVBR0vQnOnzex45zZ8ZrPzUnX73eUC8kVFaAAbn04+6V7lPtxn56vZEBBAhgS/eqD6Zm86o6sJs6FuQVoX5qg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.1.tgz", + "integrity": "sha512-wXxS4ex8cJJteL0PPQmWYkNi9QKDWZIpsndr0wZI2EL+pSSvA/qqxXU60gBOJoIc2YgtZSWY/PE86qhKCCKP1w==", "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^4.3.0", "@smithy/protocol-http": "^5.3.0", "@smithy/service-error-classification": "^4.2.0", - "@smithy/smithy-client": "^4.7.0", + "@smithy/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", @@ -4738,17 +4738,17 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.7.0.tgz", - "integrity": "sha512-3BDx/aCCPf+kkinYf5QQhdQ9UAGihgOVqI3QO5xQfSaIWvUE4KYLtiGRWsNe1SR7ijXC0QEPqofVp5Sb0zC8xQ==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.7.1.tgz", + "integrity": "sha512-WXVbiyNf/WOS/RHUoFMkJ6leEVpln5ojCjNBnzoZeMsnCg3A0BRhLK3WYc4V7PmYcYPZh9IYzzAg9XcNSzYxYQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.14.0", - "@smithy/middleware-endpoint": "^4.3.0", + "@smithy/core": "^3.15.0", + "@smithy/middleware-endpoint": "^4.3.1", "@smithy/middleware-stack": "^4.2.0", "@smithy/protocol-http": "^5.3.0", "@smithy/types": "^4.6.0", - "@smithy/util-stream": "^4.4.0", + "@smithy/util-stream": "^4.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4782,9 +4782,9 @@ } }, "node_modules/@smithy/util-base64": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.2.0.tgz", - "integrity": "sha512-+erInz8WDv5KPe7xCsJCp+1WCjSbah9gWcmUXc9NqmhyPx59tf7jqFz+za1tRG1Y5KM1Cy1rWCcGypylFp4mvA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^4.2.0", @@ -4808,9 +4808,9 @@ } }, "node_modules/@smithy/util-body-length-node": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.0.tgz", - "integrity": "sha512-U8q1WsSZFjXijlD7a4wsDQOvOwV+72iHSfq1q7VD+V75xP/pdtm0WIGuaFJ3gcADDOKj2MIBn4+zisi140HEnQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -4845,15 +4845,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.2.0.tgz", - "integrity": "sha512-qzHp7ZDk1Ba4LDwQVCNp90xPGqSu7kmL7y5toBpccuhi3AH7dcVBIT/pUxYcInK4jOy6FikrcTGq5wxcka8UaQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.0.tgz", + "integrity": "sha512-H4MAj8j8Yp19Mr7vVtGgi7noJjvjJbsKQJkvNnLlrIFduRFT5jq5Eri1k838YW7rN2g5FTnXpz5ktKVr1KVgPQ==", "license": "Apache-2.0", "dependencies": { "@smithy/property-provider": "^4.2.0", - "@smithy/smithy-client": "^4.7.0", + "@smithy/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", - "bowser": "^2.11.0", "tslib": "^2.6.2" }, "engines": { @@ -4861,16 +4860,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.0.tgz", - "integrity": "sha512-FxUHS3WXgx3bTWR6yQHNHHkQHZm/XKIi/CchTnKvBulN6obWpcbzJ6lDToXn+Wp0QlVKd7uYAz2/CTw1j7m+Kg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.1.tgz", + "integrity": "sha512-PuDcgx7/qKEMzV1QFHJ7E4/MMeEjaA7+zS5UNcHCLPvvn59AeZQ0DSDGMpqC2xecfa/1cNGm4l8Ec/VxCuY7Ug==", "license": "Apache-2.0", "dependencies": { "@smithy/config-resolver": "^4.3.0", "@smithy/credential-provider-imds": "^4.2.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/property-provider": "^4.2.0", - "@smithy/smithy-client": "^4.7.0", + "@smithy/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, @@ -4932,15 +4931,15 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.4.0.tgz", - "integrity": "sha512-vtO7ktbixEcrVzMRmpQDnw/Ehr9UWjBvSJ9fyAbadKkC4w5Cm/4lMO8cHz8Ysb8uflvQUNRcuux/oNHKPXkffg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.0.tgz", + "integrity": "sha512-0TD5M5HCGu5diEvZ/O/WquSjhJPasqv7trjoqHyWjNh/FBeBl7a0ztl9uFMOsauYtRfd8jvpzIAQhDHbx+nvZw==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/fetch-http-handler": "^5.3.1", "@smithy/node-http-handler": "^4.3.0", "@smithy/types": "^4.6.0", - "@smithy/util-base64": "^4.2.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", @@ -10699,8 +10698,8 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.902.0", - "@aws-sdk/lib-dynamodb": "^3.902.0", + "@aws-sdk/client-dynamodb": "^3.908.0", + "@aws-sdk/lib-dynamodb": "^3.908.0", "aws-sdk-client-mock": "^4.1.0" }, "peerDependencies": { @@ -10800,7 +10799,7 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.901.0", + "@aws-sdk/client-cloudwatch": "^3.908.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, @@ -10822,11 +10821,11 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.901.0", - "@aws-sdk/client-dynamodb": "^3.902.0", - "@aws-sdk/client-secrets-manager": "^3.901.0", - "@aws-sdk/client-ssm": "^3.901.0", - "@aws-sdk/util-dynamodb": "^3.902.0", + "@aws-sdk/client-appconfigdata": "^3.908.0", + "@aws-sdk/client-dynamodb": "^3.908.0", + "@aws-sdk/client-secrets-manager": "^3.908.0", + "@aws-sdk/client-ssm": "^3.908.0", + "@aws-sdk/util-dynamodb": "^3.908.0", "@smithy/util-base64": "^4.0.0", "aws-sdk-client-mock": "^4.1.0" }, @@ -10889,7 +10888,7 @@ "license": "MIT-0", "dependencies": { "@aws-cdk/toolkit-lib": "^1.10.0", - "@aws-sdk/client-lambda": "^3.901.0", + "@aws-sdk/client-lambda": "^3.908.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.219.0", "esbuild": "^0.25.10", @@ -10910,8 +10909,8 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.902.0", - "@aws-sdk/client-xray": "^3.901.0" + "@aws-sdk/client-dynamodb": "^3.908.0", + "@aws-sdk/client-xray": "^3.908.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x" diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index 8e2c7e802d..f546652272 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -151,8 +151,8 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.902.0", - "@aws-sdk/lib-dynamodb": "^3.902.0", + "@aws-sdk/client-dynamodb": "^3.908.0", + "@aws-sdk/lib-dynamodb": "^3.908.0", "aws-sdk-client-mock": "^4.1.0" } } diff --git a/packages/metrics/package.json b/packages/metrics/package.json index e707244dc7..48f168be3d 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -65,7 +65,7 @@ "main": "./lib/cjs/index.js", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.901.0", + "@aws-sdk/client-cloudwatch": "^3.908.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, diff --git a/packages/parameters/package.json b/packages/parameters/package.json index 4ca19b576c..a614868866 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -156,11 +156,11 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.901.0", - "@aws-sdk/client-dynamodb": "^3.902.0", - "@aws-sdk/client-secrets-manager": "^3.901.0", - "@aws-sdk/client-ssm": "^3.901.0", - "@aws-sdk/util-dynamodb": "^3.902.0", + "@aws-sdk/client-appconfigdata": "^3.908.0", + "@aws-sdk/client-dynamodb": "^3.908.0", + "@aws-sdk/client-secrets-manager": "^3.908.0", + "@aws-sdk/client-ssm": "^3.908.0", + "@aws-sdk/util-dynamodb": "^3.908.0", "@smithy/util-base64": "^4.0.0", "aws-sdk-client-mock": "^4.1.0" }, diff --git a/packages/testing/package.json b/packages/testing/package.json index 52df9c8cd6..080d08fa73 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -99,7 +99,7 @@ "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/testing#readme", "dependencies": { "@aws-cdk/toolkit-lib": "^1.10.0", - "@aws-sdk/client-lambda": "^3.901.0", + "@aws-sdk/client-lambda": "^3.908.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.219.0", "esbuild": "^0.25.10", diff --git a/packages/tracer/package.json b/packages/tracer/package.json index 47e0c8d1ae..90a7ebfb1d 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -30,8 +30,8 @@ "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.902.0", - "@aws-sdk/client-xray": "^3.901.0" + "@aws-sdk/client-dynamodb": "^3.908.0", + "@aws-sdk/client-xray": "^3.908.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x" From e346f9fefa735b6a8be4576369619f7079e7a2c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Oct 2025 15:38:42 +0100 Subject: [PATCH 240/255] chore(deps): bump arktype from 2.1.22 to 2.1.23 (#4645) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Swopnil Dangol --- examples/snippets/package.json | 2 +- package-lock.json | 36 ++++++++++++++++++++++------------ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/examples/snippets/package.json b/examples/snippets/package.json index 4f0a723a78..ae4d2d8572 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -47,7 +47,7 @@ "zod": "^4.1.12" }, "dependencies": { - "arktype": "^2.1.22", + "arktype": "^2.1.23", "valibot": "^1.1.0" } } diff --git a/package-lock.json b/package-lock.json index ef960405cf..26c2951cde 100644 --- a/package-lock.json +++ b/package-lock.json @@ -82,7 +82,7 @@ "version": "2.27.0", "license": "MIT-0", "dependencies": { - "arktype": "^2.1.22", + "arktype": "^2.1.23", "valibot": "^1.1.0" }, "devDependencies": { @@ -160,19 +160,28 @@ "node": ">=6.0.0" } }, + "node_modules/@ark/regex": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/@ark/regex/-/regex-0.0.0.tgz", + "integrity": "sha512-p4vsWnd/LRGOdGQglbwOguIVhPmCAf5UzquvnDoxqhhPWTP84wWgi1INea8MgJ4SnI2gp37f13oA4Waz9vwNYg==", + "license": "MIT", + "dependencies": { + "@ark/util": "0.50.0" + } + }, "node_modules/@ark/schema": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@ark/schema/-/schema-0.49.0.tgz", - "integrity": "sha512-GphZBLpW72iS0v4YkeUtV3YIno35Gimd7+ezbPO9GwEi9kzdUrPVjvf6aXSBAfHikaFc/9pqZOpv3pOXnC71tw==", + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@ark/schema/-/schema-0.50.0.tgz", + "integrity": "sha512-hfmP82GltBZDadIOeR3argKNlYYyB2wyzHp0eeAqAOFBQguglMV/S7Ip2q007bRtKxIMLDqFY6tfPie1dtssaQ==", "license": "MIT", "dependencies": { - "@ark/util": "0.49.0" + "@ark/util": "0.50.0" } }, "node_modules/@ark/util": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@ark/util/-/util-0.49.0.tgz", - "integrity": "sha512-/BtnX7oCjNkxi2vi6y1399b+9xd1jnCrDYhZ61f0a+3X8x8DxlK52VgEEzyuC2UQMPACIfYrmHkhD3lGt2GaMA==", + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@ark/util/-/util-0.50.0.tgz", + "integrity": "sha512-tIkgIMVRpkfXRQIEf0G2CJryZVtHVrqcWHMDa5QKo0OEEBu0tHkRSIMm4Ln8cd8Bn9TPZtvc/kE2Gma8RESPSg==", "license": "MIT" }, "node_modules/@aws-cdk/asset-awscli-v1": { @@ -5881,13 +5890,14 @@ "dev": true }, "node_modules/arktype": { - "version": "2.1.22", - "resolved": "https://registry.npmjs.org/arktype/-/arktype-2.1.22.tgz", - "integrity": "sha512-xdzl6WcAhrdahvRRnXaNwsipCgHuNoLobRqhiP8RjnfL9Gp947abGlo68GAIyLtxbD+MLzNyH2YR4kEqioMmYQ==", + "version": "2.1.23", + "resolved": "https://registry.npmjs.org/arktype/-/arktype-2.1.23.tgz", + "integrity": "sha512-tyxNWX6xJVMb2EPJJ3OjgQS1G/vIeQRrZuY4DeBNQmh8n7geS+czgbauQWB6Pr+RXiOO8ChEey44XdmxsqGmfQ==", "license": "MIT", "dependencies": { - "@ark/schema": "0.49.0", - "@ark/util": "0.49.0" + "@ark/regex": "0.0.0", + "@ark/schema": "0.50.0", + "@ark/util": "0.50.0" } }, "node_modules/assertion-error": { From 89d1e3c9297fbb797f98b38dc9c93021dc6273f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Oct 2025 10:09:11 +0100 Subject: [PATCH 241/255] chore(deps): bump actions/setup-node from 5.0.0 to 6.0.0 (#4644) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- .github/workflows/bootstrap_region.yml | 2 +- .github/workflows/make-release.yml | 2 +- .github/workflows/make-version.yml | 2 +- .github/workflows/publish-package.yml | 2 +- .github/workflows/publish_layer.yml | 2 +- .github/workflows/quality_check.yml | 10 +++++----- .../reusable-run-linting-check-and-unit-tests.yml | 4 ++-- .github/workflows/reusable_deploy_layer_stack.yml | 2 +- .github/workflows/reusable_publish_docs.yml | 2 +- .github/workflows/run-e2e-tests.yml | 2 +- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/bootstrap_region.yml b/.github/workflows/bootstrap_region.yml index 6cfc53d87a..e1373689de 100644 --- a/.github/workflows/bootstrap_region.yml +++ b/.github/workflows/bootstrap_region.yml @@ -47,7 +47,7 @@ jobs: with: ref: ${{ github.sha }} - name: Setup Node.js - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: "22" - name: Setup dependencies diff --git a/.github/workflows/make-release.yml b/.github/workflows/make-release.yml index 201c1d0a8a..d0375cbea5 100644 --- a/.github/workflows/make-release.yml +++ b/.github/workflows/make-release.yml @@ -48,7 +48,7 @@ jobs: with: ref: ${{ github.sha }} - name: Setup NodeJS - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: "22" cache: "npm" diff --git a/.github/workflows/make-version.yml b/.github/workflows/make-version.yml index 4e7f994d3f..d81d911425 100644 --- a/.github/workflows/make-version.yml +++ b/.github/workflows/make-version.yml @@ -35,7 +35,7 @@ jobs: ref: ${{ github.ref }} fetch-depth: 0 # fetch all history, commits and tags, so we can determine the next version - name: Setup Node.js - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: ${{ env.NODE_VERSION }} cache: "npm" diff --git a/.github/workflows/publish-package.yml b/.github/workflows/publish-package.yml index 1cdfab16f5..dc3aa6b463 100644 --- a/.github/workflows/publish-package.yml +++ b/.github/workflows/publish-package.yml @@ -39,7 +39,7 @@ jobs: with: ref: ${{ github.sha }} - name: Setup NodeJS - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: "22" cache: "npm" diff --git a/.github/workflows/publish_layer.yml b/.github/workflows/publish_layer.yml index 35f4763a27..98b622f341 100644 --- a/.github/workflows/publish_layer.yml +++ b/.github/workflows/publish_layer.yml @@ -42,7 +42,7 @@ jobs: with: ref: ${{ github.sha }} - name: Setup Node.js - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: "22" - name: Setup dependencies diff --git a/.github/workflows/quality_check.yml b/.github/workflows/quality_check.yml index 8d9f72679c..cdceb6f6fe 100644 --- a/.github/workflows/quality_check.yml +++ b/.github/workflows/quality_check.yml @@ -37,7 +37,7 @@ jobs: - name: Checkout code uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Setup NodeJS - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: ${{ matrix.version }} cache: "npm" @@ -66,7 +66,7 @@ jobs: - name: Checkout code uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Setup NodeJS - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: 22 cache: "npm" @@ -84,7 +84,7 @@ jobs: - name: Checkout code uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Setup NodeJS - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: 22 cache: "npm" @@ -102,7 +102,7 @@ jobs: - name: Checkout code uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Setup NodeJS - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: 22 cache: "npm" @@ -118,7 +118,7 @@ jobs: - name: Checkout code uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Setup NodeJS - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: 22 cache: "npm" diff --git a/.github/workflows/reusable-run-linting-check-and-unit-tests.yml b/.github/workflows/reusable-run-linting-check-and-unit-tests.yml index 61d0361b31..89fa0ebac8 100644 --- a/.github/workflows/reusable-run-linting-check-and-unit-tests.yml +++ b/.github/workflows/reusable-run-linting-check-and-unit-tests.yml @@ -59,7 +59,7 @@ jobs: - name: Checkout code uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Setup NodeJS - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: ${{ matrix.version }} cache: "npm" @@ -90,7 +90,7 @@ jobs: uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - &setup_node name: Setup Node.js - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: 22 cache: "npm" diff --git a/.github/workflows/reusable_deploy_layer_stack.yml b/.github/workflows/reusable_deploy_layer_stack.yml index 060c7e8ef4..328a4258df 100644 --- a/.github/workflows/reusable_deploy_layer_stack.yml +++ b/.github/workflows/reusable_deploy_layer_stack.yml @@ -81,7 +81,7 @@ jobs: role-to-assume: ${{ secrets.target-account-role }} mask-aws-account-id: true - name: Setup Node.js - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: "22" - name: Setup dependencies diff --git a/.github/workflows/reusable_publish_docs.yml b/.github/workflows/reusable_publish_docs.yml index 1c0cc45e45..681b8a771b 100644 --- a/.github/workflows/reusable_publish_docs.yml +++ b/.github/workflows/reusable_publish_docs.yml @@ -52,7 +52,7 @@ jobs: - name: Checkout code uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Setup NodeJS - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: "22" cache: "npm" diff --git a/.github/workflows/run-e2e-tests.yml b/.github/workflows/run-e2e-tests.yml index 91c67e66db..0abd85e79d 100644 --- a/.github/workflows/run-e2e-tests.yml +++ b/.github/workflows/run-e2e-tests.yml @@ -50,7 +50,7 @@ jobs: set -euo pipefail gh pr checkout "$PR_NUMBER" - name: Setup Node.js - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: '22' - name: Setup dependencies From 46098569d6fc87e6f999feeb56d2d5c260cf04db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Oct 2025 14:15:10 +0100 Subject: [PATCH 242/255] chore(deps): bump squidfunk/mkdocs-material from `00f9276` to `f5c556a` in /docs (#4646) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Dockerfile b/docs/Dockerfile index 3583231260..e0b1ff56ec 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -1,5 +1,5 @@ # version 9.5.35 -FROM squidfunk/mkdocs-material@sha256:00f9276315990b82f5af8c47bb2b71e2c69aef9f02a08f8dffd2515f42310753 +FROM squidfunk/mkdocs-material@sha256:f5c556a6d30ce0c1c0df10e3c38c79bbcafdaea4b1c1be366809d0d4f6f9d57f # Install Node.js RUN apk add --no-cache nodejs=22.13.1-r0 npm From f940f5824d889f039a0e0261866b6ccc4732b337 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Oct 2025 14:17:18 +0100 Subject: [PATCH 243/255] chore(deps): bump mkdocs-material from 9.6.21 to 9.6.22 in /docs (#4647) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Swopnil Dangol --- docs/requirements.in | 2 +- docs/requirements.txt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/requirements.in b/docs/requirements.in index ab56b6a8c3..757b8300ef 100644 --- a/docs/requirements.in +++ b/docs/requirements.in @@ -1,5 +1,5 @@ mike==1.1.2 -mkdocs-material==9.6.21 +mkdocs-material==9.6.22 mkdocs-git-revision-date-plugin==0.3.2 mkdocs-exclude==1.0.2 mkdocs-typedoc==1.0.4 diff --git a/docs/requirements.txt b/docs/requirements.txt index a001ebc3da..838861855b 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -276,9 +276,9 @@ mkdocs-llmstxt==0.4.0 \ --hash=sha256:7244bf0ac917c9964030c93e9c3e26c02d2d14a0f66fc113416007125b6da0fc \ --hash=sha256:a7e4d20496bc8c55b6773b55c8d69cf552448a9ad38915b6e8c657ae3a46c8b8 # via -r requirements.in -mkdocs-material==9.6.21 \ - --hash=sha256:aa6a5ab6fb4f6d381588ac51da8782a4d3757cb3d1b174f81a2ec126e1f22c92 \ - --hash=sha256:b01aa6d2731322438056f360f0e623d3faae981f8f2d8c68b1b973f4f2657870 +mkdocs-material==9.6.22 \ + --hash=sha256:14ac5f72d38898b2f98ac75a5531aaca9366eaa427b0f49fc2ecf04d99b7ad84 \ + --hash=sha256:87c158b0642e1ada6da0cbd798a3389b0bc5516b90e5ece4a0fb939f00bacd1c # via -r requirements.in mkdocs-material-extensions==1.3.1 \ --hash=sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443 \ From 4294cb15b34c32db057bd250045a1bf52744fc24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Oct 2025 14:33:50 +0100 Subject: [PATCH 244/255] chore(deps): bump esbuild from 0.25.10 to 0.25.11 (#4648) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/app/package.json | 2 +- layers/package.json | 2 +- package-lock.json | 220 +++++++++++++++++----------------- packages/testing/package.json | 2 +- 4 files changed, 113 insertions(+), 113 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 8db7346c32..1fbcd71419 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -52,7 +52,7 @@ "@types/node": "24.7.2", "aws-cdk": "^2.1030.0", "constructs": "^10.4.2", - "esbuild": "^0.25.10", + "esbuild": "^0.25.11", "typescript": "^5.9.3" } } diff --git a/layers/package.json b/layers/package.json index b70a51bf6c..2d22e5be11 100644 --- a/layers/package.json +++ b/layers/package.json @@ -43,7 +43,7 @@ "dependencies": { "aws-cdk": "^2.1030.0", "aws-cdk-lib": "^2.219.0", - "esbuild": "^0.25.10", + "esbuild": "^0.25.11", "tsx": "^4.20.6" } } diff --git a/package-lock.json b/package-lock.json index 26c2951cde..2ba86f8e5d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,7 +63,7 @@ "@types/node": "24.7.2", "aws-cdk": "^2.1030.0", "constructs": "^10.4.2", - "esbuild": "^0.25.10", + "esbuild": "^0.25.11", "typescript": "^5.9.3" }, "devDependencies": { @@ -136,7 +136,7 @@ "dependencies": { "aws-cdk": "^2.1030.0", "aws-cdk-lib": "^2.219.0", - "esbuild": "^0.25.10", + "esbuild": "^0.25.11", "tsx": "^4.20.6" }, "bin": { @@ -3129,9 +3129,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", - "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz", + "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==", "cpu": [ "ppc64" ], @@ -3145,9 +3145,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", - "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz", + "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==", "cpu": [ "arm" ], @@ -3161,9 +3161,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", - "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz", + "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==", "cpu": [ "arm64" ], @@ -3177,9 +3177,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", - "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz", + "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==", "cpu": [ "x64" ], @@ -3193,9 +3193,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", - "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz", + "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==", "cpu": [ "arm64" ], @@ -3209,9 +3209,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", - "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz", + "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==", "cpu": [ "x64" ], @@ -3225,9 +3225,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", - "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz", + "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==", "cpu": [ "arm64" ], @@ -3241,9 +3241,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", - "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz", + "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==", "cpu": [ "x64" ], @@ -3257,9 +3257,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", - "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz", + "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==", "cpu": [ "arm" ], @@ -3273,9 +3273,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", - "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz", + "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==", "cpu": [ "arm64" ], @@ -3289,9 +3289,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", - "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz", + "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==", "cpu": [ "ia32" ], @@ -3305,9 +3305,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", - "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz", + "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==", "cpu": [ "loong64" ], @@ -3321,9 +3321,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", - "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz", + "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==", "cpu": [ "mips64el" ], @@ -3337,9 +3337,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", - "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz", + "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==", "cpu": [ "ppc64" ], @@ -3353,9 +3353,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", - "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz", + "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==", "cpu": [ "riscv64" ], @@ -3369,9 +3369,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", - "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz", + "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==", "cpu": [ "s390x" ], @@ -3385,9 +3385,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", - "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz", + "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==", "cpu": [ "x64" ], @@ -3401,9 +3401,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", - "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz", + "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==", "cpu": [ "arm64" ], @@ -3417,9 +3417,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", - "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz", + "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", "cpu": [ "x64" ], @@ -3433,9 +3433,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", - "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz", + "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", "cpu": [ "arm64" ], @@ -3449,9 +3449,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", - "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz", + "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", "cpu": [ "x64" ], @@ -3465,9 +3465,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", - "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz", + "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", "cpu": [ "arm64" ], @@ -3481,9 +3481,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", - "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz", + "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", "cpu": [ "x64" ], @@ -3497,9 +3497,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", - "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz", + "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", "cpu": [ "arm64" ], @@ -3513,9 +3513,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", - "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz", + "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", "cpu": [ "ia32" ], @@ -3529,9 +3529,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", - "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz", + "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", "cpu": [ "x64" ], @@ -7251,9 +7251,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", - "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz", + "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -7263,32 +7263,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.10", - "@esbuild/android-arm": "0.25.10", - "@esbuild/android-arm64": "0.25.10", - "@esbuild/android-x64": "0.25.10", - "@esbuild/darwin-arm64": "0.25.10", - "@esbuild/darwin-x64": "0.25.10", - "@esbuild/freebsd-arm64": "0.25.10", - "@esbuild/freebsd-x64": "0.25.10", - "@esbuild/linux-arm": "0.25.10", - "@esbuild/linux-arm64": "0.25.10", - "@esbuild/linux-ia32": "0.25.10", - "@esbuild/linux-loong64": "0.25.10", - "@esbuild/linux-mips64el": "0.25.10", - "@esbuild/linux-ppc64": "0.25.10", - "@esbuild/linux-riscv64": "0.25.10", - "@esbuild/linux-s390x": "0.25.10", - "@esbuild/linux-x64": "0.25.10", - "@esbuild/netbsd-arm64": "0.25.10", - "@esbuild/netbsd-x64": "0.25.10", - "@esbuild/openbsd-arm64": "0.25.10", - "@esbuild/openbsd-x64": "0.25.10", - "@esbuild/openharmony-arm64": "0.25.10", - "@esbuild/sunos-x64": "0.25.10", - "@esbuild/win32-arm64": "0.25.10", - "@esbuild/win32-ia32": "0.25.10", - "@esbuild/win32-x64": "0.25.10" + "@esbuild/aix-ppc64": "0.25.11", + "@esbuild/android-arm": "0.25.11", + "@esbuild/android-arm64": "0.25.11", + "@esbuild/android-x64": "0.25.11", + "@esbuild/darwin-arm64": "0.25.11", + "@esbuild/darwin-x64": "0.25.11", + "@esbuild/freebsd-arm64": "0.25.11", + "@esbuild/freebsd-x64": "0.25.11", + "@esbuild/linux-arm": "0.25.11", + "@esbuild/linux-arm64": "0.25.11", + "@esbuild/linux-ia32": "0.25.11", + "@esbuild/linux-loong64": "0.25.11", + "@esbuild/linux-mips64el": "0.25.11", + "@esbuild/linux-ppc64": "0.25.11", + "@esbuild/linux-riscv64": "0.25.11", + "@esbuild/linux-s390x": "0.25.11", + "@esbuild/linux-x64": "0.25.11", + "@esbuild/netbsd-arm64": "0.25.11", + "@esbuild/netbsd-x64": "0.25.11", + "@esbuild/openbsd-arm64": "0.25.11", + "@esbuild/openbsd-x64": "0.25.11", + "@esbuild/openharmony-arm64": "0.25.11", + "@esbuild/sunos-x64": "0.25.11", + "@esbuild/win32-arm64": "0.25.11", + "@esbuild/win32-ia32": "0.25.11", + "@esbuild/win32-x64": "0.25.11" } }, "node_modules/estree-walker": { @@ -10901,7 +10901,7 @@ "@aws-sdk/client-lambda": "^3.908.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.219.0", - "esbuild": "^0.25.10", + "esbuild": "^0.25.11", "promise-retry": "^2.0.1" }, "devDependencies": { diff --git a/packages/testing/package.json b/packages/testing/package.json index 080d08fa73..ded0c443b5 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -102,7 +102,7 @@ "@aws-sdk/client-lambda": "^3.908.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.219.0", - "esbuild": "^0.25.10", + "esbuild": "^0.25.11", "promise-retry": "^2.0.1" }, "devDependencies": { From a37a3173023439ee67cc328753cb2d292dc3854f Mon Sep 17 00:00:00 2001 From: Swopnil Dangol Date: Thu, 16 Oct 2025 14:07:39 +0100 Subject: [PATCH 245/255] improv(event-handler): ended response stream when body is null (#4651) --- packages/event-handler/src/rest/Router.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/event-handler/src/rest/Router.ts b/packages/event-handler/src/rest/Router.ts index a79ab8decc..f8ee13e7a9 100644 --- a/packages/event-handler/src/rest/Router.ts +++ b/packages/event-handler/src/rest/Router.ts @@ -350,6 +350,7 @@ class Router { await pipeline(nodeStream, resStream); } else { resStream.write(''); + resStream.end(); } } From 18630ef7ab55481b4289349c3317f5c550f31c1d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 14:39:17 +0100 Subject: [PATCH 246/255] chore(deps): bump vscode/devcontainers/javascript-node from `9b4b7e4` to `fd373e0` in /.devcontainer (#4652) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .devcontainer/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 4fee1b0c3c..50ccd4c7b0 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,5 +1,5 @@ # See here for image contents: https://github.com/microsoft/vscode-dev-containers/blob/v0.212.0/containers/javascript-node/.devcontainer/base.Dockerfile -FROM mcr.microsoft.com/vscode/devcontainers/javascript-node@sha256:9b4b7e41bc59ec3cbb0a2e06a231a067fc013f21187d0931d63db122d0a6eca6 +FROM mcr.microsoft.com/vscode/devcontainers/javascript-node@sha256:fd373e0409247e4ba0b03bcbe97419437caeaa71a8ccd835836a94a4a36820fb # Install fnm to manage Node.js versions RUN curl -fsSL https://fnm.vercel.app/install -o /tmp/install \ From f0720890881436e2c635c17901eda7266b9e21d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 14:42:24 +0100 Subject: [PATCH 247/255] chore(deps): bump @types/aws-lambda from 8.10.155 to 8.10.156 (#4653) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Swopnil Dangol --- examples/app/package.json | 4 ++-- package-lock.json | 12 ++++++------ package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 1fbcd71419..4eee324b13 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -29,7 +29,7 @@ "#errors": "./functions/commons/errors.js" }, "devDependencies": { - "@types/aws-lambda": "^8.10.155", + "@types/aws-lambda": "^8.10.156", "@types/node": "24.7.2", "aws-cdk-lib": "^2.219.0", "constructs": "^10.4.2", @@ -48,7 +48,7 @@ "@aws-sdk/client-ssm": "^3.908.0", "@aws-sdk/lib-dynamodb": "^3.908.0", "@middy/core": "^4.7.0", - "@types/aws-lambda": "^8.10.155", + "@types/aws-lambda": "^8.10.156", "@types/node": "24.7.2", "aws-cdk": "^2.1030.0", "constructs": "^10.4.2", diff --git a/package-lock.json b/package-lock.json index 2ba86f8e5d..4730c0134f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ ], "devDependencies": { "@biomejs/biome": "^2.2.6", - "@types/aws-lambda": "^8.10.155", + "@types/aws-lambda": "^8.10.156", "@types/node": "^24.7.2", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", @@ -59,7 +59,7 @@ "@aws-sdk/client-ssm": "^3.908.0", "@aws-sdk/lib-dynamodb": "^3.908.0", "@middy/core": "^4.7.0", - "@types/aws-lambda": "^8.10.155", + "@types/aws-lambda": "^8.10.156", "@types/node": "24.7.2", "aws-cdk": "^2.1030.0", "constructs": "^10.4.2", @@ -67,7 +67,7 @@ "typescript": "^5.9.3" }, "devDependencies": { - "@types/aws-lambda": "^8.10.155", + "@types/aws-lambda": "^8.10.156", "@types/node": "24.7.2", "aws-cdk-lib": "^2.219.0", "constructs": "^10.4.2", @@ -5016,9 +5016,9 @@ "license": "MIT" }, "node_modules/@types/aws-lambda": { - "version": "8.10.155", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.155.tgz", - "integrity": "sha512-wd1XgoL0gy/ybo7WozUKQBd+IOgUkdfG6uUGI0fQOTEq06FBFdO7tmPDSxgjkFkl8GlfApvk5TvqZlAl0g+Lbg==", + "version": "8.10.156", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.156.tgz", + "integrity": "sha512-LElQP+QliVWykC7OF8dNr04z++HJCMO2lF7k9HuKoSDARqhcjHq8MzbrRwujCSDeBHIlvaimbuY/tVZL36KXFQ==", "dev": true, "license": "MIT" }, diff --git a/package.json b/package.json index 9068abc2f6..acb3088242 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript#readme", "devDependencies": { "@biomejs/biome": "^2.2.6", - "@types/aws-lambda": "^8.10.155", + "@types/aws-lambda": "^8.10.156", "@types/node": "^24.7.2", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", From a06a16f46c39320053536f4c965df316eb7147d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 14:54:09 +0100 Subject: [PATCH 248/255] chore(deps-dev): bump avro-js from 1.12.0 to 1.12.1 (#4655) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- packages/kafka/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4730c0134f..9d0ad10d6d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5984,9 +5984,9 @@ } }, "node_modules/avro-js": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/avro-js/-/avro-js-1.12.0.tgz", - "integrity": "sha512-mBhOjtHHua2MHrrgQ71YKKTGfZpS1sPvgL+QcCQ5SkUyp6qLkeTsCnQXUmATfpiOvoXB6CczzFEqn5UKbPUn3Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/avro-js/-/avro-js-1.12.1.tgz", + "integrity": "sha512-P8gTa620GdU/p1XXkWJup9Nkth3aEExgw8+0eyrKBrFLBW587iXOKyQfQ+TkgzyxUcMm8wo45KmPKujvPPRpsQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -10754,7 +10754,7 @@ "@standard-schema/spec": "^1.0.0" }, "devDependencies": { - "avro-js": "^1.12.0", + "avro-js": "^1.12.1", "protobufjs": "^7.5.4", "zod": "^4.1.12" }, diff --git a/packages/kafka/package.json b/packages/kafka/package.json index 6bb4b5f8c1..1f3f1fb13c 100644 --- a/packages/kafka/package.json +++ b/packages/kafka/package.json @@ -115,7 +115,7 @@ } }, "devDependencies": { - "avro-js": "^1.12.0", + "avro-js": "^1.12.1", "protobufjs": "^7.5.4", "zod": "^4.1.12" } From f00f7edcfd27788f8909d62a1519b317ee465a48 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 14:57:08 +0100 Subject: [PATCH 249/255] chore(deps): bump aws-xray-sdk-core from 3.10.3 to 3.11.0 (#4656) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Swopnil Dangol --- package-lock.json | 9 +++++---- packages/tracer/package.json | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9d0ad10d6d..03f2fba4b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6432,12 +6432,13 @@ } }, "node_modules/aws-xray-sdk-core": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/aws-xray-sdk-core/-/aws-xray-sdk-core-3.10.3.tgz", - "integrity": "sha512-bltsLAr4juMJJ2tT5/L/CtwUGIvHihtPe6SO/z3jjOD73PHhOYxcuwCMFFyTbTy5S4WThJO32oZk7r+pg3ZoCQ==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/aws-xray-sdk-core/-/aws-xray-sdk-core-3.11.0.tgz", + "integrity": "sha512-b7RRs3/twrsCxb113ZgycyaYcXJUQADFMKTiAfzRJu/2hBD2UZkyrjrh8BNTwQ5PUJJmHLoapv1uhpJFk3qKvQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.4.1", + "@aws/lambda-invoke-store": "^0.0.1", "@smithy/service-error-classification": "^2.0.4", "@types/cls-hooked": "^4.3.3", "atomic-batcher": "^1.0.2", @@ -10915,7 +10916,7 @@ "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.27.0", - "aws-xray-sdk-core": "^3.10.3" + "aws-xray-sdk-core": "^3.11.0" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", diff --git a/packages/tracer/package.json b/packages/tracer/package.json index 90a7ebfb1d..d7ec8ed8e1 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -88,7 +88,7 @@ }, "dependencies": { "@aws-lambda-powertools/commons": "2.27.0", - "aws-xray-sdk-core": "^3.10.3" + "aws-xray-sdk-core": "^3.11.0" }, "keywords": [ "aws", From 466ddfa998e0fd9daa57a9ee8e01dda6423b75fe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 15:18:19 +0100 Subject: [PATCH 250/255] chore(deps): bump @types/node from 24.7.2 to 24.8.0 (#4654) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Swopnil Dangol --- examples/app/package.json | 4 ++-- package-lock.json | 12 ++++++------ package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 4eee324b13..2442029625 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -30,7 +30,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.156", - "@types/node": "24.7.2", + "@types/node": "24.8.0", "aws-cdk-lib": "^2.219.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -49,7 +49,7 @@ "@aws-sdk/lib-dynamodb": "^3.908.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.156", - "@types/node": "24.7.2", + "@types/node": "24.8.0", "aws-cdk": "^2.1030.0", "constructs": "^10.4.2", "esbuild": "^0.25.11", diff --git a/package-lock.json b/package-lock.json index 03f2fba4b5..433ad38564 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.6", "@types/aws-lambda": "^8.10.156", - "@types/node": "^24.7.2", + "@types/node": "^24.8.0", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.2.4", @@ -60,7 +60,7 @@ "@aws-sdk/lib-dynamodb": "^3.908.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.156", - "@types/node": "24.7.2", + "@types/node": "24.8.0", "aws-cdk": "^2.1030.0", "constructs": "^10.4.2", "esbuild": "^0.25.11", @@ -68,7 +68,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.156", - "@types/node": "24.7.2", + "@types/node": "24.8.0", "aws-cdk-lib": "^2.219.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -5104,9 +5104,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.7.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.2.tgz", - "integrity": "sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.8.0.tgz", + "integrity": "sha512-5x08bUtU8hfboMTrJ7mEO4CpepS9yBwAqcL52y86SWNmbPX8LVbNs3EP4cNrIZgdjk2NAlP2ahNihozpoZIxSg==", "license": "MIT", "dependencies": { "undici-types": "~7.14.0" diff --git a/package.json b/package.json index acb3088242..11face9b86 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.6", "@types/aws-lambda": "^8.10.156", - "@types/node": "^24.7.2", + "@types/node": "^24.8.0", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.2.4", From 5199d3e3a5000d3b3b5f2906f3d62da5fc1c96ec Mon Sep 17 00:00:00 2001 From: Stefano Vozza Date: Fri, 17 Oct 2025 09:18:26 +0100 Subject: [PATCH 251/255] improv(commons): Make X-rRay trace ID access more robust (#4658) --- package-lock.json | 12 ++ packages/commons/package.json | 3 + packages/commons/src/envUtils.ts | 27 ++- packages/commons/tests/unit/envUtils.test.ts | 198 ++++++++++++------- 4 files changed, 158 insertions(+), 82 deletions(-) diff --git a/package-lock.json b/package-lock.json index 433ad38564..49a40b6e28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10687,10 +10687,22 @@ "name": "@aws-lambda-powertools/commons", "version": "2.27.0", "license": "MIT-0", + "dependencies": { + "@aws/lambda-invoke-store": "0.1.0" + }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing" } }, + "packages/commons/node_modules/@aws/lambda-invoke-store": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.1.0.tgz", + "integrity": "sha512-I1y5yahbSFTfKldV4qoKv2IEZ20QOhn5rPvWwGnswZ8hssN7tsLANLg9tL8dp2klz2MZDGL5jZrvBwplIWtM8A==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, "packages/event-handler": { "name": "@aws-lambda-powertools/event-handler", "version": "2.27.0", diff --git a/packages/commons/package.json b/packages/commons/package.json index 5d4bb706b8..6ad22ac5bf 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -110,6 +110,9 @@ "serverless", "nodejs" ], + "dependencies": { + "@aws/lambda-invoke-store": "0.1.0" + }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing" } diff --git a/packages/commons/src/envUtils.ts b/packages/commons/src/envUtils.ts index cfc4b2adfa..751d109bfe 100644 --- a/packages/commons/src/envUtils.ts +++ b/packages/commons/src/envUtils.ts @@ -1,3 +1,4 @@ +import { InvokeStore } from '@aws/lambda-invoke-store'; import { POWERTOOLS_DEV_ENV_VAR, POWERTOOLS_SERVICE_NAME_ENV_VAR, @@ -249,15 +250,19 @@ const getServiceName = (): string => { }; /** - * Get the AWS X-Ray Trace data from the environment variable. + * Get the AWS X-Ray Trace data from the lambda RIC async context or the `_X_AMZN_TRACE_ID` environment variable. * - * The method parses the environment variable `_X_AMZN_TRACE_ID` and returns an object with the key-value pairs. + * Checks the async context first and if that returns undefined, falls back to the environment variable + * + * The method parses the value and returns an object with the key-value pairs. */ const getXrayTraceDataFromEnv = (): Record | undefined => { - const xRayTraceEnv = getStringFromEnv({ - key: XRAY_TRACE_ID_ENV_VAR, - defaultValue: '', - }); + const xRayTraceEnv = + InvokeStore.getXRayTraceId() ?? + getStringFromEnv({ + key: XRAY_TRACE_ID_ENV_VAR, + defaultValue: '', + }); if (xRayTraceEnv === '') { return undefined; } @@ -280,8 +285,10 @@ const getXrayTraceDataFromEnv = (): Record | undefined => { /** * Determine if the current invocation is part of a sampled X-Ray trace. * - * The AWS X-Ray Trace data available in the environment variable has this format: + * The AWS X-Ray Trace data is available in either the RIC async context or the `_X_AMZN_TRACE_ID` environment variable has this format: * `Root=1-5759e988-bd862e3fe1be46a994272793;Parent=557abcec3ee5a047;Sampled=1`, + * + * Checks the async context first and if that returns undefined, falls back to the environment variable */ const isRequestXRaySampled = (): boolean => { const xRayTraceData = getXrayTraceDataFromEnv(); @@ -289,9 +296,11 @@ const isRequestXRaySampled = (): boolean => { }; /** - * Get the value of the `_X_AMZN_TRACE_ID` environment variable. + * AWS X-Ray Trace id from the lambda RIC async context or the `_X_AMZN_TRACE_ID` environment variable. + * + * Checks the async context first and if that returns undefined, falls back to the environment variable * - * The AWS X-Ray Trace data available in the environment variable has this format: + * The AWS X-Ray Trace data has this format: * `Root=1-5759e988-bd862e3fe1be46a994272793;Parent=557abcec3ee5a047;Sampled=1`, * * The actual Trace ID is: `1-5759e988-bd862e3fe1be46a994272793`. diff --git a/packages/commons/tests/unit/envUtils.test.ts b/packages/commons/tests/unit/envUtils.test.ts index 1c32bceb3d..74f7df741d 100644 --- a/packages/commons/tests/unit/envUtils.test.ts +++ b/packages/commons/tests/unit/envUtils.test.ts @@ -1,4 +1,5 @@ -import { beforeEach, describe, expect, it } from 'vitest'; +import { InvokeStore } from '@aws/lambda-invoke-store'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { getBooleanFromEnv, getNumberFromEnv, @@ -10,16 +11,14 @@ import { } from '../../src/envUtils.js'; describe('Functions: envUtils', () => { - const env = process.env; - beforeEach(() => { - process.env = { ...env }; + vi.unstubAllEnvs(); }); describe('Function: getStringFromEnv', () => { it('returns the value of the environment variable', () => { // Prepare - process.env.TEST_ENV = 'testValue'; + vi.stubEnv('TEST_ENV', 'testValue'); // Act const result = getStringFromEnv({ key: 'TEST_ENV' }); @@ -29,9 +28,6 @@ describe('Functions: envUtils', () => { }); it('returns the default value if the environment variable is not set', () => { - // Prepare - process.env.TEST_ENV = undefined; - // Act const result = getStringFromEnv({ key: 'TEST_ENV', @@ -43,9 +39,6 @@ describe('Functions: envUtils', () => { }); it('throws an error if the environment variable is not set', () => { - // Prepare - process.env.TEST_ENV = undefined; - // Act & Assess expect(() => getStringFromEnv({ key: 'TEST_ENV' })).toThrowError( 'Environment variable TEST_ENV is required' @@ -54,7 +47,7 @@ describe('Functions: envUtils', () => { it('returns the trimmed value of the environment variable', () => { // Prepare - process.env.TEST_ENV = ' testValue '; + vi.stubEnv('TEST_ENV', ' testValue '); // Act const result = getStringFromEnv({ key: 'TEST_ENV' }); @@ -64,9 +57,6 @@ describe('Functions: envUtils', () => { }); it('uses the provided error message if the environment variable is not set', () => { - // Prepare - process.env.TEST_ENV = undefined; - // Act & Assess expect(() => getStringFromEnv({ @@ -80,7 +70,7 @@ describe('Functions: envUtils', () => { describe('Function: getNumberFromEnv', () => { it('returns the value of the environment variable as a number', () => { // Prepare - process.env.TEST_ENV = '123'; + vi.stubEnv('TEST_ENV', '123'); // Act const result = getNumberFromEnv({ key: 'TEST_ENV' }); @@ -90,9 +80,6 @@ describe('Functions: envUtils', () => { }); it('returns the default value if the environment variable is not set', () => { - // Prepare - process.env.TEST_ENV = undefined; - // Act const result = getNumberFromEnv({ key: 'TEST_ENV', @@ -105,7 +92,7 @@ describe('Functions: envUtils', () => { it('throws an error if the environment variable is not a number', () => { // Prepare - process.env.TEST_ENV = 'notANumber'; + vi.stubEnv('TEST_ENV', 'notANumber'); // Act & Assess expect(() => getNumberFromEnv({ key: 'TEST_ENV' })).toThrowError( @@ -117,7 +104,7 @@ describe('Functions: envUtils', () => { describe('Function: getBooleanFromEnv', () => { it('returns true if the environment variable is set to a truthy value', () => { // Prepare - process.env.TEST_ENV = 'true'; + vi.stubEnv('TEST_ENV', 'true'); // Act const result = getBooleanFromEnv({ key: 'TEST_ENV' }); @@ -128,7 +115,7 @@ describe('Functions: envUtils', () => { it('returns false if the environment variable is set to a falsy value', () => { // Prepare - process.env.TEST_ENV = 'false'; + vi.stubEnv('TEST_ENV', 'false'); // Act const result = getBooleanFromEnv({ key: 'TEST_ENV' }); @@ -138,9 +125,6 @@ describe('Functions: envUtils', () => { }); it('returns the default value if the environment variable is not set', () => { - // Prepare - process.env.TEST_ENV = undefined; - // Act const result = getBooleanFromEnv({ key: 'TEST_ENV', @@ -153,7 +137,7 @@ describe('Functions: envUtils', () => { it('throws an error if the environment variable value is not a boolean', () => { // Prepare - process.env.TEST_ENV = 'notABoolean'; + vi.stubEnv('TEST_ENV', 'notABoolean'); // Act & Assess expect(() => getBooleanFromEnv({ key: 'TEST_ENV' })).toThrowError( @@ -172,7 +156,7 @@ describe('Functions: envUtils', () => { 'returns true if the environment variable is set to a truthy value: %s', (value, expected) => { // Prepare - process.env.TEST_ENV = value; + vi.stubEnv('TEST_ENV', value); // Act const result = getBooleanFromEnv({ @@ -196,7 +180,7 @@ describe('Functions: envUtils', () => { 'returns false if the environment variable is set to a falsy value: %s', (value, expected) => { // Prepare - process.env.TEST_ENV = value; + vi.stubEnv('TEST_ENV', value); // Act const result = getBooleanFromEnv({ @@ -213,7 +197,7 @@ describe('Functions: envUtils', () => { describe('Function: isDevMode', () => { it('returns true if the environment variable is set to a truthy value', () => { // Prepare - process.env.POWERTOOLS_DEV = 'true'; + vi.stubEnv('POWERTOOLS_DEV', 'true'); // Act const result = isDevMode(); @@ -224,7 +208,7 @@ describe('Functions: envUtils', () => { it('returns false if the environment variable is set to a falsy value', () => { // Prepare - process.env.POWERTOOLS_DEV = 'false'; + vi.stubEnv('POWERTOOLS_DEV', 'false'); // Act const result = isDevMode(); @@ -234,9 +218,6 @@ describe('Functions: envUtils', () => { }); it('returns false if the environment variable is not set', () => { - // Prepare - process.env.POWERTOOLS_DEV = undefined; - // Act const result = isDevMode(); @@ -248,7 +229,7 @@ describe('Functions: envUtils', () => { describe('Function: getServiceName', () => { it('returns the service name from the environment variable', () => { // Prepare - process.env.POWERTOOLS_SERVICE_NAME = 'testService'; + vi.stubEnv('POWERTOOLS_SERVICE_NAME', 'testService'); // Act const result = getServiceName(); @@ -259,7 +240,7 @@ describe('Functions: envUtils', () => { it('returns an empty string if the environment variable is not set', () => { // Prepare - process.env.POWERTOOLS_SERVICE_NAME = undefined; + vi.stubEnv('POWERTOOLS_SERVICE_NAME', undefined); // Act const result = getServiceName(); @@ -270,64 +251,135 @@ describe('Functions: envUtils', () => { }); describe('Function: getXrayTraceIdFromEnv', () => { - it('returns the value of the environment variable _X_AMZN_TRACE_ID', () => { + it.each<{ description: string; traceData: string; expected: string }>([ + { + description: + 'returns the value of the environment variable _X_AMZN_TRACE_ID', + traceData: 'abcd123456789', + expected: 'abcd123456789', + }, + { + description: + 'returns the value of the Root X-Ray segment ID properly formatted', + traceData: + 'Root=1-5759e988-bd862e3fe1be46a994272793;Parent=557abcec3ee5a047;Sampled=1', + expected: '1-5759e988-bd862e3fe1be46a994272793', + }, + ])('$description', ({ traceData, expected }) => { // Prepare - process.env._X_AMZN_TRACE_ID = 'abcd123456789'; + vi.stubEnv('_X_AMZN_TRACE_ID', traceData); // Act const value = getXRayTraceIdFromEnv(); // Assess - expect(value).toEqual('abcd123456789'); + expect(value).toEqual(expected); }); - it('returns the value of the Root X-Ray segment ID properly formatted', () => { - // Prepare - process.env._X_AMZN_TRACE_ID = - 'Root=1-5759e988-bd862e3fe1be46a994272793;Parent=557abcec3ee5a047;Sampled=1'; - - // Act - const value = getXRayTraceIdFromEnv(); - - // Assess - expect(value).toEqual('1-5759e988-bd862e3fe1be46a994272793'); + it.each<{ description: string; traceData: string; expected: string }>([ + { + description: 'returns trace id from async context', + traceData: 'xyz987654321', + expected: 'xyz987654321', + }, + { + description: + 'returns the Root X-Ray segment ID properly formatted from async context', + traceData: + 'Root=1-6849f099-ce973f4ea2c57e4f9a382904;Parent=668bfc7d9aa5b120;Sampled=0', + expected: '1-6849f099-ce973f4ea2c57e4f9a382904', + }, + ])('$description', ({ traceData, expected }) => { + InvokeStore.run( + { + [InvokeStore.PROTECTED_KEYS.X_RAY_TRACE_ID]: traceData, + }, + () => { + // Act + const value = getXRayTraceIdFromEnv(); + + // Assess + expect(value).toEqual(expected); + } + ); }); }); describe('Function: isRequestXRaySampled', () => { - it('returns true if the Sampled flag is set in the _X_AMZN_TRACE_ID environment variable', () => { + it.each<{ + description: string; + traceData: string | undefined; + expected: boolean; + }>([ + { + description: + 'returns true if the Sampled flag is set in the _X_AMZN_TRACE_ID environment variable', + traceData: + 'Root=1-5759e988-bd862e3fe1be46a994272793;Parent=557abcec3ee5a047;Sampled=1', + expected: true, + }, + { + description: + 'returns false if the Sampled flag is not set in the _X_AMZN_TRACE_ID environment variable', + traceData: + 'Root=1-5759e988-bd862e3fe1be46a994272793;Parent=557abcec3ee5a047', + expected: false, + }, + { + description: + 'returns false when no _X_AMZN_TRACE_ID environment variable is present', + traceData: undefined, + expected: false, + }, + ])('$description', ({ traceData, expected }) => { // Prepare - process.env._X_AMZN_TRACE_ID = - 'Root=1-5759e988-bd862e3fe1be46a994272793;Parent=557abcec3ee5a047;Sampled=1'; + vi.stubEnv('_X_AMZN_TRACE_ID', traceData); // Act const value = isRequestXRaySampled(); // Assess - expect(value).toEqual(true); + expect(value).toEqual(expected); }); - it('returns false if the Sampled flag is not set in the _X_AMZN_TRACE_ID environment variable', () => { - // Prepare - process.env._X_AMZN_TRACE_ID = - 'Root=1-5759e988-bd862e3fe1be46a994272793;Parent=557abcec3ee5a047'; - - // Act - const value = isRequestXRaySampled(); - - // Assess - expect(value).toEqual(false); - }); - - it('returns false when no _X_AMZN_TRACE_ID environment variable is present', () => { - // Prepare - process.env._X_AMZN_TRACE_ID = undefined; - - // Act - const value = isRequestXRaySampled(); - - // Assess - expect(value).toEqual(false); + it.each<{ + description: string; + traceData: string | undefined; + expected: boolean; + }>([ + { + description: + 'returns true if the Sampled flag is set from async context', + traceData: + 'Root=1-7a5bc3d2-ef456789abcdef012345678;Parent=9f8e7d6c5b4a3210;Sampled=1', + expected: true, + }, + { + description: + 'returns false if the Sampled flag is not set from async context', + traceData: + 'Root=1-8b6cd4e3-fg567890bcdefg123456789;Parent=0g9f8e7d6c5b4321', + expected: false, + }, + { + description: + 'returns false when no trace ID is present in async context', + traceData: undefined, + expected: false, + }, + ])('$description', ({ traceData, expected }) => { + InvokeStore.run( + { + [InvokeStore.PROTECTED_KEYS.X_RAY_TRACE_ID]: traceData, + }, + () => { + // Act + const value = isRequestXRaySampled(); + + // Assess + expect(value).toEqual(expected); + } + ); }); }); }); From 6c78656a758f50ab8ffd419b8646de562e2f22b4 Mon Sep 17 00:00:00 2001 From: Connor Kirkpatrick <17845406+ConnorKirk@users.noreply.github.com> Date: Fri, 17 Oct 2025 10:21:06 +0100 Subject: [PATCH 252/255] chore: update CONTRIBUTING.md (#4659) Co-authored-by: Stefano Vozza --- CONTRIBUTING.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4f49440b26..67e4f82f0c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -22,7 +22,11 @@ Thank you for your interest in contributing to our project. Whether it's a [bug report](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new?assignees=&labels=type%2Fbug%2Ctriage&projects=aws-powertools%2F7&template=bug_report.yml&title=Bug%3A+TITLE), [new feature](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new?assignees=&labels=type%2Ffeature-request%2Ctriage&projects=aws-powertools%2F7&template=feature_request.yml&title=Feature+request%3A+TITLE), [correction](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose), or [additional documentation](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new?assignees=&labels=area%2Fdocumentation%2Ctriage&projects=aws-powertools%2F7&template=documentation_improvements.yml&title=Docs%3A+TITLE), we greatly value feedback and contributions from our community. -Please read through this document before submitting any issues or pull requests to ensure we have all the necessary information to effectively respond to your bug report or contribution. +We encourage contributions from the community and we will work with contributors to merge their pull requests. +Rarely, we may close pull requests that do not meet our guidelines specified in CONTRIBUTING.md, or will require unreasonable effort to meet our quality bar. + +Please read through this document before submitting any issues or pull requests to ensure we have all the necessary +information to effectively respond to your bug report or contribution. ## Reporting Bugs/Feature Requests From 30a01b4c1a1aa95f97deab76fd680b1fede395f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Oct 2025 15:50:39 +0100 Subject: [PATCH 253/255] chore(deps): bump @types/node from 24.8.0 to 24.8.1 (#4661) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/app/package.json | 4 ++-- package-lock.json | 12 ++++++------ package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 2442029625..aeacd04a18 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -30,7 +30,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.156", - "@types/node": "24.8.0", + "@types/node": "24.8.1", "aws-cdk-lib": "^2.219.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -49,7 +49,7 @@ "@aws-sdk/lib-dynamodb": "^3.908.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.156", - "@types/node": "24.8.0", + "@types/node": "24.8.1", "aws-cdk": "^2.1030.0", "constructs": "^10.4.2", "esbuild": "^0.25.11", diff --git a/package-lock.json b/package-lock.json index 49a40b6e28..cc430f3ec9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.6", "@types/aws-lambda": "^8.10.156", - "@types/node": "^24.8.0", + "@types/node": "^24.8.1", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.2.4", @@ -60,7 +60,7 @@ "@aws-sdk/lib-dynamodb": "^3.908.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.156", - "@types/node": "24.8.0", + "@types/node": "24.8.1", "aws-cdk": "^2.1030.0", "constructs": "^10.4.2", "esbuild": "^0.25.11", @@ -68,7 +68,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.156", - "@types/node": "24.8.0", + "@types/node": "24.8.1", "aws-cdk-lib": "^2.219.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", @@ -5104,9 +5104,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.8.0.tgz", - "integrity": "sha512-5x08bUtU8hfboMTrJ7mEO4CpepS9yBwAqcL52y86SWNmbPX8LVbNs3EP4cNrIZgdjk2NAlP2ahNihozpoZIxSg==", + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.8.1.tgz", + "integrity": "sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q==", "license": "MIT", "dependencies": { "undici-types": "~7.14.0" diff --git a/package.json b/package.json index 11face9b86..8e96962050 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.6", "@types/aws-lambda": "^8.10.156", - "@types/node": "^24.8.0", + "@types/node": "^24.8.1", "@vitest/coverage-v8": "^3.2.4", "husky": "^9.1.7", "lint-staged": "^16.2.4", From a0be142c415522fec4f987b3c91b53706ba62f46 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Oct 2025 16:13:17 +0100 Subject: [PATCH 254/255] chore(deps): bump the aws-sdk-v3 group across 1 directory with 88 updates (#4664) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/app/package.json | 4 +- examples/snippets/package.json | 10 +- package-lock.json | 2902 ++++++++++++++--------------- packages/idempotency/package.json | 4 +- packages/metrics/package.json | 2 +- packages/parameters/package.json | 10 +- packages/testing/package.json | 2 +- packages/tracer/package.json | 4 +- 8 files changed, 1469 insertions(+), 1469 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index aeacd04a18..566a03e4f0 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -45,8 +45,8 @@ "@aws-lambda-powertools/metrics": "^2.27.0", "@aws-lambda-powertools/parameters": "^2.27.0", "@aws-lambda-powertools/tracer": "^2.27.0", - "@aws-sdk/client-ssm": "^3.908.0", - "@aws-sdk/lib-dynamodb": "^3.908.0", + "@aws-sdk/client-ssm": "^3.913.0", + "@aws-sdk/lib-dynamodb": "^3.913.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.156", "@types/node": "24.8.1", diff --git a/examples/snippets/package.json b/examples/snippets/package.json index ae4d2d8572..9a40ddf38a 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -34,11 +34,11 @@ "@aws-lambda-powertools/parameters": "^2.27.0", "@aws-lambda-powertools/parser": "^2.27.0", "@aws-lambda-powertools/tracer": "^2.27.0", - "@aws-sdk/client-appconfigdata": "^3.908.0", - "@aws-sdk/client-dynamodb": "^3.908.0", - "@aws-sdk/client-secrets-manager": "^3.908.0", - "@aws-sdk/client-ssm": "^3.908.0", - "@aws-sdk/util-dynamodb": "^3.908.0", + "@aws-sdk/client-appconfigdata": "^3.913.0", + "@aws-sdk/client-dynamodb": "^3.913.0", + "@aws-sdk/client-secrets-manager": "^3.913.0", + "@aws-sdk/client-ssm": "^3.913.0", + "@aws-sdk/util-dynamodb": "^3.913.0", "@middy/core": "^4.7.0", "@redis/client": "^5.8.3", "@valkey/valkey-glide": "^2.1.1", diff --git a/package-lock.json b/package-lock.json index cc430f3ec9..c6a39567de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,8 +56,8 @@ "@aws-lambda-powertools/metrics": "^2.27.0", "@aws-lambda-powertools/parameters": "^2.27.0", "@aws-lambda-powertools/tracer": "^2.27.0", - "@aws-sdk/client-ssm": "^3.908.0", - "@aws-sdk/lib-dynamodb": "^3.908.0", + "@aws-sdk/client-ssm": "^3.913.0", + "@aws-sdk/lib-dynamodb": "^3.913.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.156", "@types/node": "24.8.1", @@ -95,11 +95,11 @@ "@aws-lambda-powertools/parameters": "^2.27.0", "@aws-lambda-powertools/parser": "^2.27.0", "@aws-lambda-powertools/tracer": "^2.27.0", - "@aws-sdk/client-appconfigdata": "^3.908.0", - "@aws-sdk/client-dynamodb": "^3.908.0", - "@aws-sdk/client-secrets-manager": "^3.908.0", - "@aws-sdk/client-ssm": "^3.908.0", - "@aws-sdk/util-dynamodb": "^3.908.0", + "@aws-sdk/client-appconfigdata": "^3.913.0", + "@aws-sdk/client-dynamodb": "^3.913.0", + "@aws-sdk/client-secrets-manager": "^3.913.0", + "@aws-sdk/client-ssm": "^3.913.0", + "@aws-sdk/util-dynamodb": "^3.913.0", "@middy/core": "^4.7.0", "@redis/client": "^5.8.3", "@valkey/valkey-glide": "^2.1.1", @@ -883,50 +883,50 @@ "link": true }, "node_modules/@aws-sdk/client-appconfigdata": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.908.0.tgz", - "integrity": "sha512-tnxI3wxoH4LfMZdc3h/Wckef+0vJlV/CGJ6hAfB/13E9p4Wg8iXn44OI5EoizwpoA/sSjdFjl4ujWMP/U8VzKw==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.913.0.tgz", + "integrity": "sha512-9OaCifX93StsQD7xbLlSMn8aI87u9md+gN3jIKzYO1qrNBnxMIrLarx2v4Cjrz0X/MqDFS2e/fFW0QdDTb5g2Q==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", - "@smithy/util-stream": "^4.5.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", + "@smithy/util-stream": "^4.5.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -935,49 +935,49 @@ } }, "node_modules/@aws-sdk/client-appsync": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-appsync/-/client-appsync-3.908.0.tgz", - "integrity": "sha512-TZOKJvVH3q6DHwQl/OA3qCrzhVDnbpyLQkd1eN90sBTWCXYUWlpsY9Ap2N/Hr6+Yu+I1Cce1h9iYN1kBvHBtXA==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appsync/-/client-appsync-3.913.0.tgz", + "integrity": "sha512-ZCMU9dPe19HRpecID9igT6JlygxjoiaWwAbi3l9jOHXhgZ1k7vgtHLjLn7mlTfd1bgVG6FTv39HLTm0fmpJrSA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", - "@smithy/util-stream": "^4.5.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", + "@smithy/util-stream": "^4.5.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -986,50 +986,50 @@ } }, "node_modules/@aws-sdk/client-cloudcontrol": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudcontrol/-/client-cloudcontrol-3.908.0.tgz", - "integrity": "sha512-zV2FCEStVqZcX4qa3puUhkR9DF2djyl0z/Do5llzH+/tqZkDSDZLjsCknnaylcBApvZbe5BCXXMkchNvzIKXvw==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudcontrol/-/client-cloudcontrol-3.913.0.tgz", + "integrity": "sha512-lZPGkBb6zcVBII3X8NhVtn+iASmH9sVEOzDzwKg8FkHIpcmV5EhQey+v2Ov+oa8zvLncx7GOl5RqaxHVi8EKQg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.0", + "@smithy/util-waiter": "^4.2.2", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, @@ -1038,50 +1038,50 @@ } }, "node_modules/@aws-sdk/client-cloudformation": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.908.0.tgz", - "integrity": "sha512-390QRnJnIgKNoVg+GiBbeirCz5G3eqrJUZAZMP0lp8HV94+CexoTMtnV35XmebFtt0C3P0L6ZlTL4HX6T6//Bw==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.913.0.tgz", + "integrity": "sha512-7eqa/nfvuOdal5w1nY1qlN/GNIOOiioLi+7aMYnrUNDQulWHlTzHTDe43LqkQAbBYtgjuzPLEzT0mnTdbbWQEg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.0", + "@smithy/util-waiter": "^4.2.2", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, @@ -1090,52 +1090,52 @@ } }, "node_modules/@aws-sdk/client-cloudwatch": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.908.0.tgz", - "integrity": "sha512-r/c6Eh06FSPGMkLPeEu9VvO7hEn01rf4a9lFFfapCsAieQoNwuOw2ZMOR6OmuhpOZ1H02bU41mQqr+SCNMbqfw==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.913.0.tgz", + "integrity": "sha512-qfC7HW3MZUQUQ1V/7NJFEUJ6UicSDtIwn9BfdtbzCVP5xpz0zc1dGmH9kOd/xgcu6JzRfx8kNM8lp0q3syejdA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-compression": "^4.3.1", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-compression": "^4.3.3", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.0", + "@smithy/util-waiter": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -1143,51 +1143,51 @@ } }, "node_modules/@aws-sdk/client-cloudwatch-logs": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.908.0.tgz", - "integrity": "sha512-UHozlv3xajFaWV0qltEeT3ApN4rHC6hBxywDkCxCUK+avkzaQFpExnCCkc6EU+sZm4SFFI4zImVYThvggYj3Lw==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.913.0.tgz", + "integrity": "sha512-ztaUBCI6ps90O5sERy5ZP8aGC2+Ks9kvOJrdpGFMKcTVtyHP1xTB/FDfNvmz2s25S8W7yeCokvs1fvoKcLyniQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/eventstream-serde-browser": "^4.2.0", - "@smithy/eventstream-serde-config-resolver": "^4.3.0", - "@smithy/eventstream-serde-node": "^4.2.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/eventstream-serde-browser": "^4.2.2", + "@smithy/eventstream-serde-config-resolver": "^4.3.2", + "@smithy/eventstream-serde-node": "^4.2.2", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" @@ -1197,48 +1197,48 @@ } }, "node_modules/@aws-sdk/client-codebuild": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-codebuild/-/client-codebuild-3.908.0.tgz", - "integrity": "sha512-RnfwyKRPoRBtXMKz6dLaagfebnKiTr8iIOoOr6Pe9i6w5w+POZ1Jvoy922iqBX/drv1CC6bNmIYw5zllmOD9Ag==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-codebuild/-/client-codebuild-3.913.0.tgz", + "integrity": "sha512-Q1xdA77HvSJYGDTQpQJCrkw8GQ26/+Uq+i5Q+A5mVQW2+vJNdjA770fAe64FTIodFpHxkPMBr2m0wr8UlLF8uQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -1247,48 +1247,48 @@ } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.908.0.tgz", - "integrity": "sha512-XEva6l07dtF+6QNzTZHB+PEOX03sdcOudh+XVa4UjlUPlqrl/LAk/MzRxbw6pHScG5DPMx6Iyeicm7pJBOTdYg==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.913.0.tgz", + "integrity": "sha512-TdEwasoXnLIb90z7NL1vLbEprzY0vdRqZH97ubIUDo8EaJ6WrJ35Um5g0rcnWKR6C+P9lKKI4mVv2BI2EwY94Q==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -1297,51 +1297,51 @@ } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.908.0.tgz", - "integrity": "sha512-8706EETITZZ5V7kwyxcZvDk1LDDaoUi5uZyh9jv0fyoKZtQHyNjsNHCpRWTW/DN/K/xy5MG1foMrCvdAqs0H5A==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.913.0.tgz", + "integrity": "sha512-J9qRCKknNwdUyGJWZUFHhWbYaZZ3r5auY8VxaVtiRc08PhQXTCZd6yFg0dr6uNp3HtHt2inQu5/NQnrJekXp1w==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-endpoint-discovery": "3.910.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.0", + "@smithy/util-waiter": "^4.2.2", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, @@ -1350,51 +1350,51 @@ } }, "node_modules/@aws-sdk/client-ec2": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ec2/-/client-ec2-3.908.0.tgz", - "integrity": "sha512-hiCFSXaapBicoGWINGfoWzzKFT06fZ6HyJNHrbRpusHqHrERDD5oIImYhyQEE5mmv9LgFGe02Sim1O2jL9xSjA==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ec2/-/client-ec2-3.913.0.tgz", + "integrity": "sha512-eCJC9MQSb8IqLubItoGzSWZiZH8T6cZJECKsBjZaeEhlrw3mP8yIJBKs32xxrwbaH5CRUUZfm2syptPFqNPcxQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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-sdk-ec2": "3.908.0", - "@aws-sdk/middleware-user-agent": "3.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-sdk-ec2": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.0", + "@smithy/util-waiter": "^4.2.2", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, @@ -1403,50 +1403,50 @@ } }, "node_modules/@aws-sdk/client-ecr": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.908.0.tgz", - "integrity": "sha512-sLTUfD+DvWnuMwC8I9mKFnlqoqfD5wnx9YDTCrfJl9XZhgIq2qOLCbS47b/yG6Ec7PfuRYXHdz/rus91SC12QA==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.913.0.tgz", + "integrity": "sha512-m7TJGPM33EgM3pmoL7Fz0HN8bkFY62T22e6eGvAqtNznRdj0RnnanLLeYEH77lYmhPqno4AfyEdJ/9t5qA73/w==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.0", + "@smithy/util-waiter": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -1454,50 +1454,50 @@ } }, "node_modules/@aws-sdk/client-ecs": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecs/-/client-ecs-3.908.0.tgz", - "integrity": "sha512-HVgwoj/+VhM/7DWv7UgoKWP+AmtxCm1Tnc964+rCECzuSCcC3cYXOf0LZJLmaUxCQHLEzNuANsAMyl9jCzXenw==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecs/-/client-ecs-3.913.0.tgz", + "integrity": "sha512-KGSDFpmYm2PalC0eOJDkmEuzk68la96vJBkxDzeRkC6r9rHOksbHcoEGt6uuZLX1sdCKrNVZ1JBaMAaKsnYGzQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.0", + "@smithy/util-waiter": "^4.2.2", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, @@ -1506,50 +1506,50 @@ } }, "node_modules/@aws-sdk/client-elastic-load-balancing-v2": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-elastic-load-balancing-v2/-/client-elastic-load-balancing-v2-3.908.0.tgz", - "integrity": "sha512-iTkv7e50/HY87ENQIjcy0EkZG5boSKIe109OoXoqsSjlyqiPwvOs5MC3dWDx2loWVA9B4AP09Mc7i6bolo9qFA==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-elastic-load-balancing-v2/-/client-elastic-load-balancing-v2-3.913.0.tgz", + "integrity": "sha512-V9/X5hg8xfutq693OkIjZZ0jrnvNgkaoyyS6IAh0j07S3Z1vJlZIelY8+ZQ+WuKcpNBLAI5/635zBM79XQBKeQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.0", + "@smithy/util-waiter": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -1557,50 +1557,50 @@ } }, "node_modules/@aws-sdk/client-iam": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-iam/-/client-iam-3.908.0.tgz", - "integrity": "sha512-kdRYgL/5qt1KOpOp0MHxMoVE3xnVzfj2doyaXQ6eruUP4n+KY3GZFSamQds1/muK6YycgUiNt4umqtSIDCpb7Q==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-iam/-/client-iam-3.913.0.tgz", + "integrity": "sha512-3UR3EJ/2eutWpcs6LdtLl4JTJ4u/TZZEoLryUConEchrBNNtSVBG2CXrG7In1hS4l0t5TlkW/ruEZyLZJiqFfw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.0", + "@smithy/util-waiter": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -1608,48 +1608,48 @@ } }, "node_modules/@aws-sdk/client-kms": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.908.0.tgz", - "integrity": "sha512-C5D6F/JcIKMTMj7vVFfRGkFqMcFKG05mMp9wFLs+Eh+0vfNC41JyrKzyBGoUO4fIEhkKqxSFom7n73Cc4R69cQ==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.913.0.tgz", + "integrity": "sha512-VB/SSpvDL2Mpi305uyYL4FJkcc7D1GFtSExZUJxWNDbC/o0OpoBuicKr00XqJp8yXeNDdQ31whGWBfibsAOQ/Q==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -1658,54 +1658,54 @@ } }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.908.0.tgz", - "integrity": "sha512-g5Fb4da8lUzjv1XEZSzpxTDtPcQHVHqqMOfjTWtBBwKqacRqM6L+M79WKeMt/Wm3Lul1EWKzyOSpq7qYO9zHRw==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.913.0.tgz", + "integrity": "sha512-Z1POaV/q+unF0G6PEDO0p6JrepJI6DXkVAl4RQiN1hZRshsfZxPQtsanKqMHLEi/OyhqnoVxy1buSNHjuumTdg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/eventstream-serde-browser": "^4.2.0", - "@smithy/eventstream-serde-config-resolver": "^4.3.0", - "@smithy/eventstream-serde-node": "^4.2.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/eventstream-serde-browser": "^4.2.2", + "@smithy/eventstream-serde-config-resolver": "^4.3.2", + "@smithy/eventstream-serde-node": "^4.2.2", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", - "@smithy/util-stream": "^4.5.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", + "@smithy/util-stream": "^4.5.2", "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.0", + "@smithy/util-waiter": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -1713,52 +1713,52 @@ } }, "node_modules/@aws-sdk/client-route-53": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-route-53/-/client-route-53-3.908.0.tgz", - "integrity": "sha512-AnlwPR4+g0IjGdgQasQrgLER7bb1gYSUkrMmpx8/mhZ7jO8OQPBaL0qMRqmH5iYm2dMyB3QG+i9OPy4XBf+Lfg==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-route-53/-/client-route-53-3.913.0.tgz", + "integrity": "sha512-wGJPchtKwu44gi2A3+TTxE5tYL8oLS2WCN8QlBJQR653CWm3t7B6nnX7YVkfzYgm+hKFrlUGmsdliT2MdMzeWw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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-sdk-route53": "3.901.0", - "@aws-sdk/middleware-user-agent": "3.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@aws-sdk/xml-builder": "3.901.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-sdk-route53": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@aws-sdk/xml-builder": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.0", + "@smithy/util-waiter": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -1766,66 +1766,66 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.908.0.tgz", - "integrity": "sha512-c/89iG3of8UEiWbRK014DoHLy8PLLTJtM9IvYLPsvrf83kpV2P/K9WrdbjW4h6e5qt9XPgfNTZ8U607mt7pdmA==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.913.0.tgz", + "integrity": "sha512-YdWHIXn+TltH1MbMkBrFl8Ocxj/PJXleacQ1U5AZRAt8EqxctYkeTNB/+XYS5x6ieYQ4uWnF7sF74sJx+KTpwg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.0", - "@aws-sdk/middleware-bucket-endpoint": "3.901.0", - "@aws-sdk/middleware-expect-continue": "3.901.0", - "@aws-sdk/middleware-flexible-checksums": "3.908.0", - "@aws-sdk/middleware-host-header": "3.901.0", - "@aws-sdk/middleware-location-constraint": "3.901.0", - "@aws-sdk/middleware-logger": "3.901.0", - "@aws-sdk/middleware-recursion-detection": "3.901.0", - "@aws-sdk/middleware-sdk-s3": "3.908.0", - "@aws-sdk/middleware-ssec": "3.901.0", - "@aws-sdk/middleware-user-agent": "3.908.0", - "@aws-sdk/region-config-resolver": "3.901.0", - "@aws-sdk/signature-v4-multi-region": "3.908.0", - "@aws-sdk/types": "3.901.0", - "@aws-sdk/util-endpoints": "3.901.0", - "@aws-sdk/util-user-agent-browser": "3.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@aws-sdk/xml-builder": "3.901.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/eventstream-serde-browser": "^4.2.0", - "@smithy/eventstream-serde-config-resolver": "^4.3.0", - "@smithy/eventstream-serde-node": "^4.2.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-blob-browser": "^4.2.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/hash-stream-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/md5-js": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-bucket-endpoint": "3.910.0", + "@aws-sdk/middleware-expect-continue": "3.910.0", + "@aws-sdk/middleware-flexible-checksums": "3.911.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-location-constraint": "3.913.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-sdk-s3": "3.911.0", + "@aws-sdk/middleware-ssec": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/signature-v4-multi-region": "3.911.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@aws-sdk/xml-builder": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/eventstream-serde-browser": "^4.2.2", + "@smithy/eventstream-serde-config-resolver": "^4.3.2", + "@smithy/eventstream-serde-node": "^4.2.2", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-blob-browser": "^4.2.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/hash-stream-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/md5-js": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", - "@smithy/util-stream": "^4.5.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", + "@smithy/util-stream": "^4.5.2", "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.0", + "@smithy/util-waiter": "^4.2.2", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, @@ -1834,48 +1834,48 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.908.0.tgz", - "integrity": "sha512-OJVKq6vzG2w0B+Al4Hx+iLRVt2GuRopu5Obs8YzD2gzl4WIFqk6gK7SFr+vNFZAfd5VjsKhXpbgYD7JWnDIacg==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.913.0.tgz", + "integrity": "sha512-VX54DUb5eWSgxzA34Ym95HoBG5i0dEno4JnV6RR+dKQoiKmrnbnGKmHc3GsAH8lw4vFoz8epcthKG8iaryLRIw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" @@ -1885,48 +1885,48 @@ } }, "node_modules/@aws-sdk/client-sfn": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sfn/-/client-sfn-3.908.0.tgz", - "integrity": "sha512-NYU+tB+cR0ycedoHTLq0ljWW3hRtEdXe0w2RS3/zSjDeZGFvQMigkIgyLTq6ZvTijdTWCfheh2C9whR4LMEdjg==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sfn/-/client-sfn-3.913.0.tgz", + "integrity": "sha512-XVonl1v6mqz+FxevEvY+CBEOi+fTG3Ht2BTwWRM3F0XUwOo4ONH4+jo54rEEbq12zVW3M53k+rMfUDyy1pSLiw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" @@ -1936,50 +1936,50 @@ } }, "node_modules/@aws-sdk/client-ssm": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.908.0.tgz", - "integrity": "sha512-bEkjw0tFilts/dDOrFh2CAGw1tMyGHrBeRqbb+47UOzUCqewgxngopsL4qJwHxPL6tUk37sYgMMGYXo6U9p9mA==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.913.0.tgz", + "integrity": "sha512-9eVH50G/EPBFFO6Cd485h/E/DF0XDeM/IO9VTK/pSnjv07eoBvaoFRf/7j0D6aul+JcbWZP0ghicEM2wK31mEw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.0", + "@smithy/util-waiter": "^4.2.2", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, @@ -1988,47 +1988,47 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.908.0.tgz", - "integrity": "sha512-PseFMWvtac+Q+zaY9DMISE+2+glNh0ROJ1yR4gMzeafNHSwkdYu4qcgxLWIOnIodGydBv/tQ6nzHPzExXnUUgw==", + "version": "3.911.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.911.0.tgz", + "integrity": "sha512-N9QAeMvN3D1ZyKXkQp4aUgC4wUMuA5E1HuVCkajc0bq1pnH4PIke36YlrDGGREqPlyLFrXCkws2gbL5p23vtlg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -2037,48 +2037,48 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.908.0.tgz", - "integrity": "sha512-B2/yJIAEjsU04zyRVZ439hmX6QRDgksntfEtV7INN8jiqdcsDHUiAG1t+xY5CLX9YTjzI8pnK50kNeDZPasMFw==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.913.0.tgz", + "integrity": "sha512-uBILjNywzzt8gsDLH6KPGNQEi0fz0paadY3QKrvlZBEO8aAswFOEBSbrYYoxG/gvzpUKCbPP3f/VCmhYIJWRYw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -2087,49 +2087,49 @@ } }, "node_modules/@aws-sdk/client-xray": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.908.0.tgz", - "integrity": "sha512-KpZdHpVWZ7QLPwNAykJmuWvFlFJArTjmnDB9bCUE7PHwGbMCbXuuZPPxJHeNL5reWddQhHgMdqNIREH7kv2Q4g==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.913.0.tgz", + "integrity": "sha512-cNtGZZEVysWw970VDk80KJ6XMLXajK5q4CgWKifMFEGVjjRAYTZdG5BGmU8lFUOuo2Ec0ddIk+u2w94iwjf3CQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -2138,22 +2138,22 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.908.0.tgz", - "integrity": "sha512-okl6FC2cQT1Oidvmnmvyp/IEvqENBagKO0ww4YV5UtBkf0VlhAymCWkZqhovtklsqgq0otag2VRPAgnrMt6nVQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.901.0", - "@aws-sdk/xml-builder": "3.901.0", - "@smithy/core": "^3.15.0", - "@smithy/node-config-provider": "^4.3.0", - "@smithy/property-provider": "^4.2.0", - "@smithy/protocol-http": "^5.3.0", - "@smithy/signature-v4": "^5.3.0", - "@smithy/smithy-client": "^4.7.1", - "@smithy/types": "^4.6.0", + "version": "3.911.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.911.0.tgz", + "integrity": "sha512-k4QG9A+UCq/qlDJFmjozo6R0eXXfe++/KnCDMmajehIE9kh+b/5DqlGvAmbl9w4e92LOtrY6/DN3mIX1xs4sXw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.910.0", + "@aws-sdk/xml-builder": "3.911.0", + "@smithy/core": "^3.16.1", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/property-provider": "^4.2.2", + "@smithy/protocol-http": "^5.3.2", + "@smithy/signature-v4": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", "@smithy/util-base64": "^4.3.0", - "@smithy/util-middleware": "^4.2.0", + "@smithy/util-middleware": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -2162,15 +2162,15 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.908.0.tgz", - "integrity": "sha512-Lmb5GatPNDY5cODfwH3XGWpKZqg/lh7ghCn4Y9BTMi5W9Z/E2Jq5YF7yaLobOjOpx+lVoxS+EsVrtSm6p3ffuw==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.913.0.tgz", + "integrity": "sha512-AYZNpy3eEFzopzntLcrkEQQ1qyhg0V7BL8U77QdLSYtzoYvI9CqnWOGdWnNSEUp+Mpbk1VJyPzVfkDoDq5kX6g==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.908.0", - "@aws-sdk/types": "3.901.0", - "@smithy/property-provider": "^4.2.0", - "@smithy/types": "^4.6.0", + "@aws-sdk/client-cognito-identity": "3.913.0", + "@aws-sdk/types": "3.910.0", + "@smithy/property-provider": "^4.2.2", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2178,15 +2178,15 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.908.0.tgz", - "integrity": "sha512-FK2YuxoI5CxUflPOIMbVAwDbi6Xvu+2sXopXLmrHc2PfI39M3vmjEoQwYCP8WuQSRb+TbAP3xAkxHjFSBFR35w==", + "version": "3.911.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.911.0.tgz", + "integrity": "sha512-6FWRwWn3LUZzLhqBXB+TPMW2ijCWUqGICSw8bVakEdODrvbiv1RT/MVUayzFwz/ek6e6NKZn6DbSWzx07N9Hjw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.908.0", - "@aws-sdk/types": "3.901.0", - "@smithy/property-provider": "^4.2.0", - "@smithy/types": "^4.6.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/types": "3.910.0", + "@smithy/property-provider": "^4.2.2", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2194,20 +2194,20 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.908.0.tgz", - "integrity": "sha512-eLbz0geVW9EykujQNnYfR35Of8MreI6pau5K6XDFDUSWO9GF8wqH7CQwbXpXHBlCTHtq4QSLxzorD8U5CROhUw==", + "version": "3.911.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.911.0.tgz", + "integrity": "sha512-xUlwKmIUW2fWP/eM3nF5u4CyLtOtyohlhGJ5jdsJokr3MrQ7w0tDITO43C9IhCn+28D5UbaiWnKw5ntkw7aVfA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.908.0", - "@aws-sdk/types": "3.901.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/node-http-handler": "^4.3.0", - "@smithy/property-provider": "^4.2.0", - "@smithy/protocol-http": "^5.3.0", - "@smithy/smithy-client": "^4.7.1", - "@smithy/types": "^4.6.0", - "@smithy/util-stream": "^4.5.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/types": "3.910.0", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/property-provider": "^4.2.2", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/util-stream": "^4.5.2", "tslib": "^2.6.2" }, "engines": { @@ -2215,23 +2215,23 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.908.0.tgz", - "integrity": "sha512-7Cgnv5wabgFtsgr+Uc/76EfPNGyxmbG8aICn3g3D3iJlcO4uuOZI8a77i0afoDdchZrTC6TG6UusS/NAW6zEoQ==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.913.0.tgz", + "integrity": "sha512-iR4c4NQ1OSRKQi0SxzpwD+wP1fCy+QNKtEyCajuVlD0pvmoIHdrm5THK9e+2/7/SsQDRhOXHJfLGxHapD74WJw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-env": "3.908.0", - "@aws-sdk/credential-provider-http": "3.908.0", - "@aws-sdk/credential-provider-process": "3.908.0", - "@aws-sdk/credential-provider-sso": "3.908.0", - "@aws-sdk/credential-provider-web-identity": "3.908.0", - "@aws-sdk/nested-clients": "3.908.0", - "@aws-sdk/types": "3.901.0", - "@smithy/credential-provider-imds": "^4.2.0", - "@smithy/property-provider": "^4.2.0", - "@smithy/shared-ini-file-loader": "^4.3.0", - "@smithy/types": "^4.6.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-env": "3.911.0", + "@aws-sdk/credential-provider-http": "3.911.0", + "@aws-sdk/credential-provider-process": "3.911.0", + "@aws-sdk/credential-provider-sso": "3.911.0", + "@aws-sdk/credential-provider-web-identity": "3.911.0", + "@aws-sdk/nested-clients": "3.911.0", + "@aws-sdk/types": "3.910.0", + "@smithy/credential-provider-imds": "^4.2.2", + "@smithy/property-provider": "^4.2.2", + "@smithy/shared-ini-file-loader": "^4.3.2", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2239,22 +2239,22 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.908.0.tgz", - "integrity": "sha512-8OKbykpGw5bdfF/pLTf8YfUi1Kl8o1CTjBqWQTsLOkE3Ho3hsp1eQx8Cz4ttrpv0919kb+lox62DgmAOEmTr1w==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.913.0.tgz", + "integrity": "sha512-HQPLkKDxS83Q/nZKqg9bq4igWzYQeOMqhpx5LYs4u1GwsKeCsYrrfz12Iu4IHNWPp9EnGLcmdfbfYuqZGrsaSQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.908.0", - "@aws-sdk/credential-provider-http": "3.908.0", - "@aws-sdk/credential-provider-ini": "3.908.0", - "@aws-sdk/credential-provider-process": "3.908.0", - "@aws-sdk/credential-provider-sso": "3.908.0", - "@aws-sdk/credential-provider-web-identity": "3.908.0", - "@aws-sdk/types": "3.901.0", - "@smithy/credential-provider-imds": "^4.2.0", - "@smithy/property-provider": "^4.2.0", - "@smithy/shared-ini-file-loader": "^4.3.0", - "@smithy/types": "^4.6.0", + "@aws-sdk/credential-provider-env": "3.911.0", + "@aws-sdk/credential-provider-http": "3.911.0", + "@aws-sdk/credential-provider-ini": "3.913.0", + "@aws-sdk/credential-provider-process": "3.911.0", + "@aws-sdk/credential-provider-sso": "3.911.0", + "@aws-sdk/credential-provider-web-identity": "3.911.0", + "@aws-sdk/types": "3.910.0", + "@smithy/credential-provider-imds": "^4.2.2", + "@smithy/property-provider": "^4.2.2", + "@smithy/shared-ini-file-loader": "^4.3.2", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2262,16 +2262,16 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.908.0.tgz", - "integrity": "sha512-sWnbkGjDPBi6sODUzrAh5BCDpnPw0wpK8UC/hWI13Q8KGfyatAmCBfr+9OeO3+xBHa8N5AskMncr7C4qS846yQ==", + "version": "3.911.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.911.0.tgz", + "integrity": "sha512-mKshhV5jRQffZjbK9x7bs+uC2IsYKfpzYaBamFsEov3xtARCpOiKaIlM8gYKFEbHT2M+1R3rYYlhhl9ndVWS2g==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.908.0", - "@aws-sdk/types": "3.901.0", - "@smithy/property-provider": "^4.2.0", - "@smithy/shared-ini-file-loader": "^4.3.0", - "@smithy/types": "^4.6.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/types": "3.910.0", + "@smithy/property-provider": "^4.2.2", + "@smithy/shared-ini-file-loader": "^4.3.2", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2279,18 +2279,18 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.908.0.tgz", - "integrity": "sha512-WV/aOzuS6ZZhrkPty6TJ3ZG24iS8NXP0m3GuTVuZ5tKi9Guss31/PJ1CrKPRCYGm15CsIjf+mrUxVnNYv9ap5g==", + "version": "3.911.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.911.0.tgz", + "integrity": "sha512-JAxd4uWe0Zc9tk6+N0cVxe9XtJVcOx6Ms0k933ZU9QbuRMH6xti/wnZxp/IvGIWIDzf5fhqiGyw5MSyDeI5b1w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.908.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/token-providers": "3.908.0", - "@aws-sdk/types": "3.901.0", - "@smithy/property-provider": "^4.2.0", - "@smithy/shared-ini-file-loader": "^4.3.0", - "@smithy/types": "^4.6.0", + "@aws-sdk/client-sso": "3.911.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/token-providers": "3.911.0", + "@aws-sdk/types": "3.910.0", + "@smithy/property-provider": "^4.2.2", + "@smithy/shared-ini-file-loader": "^4.3.2", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2298,17 +2298,17 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.908.0.tgz", - "integrity": "sha512-9xWrFn6nWlF5KlV4XYW+7E6F33S3wUUEGRZ/+pgDhkIZd527ycT2nPG2dZ3fWUZMlRmzijP20QIJDqEbbGWe1Q==", + "version": "3.911.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.911.0.tgz", + "integrity": "sha512-urIbXWWG+cm54RwwTFQuRwPH0WPsMFSDF2/H9qO2J2fKoHRURuyblFCyYG3aVKZGvFBhOizJYexf5+5w3CJKBw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.908.0", - "@aws-sdk/nested-clients": "3.908.0", - "@aws-sdk/types": "3.901.0", - "@smithy/property-provider": "^4.2.0", - "@smithy/shared-ini-file-loader": "^4.3.0", - "@smithy/types": "^4.6.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/nested-clients": "3.911.0", + "@aws-sdk/types": "3.910.0", + "@smithy/property-provider": "^4.2.2", + "@smithy/shared-ini-file-loader": "^4.3.2", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2316,29 +2316,29 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.908.0.tgz", - "integrity": "sha512-WuAttxDemeKyMAgNEwBdgz11/W8IOosDxAU9GOk8ZbNJI/Cp0SiCp5p9bu0hlroq2V4HxECIRIMNeJZLh7fIgg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.908.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/credential-provider-cognito-identity": "3.908.0", - "@aws-sdk/credential-provider-env": "3.908.0", - "@aws-sdk/credential-provider-http": "3.908.0", - "@aws-sdk/credential-provider-ini": "3.908.0", - "@aws-sdk/credential-provider-node": "3.908.0", - "@aws-sdk/credential-provider-process": "3.908.0", - "@aws-sdk/credential-provider-sso": "3.908.0", - "@aws-sdk/credential-provider-web-identity": "3.908.0", - "@aws-sdk/nested-clients": "3.908.0", - "@aws-sdk/types": "3.901.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/credential-provider-imds": "^4.2.0", - "@smithy/node-config-provider": "^4.3.0", - "@smithy/property-provider": "^4.2.0", - "@smithy/types": "^4.6.0", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.913.0.tgz", + "integrity": "sha512-KnkvoLXGszXNV7IMLdUH2Smo+tr4MiHUp2zkkrhl+6uXdSWpEAhlARSA8OPIxgVMabUW1AWDumN7Km7z0GvnWg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.913.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/credential-provider-cognito-identity": "3.913.0", + "@aws-sdk/credential-provider-env": "3.911.0", + "@aws-sdk/credential-provider-http": "3.911.0", + "@aws-sdk/credential-provider-ini": "3.913.0", + "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/credential-provider-process": "3.911.0", + "@aws-sdk/credential-provider-sso": "3.911.0", + "@aws-sdk/credential-provider-web-identity": "3.911.0", + "@aws-sdk/nested-clients": "3.911.0", + "@aws-sdk/types": "3.910.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/credential-provider-imds": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/property-provider": "^4.2.2", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2346,17 +2346,17 @@ } }, "node_modules/@aws-sdk/ec2-metadata-service": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/ec2-metadata-service/-/ec2-metadata-service-3.908.0.tgz", - "integrity": "sha512-KoPwLw9Z3i/vDq9erUpYPm8mypQJDerWlI64HHspJaAW0grFOYzPs2OqJar2NkCt3ktg+chuhgbMoAiZ2Kyo+w==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/ec2-metadata-service/-/ec2-metadata-service-3.913.0.tgz", + "integrity": "sha512-Qi/DijmDbNvxvabY6BCx8BKzAF5d0XciVQ9zYB2OUBQitTKL0VaZ9ekgiM4weP3/4kMKrDAOUCy2aeO5NLRFuw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.901.0", - "@smithy/node-config-provider": "^4.3.0", - "@smithy/node-http-handler": "^4.3.0", - "@smithy/protocol-http": "^5.3.0", - "@smithy/types": "^4.6.0", - "@smithy/util-stream": "^4.5.0", + "@aws-sdk/types": "3.910.0", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/types": "^4.7.1", + "@smithy/util-stream": "^4.5.2", "tslib": "^2.6.2" }, "engines": { @@ -2377,34 +2377,34 @@ } }, "node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.908.0.tgz", - "integrity": "sha512-XWILSCKbGv0sjDt1wigHiOCzUS5ymR1EuXH77wLzmbUxH94c1qlJIswQ2EY8zYkyoyzrHGMZ3Vxa7e+8xJ4UZQ==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.913.0.tgz", + "integrity": "sha512-tygUmkPzTFxegery4Q9Y1G4UMscx7zbGMIijn2FTa2CisSLo6WzOFMPUBwDDI515vDY2Eutc9NJAzwv3cPYs9g==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.908.0", - "@aws-sdk/util-dynamodb": "3.908.0", - "@smithy/core": "^3.15.0", - "@smithy/smithy-client": "^4.7.1", - "@smithy/types": "^4.6.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/util-dynamodb": "3.913.0", + "@smithy/core": "^3.16.1", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.908.0" + "@aws-sdk/client-dynamodb": "^3.913.0" } }, "node_modules/@aws-sdk/lib-storage": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.908.0.tgz", - "integrity": "sha512-tWYvGPAImOHSGYyau5rrVQA3OS0MV8ZCgf5ywtRIAmMEV4CSctDBP8WR2FrO7shAPKMRkjgdul5f0pZAjOYd2Q==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.913.0.tgz", + "integrity": "sha512-IOlCRCvq+DmN9d3o9LLBiGt9CFQDp11joKgZ4CziUQ59qkHonkaf0GOt6Oo4zITGBegJ0FvKsWj+sDgYoQ1U9g==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/smithy-client": "^4.7.1", + "@smithy/abort-controller": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/smithy-client": "^4.8.1", "buffer": "5.6.0", "events": "3.3.0", "stream-browserify": "3.0.0", @@ -2414,7 +2414,7 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-s3": "^3.908.0" + "@aws-sdk/client-s3": "^3.913.0" } }, "node_modules/@aws-sdk/lib-storage/node_modules/events": { @@ -2426,16 +2426,16 @@ } }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.901.0.tgz", - "integrity": "sha512-mPF3N6eZlVs9G8aBSzvtoxR1RZqMo1aIwR+X8BAZSkhfj55fVF2no4IfPXfdFO3I66N+zEQ8nKoB0uTATWrogQ==", + "version": "3.910.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.910.0.tgz", + "integrity": "sha512-8ZfA0WARwvAKQQ7vmoQTg6xFEewFqsQCltQIHd7NtNs3CLF1aU06Ixp0i7Mp68k6dUj9WJJO7mz3I5VFOecqHQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.901.0", + "@aws-sdk/types": "3.910.0", "@aws-sdk/util-arn-parser": "3.893.0", - "@smithy/node-config-provider": "^4.3.0", - "@smithy/protocol-http": "^5.3.0", - "@smithy/types": "^4.6.0", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/protocol-http": "^5.3.2", + "@smithy/types": "^4.7.1", "@smithy/util-config-provider": "^4.2.0", "tslib": "^2.6.2" }, @@ -2444,16 +2444,16 @@ } }, "node_modules/@aws-sdk/middleware-endpoint-discovery": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.901.0.tgz", - "integrity": "sha512-nbqELNamIhsWcDmqa3rB5unNuOEGiNh2pEz663ZEzsa9DTasKvBHqdhVQo6DuWDvnkhAjOMrkM2sB4P45uy1Qw==", + "version": "3.910.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.910.0.tgz", + "integrity": "sha512-KZvTt8lUUhkQptu00iSSdf5+6h6NP3L5tP251/4FRh9XDXMdpIoAAGsmamhVySkUSODDaALMHjXPSK5SJq/RYw==", "license": "Apache-2.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/types": "3.910.0", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/protocol-http": "^5.3.2", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2461,14 +2461,14 @@ } }, "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.901.0.tgz", - "integrity": "sha512-bwq9nj6MH38hlJwOY9QXIDwa6lI48UsaZpaXbdD71BljEIRlxDzfB4JaYb+ZNNK7RIAdzsP/K05mJty6KJAQHw==", + "version": "3.910.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.910.0.tgz", + "integrity": "sha512-jtnsBlxuRyRbK52WdNSry28Tn4ljIqUfUEzDFYWDTEymEGPpVguQKPudW/6M5BWEDmNsv3ai/X+fXd0GZ1fE/Q==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.901.0", - "@smithy/protocol-http": "^5.3.0", - "@smithy/types": "^4.6.0", + "@aws-sdk/types": "3.910.0", + "@smithy/protocol-http": "^5.3.2", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2476,22 +2476,22 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.908.0.tgz", - "integrity": "sha512-hYGhNBvdfnxhhywYRkesdxIZD8rvhsp2CBci5kCqrR2o5VvEkn5+waUQtkREtkciEpC4ent4fadg7N9XfTKvgQ==", + "version": "3.911.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.911.0.tgz", + "integrity": "sha512-ZeS5zPKRCBMqpO8e0S/isfDWBt8AtG604PopKFFqEowbbV8cf6ms3hddNZRajTHvaoWBlU7Fbcn0827RWJnBdw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.908.0", - "@aws-sdk/types": "3.901.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/types": "3.910.0", "@smithy/is-array-buffer": "^4.2.0", - "@smithy/node-config-provider": "^4.3.0", - "@smithy/protocol-http": "^5.3.0", - "@smithy/types": "^4.6.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-stream": "^4.5.0", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/protocol-http": "^5.3.2", + "@smithy/types": "^4.7.1", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-stream": "^4.5.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -2500,14 +2500,14 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.901.0.tgz", - "integrity": "sha512-yWX7GvRmqBtbNnUW7qbre3GvZmyYwU0WHefpZzDTYDoNgatuYq6LgUIQ+z5C04/kCRoFkAFrHag8a3BXqFzq5A==", + "version": "3.910.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.910.0.tgz", + "integrity": "sha512-F9Lqeu80/aTM6S/izZ8RtwSmjfhWjIuxX61LX+/9mxJyEkgaECRxv0chsLQsLHJumkGnXRy/eIyMLBhcTPF5vg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.901.0", - "@smithy/protocol-http": "^5.3.0", - "@smithy/types": "^4.6.0", + "@aws-sdk/types": "3.910.0", + "@smithy/protocol-http": "^5.3.2", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2515,13 +2515,13 @@ } }, "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.901.0.tgz", - "integrity": "sha512-MuCS5R2ngNoYifkVt05CTULvYVWX0dvRT0/Md4jE3a0u0yMygYy31C1zorwfE/SUgAQXyLmUx8ATmPp9PppImQ==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.913.0.tgz", + "integrity": "sha512-iudUrAYV4ZyweYL0hW/VaJzJRjFVruHpK0NukwECs0FZ76Zn17/smbkFIeiaRdGi9cqQdRk9PfhKPvbufnnhPg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.901.0", - "@smithy/types": "^4.6.0", + "@aws-sdk/types": "3.910.0", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2529,13 +2529,13 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.901.0.tgz", - "integrity": "sha512-UoHebjE7el/tfRo8/CQTj91oNUm+5Heus5/a4ECdmWaSCHCS/hXTsU3PTTHAY67oAQR8wBLFPfp3mMvXjB+L2A==", + "version": "3.910.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.910.0.tgz", + "integrity": "sha512-3LJyyfs1USvRuRDla1pGlzGRtXJBXD1zC9F+eE9Iz/V5nkmhyv52A017CvKWmYoR0DM9dzjLyPOI0BSSppEaTw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.901.0", - "@smithy/types": "^4.6.0", + "@aws-sdk/types": "3.910.0", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2543,15 +2543,15 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.901.0.tgz", - "integrity": "sha512-Wd2t8qa/4OL0v/oDpCHHYkgsXJr8/ttCxrvCKAt0H1zZe2LlRhY9gpDVKqdertfHrHDj786fOvEQA28G1L75Dg==", + "version": "3.910.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.910.0.tgz", + "integrity": "sha512-m/oLz0EoCy+WoIVBnXRXJ4AtGpdl0kPE7U+VH9TsuUzHgxY1Re/176Q1HWLBRVlz4gr++lNsgsMWEC+VnAwMpw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.901.0", + "@aws-sdk/types": "3.910.0", "@aws/lambda-invoke-store": "^0.0.1", - "@smithy/protocol-http": "^5.3.0", - "@smithy/types": "^4.6.0", + "@smithy/protocol-http": "^5.3.2", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2559,18 +2559,18 @@ } }, "node_modules/@aws-sdk/middleware-sdk-ec2": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-ec2/-/middleware-sdk-ec2-3.908.0.tgz", - "integrity": "sha512-d9RSBcd7vU8CT4N60kDyaYSwa+aIoasGxgZRHXsUn/xiGU/fyRjZhjU0qjh9MWytjrfsxEk1Uk5bZ0nPfKPyeQ==", + "version": "3.910.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-ec2/-/middleware-sdk-ec2-3.910.0.tgz", + "integrity": "sha512-S2eV3i9+RRngndG17+ehKgAXhFkpm5nse4RhkyXELL0YwRKpZGiQPff75prwLRpEze9I04LcPkpgI/u4ojaruA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.901.0", - "@aws-sdk/util-format-url": "3.901.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/protocol-http": "^5.3.0", - "@smithy/signature-v4": "^5.3.0", - "@smithy/smithy-client": "^4.7.1", - "@smithy/types": "^4.6.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-format-url": "3.910.0", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/protocol-http": "^5.3.2", + "@smithy/signature-v4": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2578,13 +2578,13 @@ } }, "node_modules/@aws-sdk/middleware-sdk-route53": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-route53/-/middleware-sdk-route53-3.901.0.tgz", - "integrity": "sha512-Y6lEtL7RpRPF7I4gdIyrAFPZOANGZqgGanmjC7bRHIX672mQZai4wWqIY7dDx9l7GFAMi/72h9U/m35VfiW+lQ==", + "version": "3.910.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-route53/-/middleware-sdk-route53-3.910.0.tgz", + "integrity": "sha512-KEQl5B7y6O0LfqiUiuWqazxQa1BTyjXwWVwRZdMttDRuPcxzrfhrZjlSLkMFppQSPlcM7ezVPkoRFYirbdB8YA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.901.0", - "@smithy/types": "^4.6.0", + "@aws-sdk/types": "3.910.0", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2592,23 +2592,23 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.908.0.tgz", - "integrity": "sha512-23MbAOHsGaD0kTVMVLumaIM1f9vtDImIn2lSvPullbjFHKS4XxfrKuPumtKDzl8gzcux+98XnmfDRKH0fzkOUA==", + "version": "3.911.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.911.0.tgz", + "integrity": "sha512-P0mIIW/QkAGNvFu15Jqa5NSmHeQvZkkQY8nbQpCT3tGObZe4wRsq5u1mOS+CJp4DIBbRZuHeX7ohbX5kPMi4dg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.908.0", - "@aws-sdk/types": "3.901.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/types": "3.910.0", "@aws-sdk/util-arn-parser": "3.893.0", - "@smithy/core": "^3.15.0", - "@smithy/node-config-provider": "^4.3.0", - "@smithy/protocol-http": "^5.3.0", - "@smithy/signature-v4": "^5.3.0", - "@smithy/smithy-client": "^4.7.1", - "@smithy/types": "^4.6.0", + "@smithy/core": "^3.16.1", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/protocol-http": "^5.3.2", + "@smithy/signature-v4": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-stream": "^4.5.0", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-stream": "^4.5.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -2617,13 +2617,13 @@ } }, "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.901.0.tgz", - "integrity": "sha512-YiLLJmA3RvjL38mFLuu8fhTTGWtp2qT24VqpucgfoyziYcTgIQkJJmKi90Xp6R6/3VcArqilyRgM1+x8i/em+Q==", + "version": "3.910.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.910.0.tgz", + "integrity": "sha512-Ikb0WrIiOeaZo9UmeoVrO4GH2OHiMTKSbr5raTW8nTCArED8iTVZiBF6As+JicZMLSNiBiYSb7EjDihWQ0DrTQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.901.0", - "@smithy/types": "^4.6.0", + "@aws-sdk/types": "3.910.0", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2631,17 +2631,17 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.908.0.tgz", - "integrity": "sha512-R0ePEOku72EvyJWy/D0Z5f/Ifpfxa0U9gySO3stpNhOox87XhsILpcIsCHPy0OHz1a7cMoZsF6rMKSzDeCnogQ==", + "version": "3.911.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.911.0.tgz", + "integrity": "sha512-rY3LvGvgY/UI0nmt5f4DRzjEh8135A2TeHcva1bgOmVfOI4vkkGfA20sNRqerOkSO6hPbkxJapO50UJHFzmmyA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.908.0", - "@aws-sdk/types": "3.901.0", - "@aws-sdk/util-endpoints": "3.901.0", - "@smithy/core": "^3.15.0", - "@smithy/protocol-http": "^5.3.0", - "@smithy/types": "^4.6.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@smithy/core": "^3.16.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2649,47 +2649,47 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.908.0.tgz", - "integrity": "sha512-ZxDYrfxOKXNFHLyvJtT96TJ0p4brZOhwRE4csRXrezEVUN+pNgxuem95YvMALPVhlVqON2CTzr8BX+CcBKvX9Q==", + "version": "3.911.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.911.0.tgz", + "integrity": "sha512-lp/sXbdX/S0EYaMYPVKga0omjIUbNNdFi9IJITgKZkLC6CzspihIoHd5GIdl4esMJevtTQQfkVncXTFkf/a4YA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.908.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.908.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.907.0", - "@aws-sdk/util-user-agent-node": "3.908.0", - "@smithy/config-resolver": "^4.3.0", - "@smithy/core": "^3.15.0", - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/hash-node": "^4.2.0", - "@smithy/invalid-dependency": "^4.2.0", - "@smithy/middleware-content-length": "^4.2.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-retry": "^4.4.1", - "@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.1", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/middleware-host-header": "3.910.0", + "@aws-sdk/middleware-logger": "3.910.0", + "@aws-sdk/middleware-recursion-detection": "3.910.0", + "@aws-sdk/middleware-user-agent": "3.911.0", + "@aws-sdk/region-config-resolver": "3.910.0", + "@aws-sdk/types": "3.910.0", + "@aws-sdk/util-endpoints": "3.910.0", + "@aws-sdk/util-user-agent-browser": "3.910.0", + "@aws-sdk/util-user-agent-node": "3.911.0", + "@smithy/config-resolver": "^4.3.2", + "@smithy/core": "^3.16.1", + "@smithy/fetch-http-handler": "^5.3.3", + "@smithy/hash-node": "^4.2.2", + "@smithy/invalid-dependency": "^4.2.2", + "@smithy/middleware-content-length": "^4.2.2", + "@smithy/middleware-endpoint": "^4.3.3", + "@smithy/middleware-retry": "^4.4.3", + "@smithy/middleware-serde": "^4.2.2", + "@smithy/middleware-stack": "^4.2.2", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/node-http-handler": "^4.4.1", + "@smithy/protocol-http": "^5.3.2", + "@smithy/smithy-client": "^4.8.1", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", "@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.0", - "@smithy/util-defaults-mode-node": "^4.2.1", - "@smithy/util-endpoints": "^3.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.3.2", + "@smithy/util-defaults-mode-node": "^4.2.3", + "@smithy/util-endpoints": "^3.2.2", + "@smithy/util-middleware": "^4.2.2", + "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -2698,16 +2698,16 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.901.0.tgz", - "integrity": "sha512-7F0N888qVLHo4CSQOsnkZ4QAp8uHLKJ4v3u09Ly5k4AEStrSlFpckTPyUx6elwGL+fxGjNE2aakK8vEgzzCV0A==", + "version": "3.910.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.910.0.tgz", + "integrity": "sha512-gzQAkuHI3xyG6toYnH/pju+kc190XmvnB7X84vtN57GjgdQJICt9So/BD0U6h+eSfk9VBnafkVrAzBzWMEFZVw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.901.0", - "@smithy/node-config-provider": "^4.3.0", - "@smithy/types": "^4.6.0", + "@aws-sdk/types": "3.910.0", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/types": "^4.7.1", "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-middleware": "^4.2.0", + "@smithy/util-middleware": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -2715,16 +2715,16 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.908.0.tgz", - "integrity": "sha512-8OodflIzZM2GVuCGiGK6hqwsbfHRDl4kQcEYzHRg9p91H4h5Y876DPvLRkwM7pSC7LKUL0XkKWWVVjwJbp6/Ig==", + "version": "3.911.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.911.0.tgz", + "integrity": "sha512-SJ4dUcY9+HPDIMCHiskT8F7JrRVZF2Y1NUN0Yiy6VUHSULgq2MDlIzSQpNICnmXhk1F1E1B2jJG9XtPYrvtqUg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.908.0", - "@aws-sdk/types": "3.901.0", - "@smithy/protocol-http": "^5.3.0", - "@smithy/signature-v4": "^5.3.0", - "@smithy/types": "^4.6.0", + "@aws-sdk/middleware-sdk-s3": "3.911.0", + "@aws-sdk/types": "3.910.0", + "@smithy/protocol-http": "^5.3.2", + "@smithy/signature-v4": "^5.3.2", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2732,17 +2732,17 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.908.0.tgz", - "integrity": "sha512-4SosHWRQ8hj1X2yDenCYHParcCjHcd7S+Mdb/lelwF0JBFCNC+dNCI9ws3cP/dFdZO/AIhJQGUBzEQtieloixw==", + "version": "3.911.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.911.0.tgz", + "integrity": "sha512-O1c5F1pbEImgEe3Vr8j1gpWu69UXWj3nN3vvLGh77hcrG5dZ8I27tSP5RN4Labm8Dnji/6ia+vqSYpN8w6KN5A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.908.0", - "@aws-sdk/nested-clients": "3.908.0", - "@aws-sdk/types": "3.901.0", - "@smithy/property-provider": "^4.2.0", - "@smithy/shared-ini-file-loader": "^4.3.0", - "@smithy/types": "^4.6.0", + "@aws-sdk/core": "3.911.0", + "@aws-sdk/nested-clients": "3.911.0", + "@aws-sdk/types": "3.910.0", + "@smithy/property-provider": "^4.2.2", + "@smithy/shared-ini-file-loader": "^4.3.2", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2750,12 +2750,12 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.901.0.tgz", - "integrity": "sha512-FfEM25hLEs4LoXsLXQ/q6X6L4JmKkKkbVFpKD4mwfVHtRVQG6QxJiCPcrkcPISquiy6esbwK2eh64TWbiD60cg==", + "version": "3.910.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.910.0.tgz", + "integrity": "sha512-o67gL3vjf4nhfmuSUNNkit0d62QJEwwHLxucwVJkR/rw9mfUtAWsgBs8Tp16cdUbMgsyQtCQilL8RAJDoGtadQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.6.0", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2775,9 +2775,9 @@ } }, "node_modules/@aws-sdk/util-dynamodb": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.908.0.tgz", - "integrity": "sha512-shrZvTDxUHVeo5lBr1zNOcorjoFjJUwEtfxj+C3/GTOeZBWqTHXHM+G7P1coeh5X/GCKOmfiyVqalv4oYPOMPw==", + "version": "3.913.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.913.0.tgz", + "integrity": "sha512-VI+QoyKbAj5sdR89zxb1jn6pMj5c1hrZDrL02NvZSLYEKo6rQ/bJyKmGTcLgo0tXFdtKG5QynPCwJ7oxDur/XA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2786,19 +2786,19 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.908.0" + "@aws-sdk/client-dynamodb": "^3.913.0" } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.901.0.tgz", - "integrity": "sha512-5nZP3hGA8FHEtKvEQf4Aww5QZOkjLW1Z+NixSd+0XKfHvA39Ah5sZboScjLx0C9kti/K3OGW1RCx5K9Zc3bZqg==", + "version": "3.910.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.910.0.tgz", + "integrity": "sha512-6XgdNe42ibP8zCQgNGDWoOF53RfEKzpU/S7Z29FTTJ7hcZv0SytC0ZNQQZSx4rfBl036YWYwJRoJMlT4AA7q9A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.901.0", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", - "@smithy/util-endpoints": "^3.2.0", + "@aws-sdk/types": "3.910.0", + "@smithy/types": "^4.7.1", + "@smithy/url-parser": "^4.2.2", + "@smithy/util-endpoints": "^3.2.2", "tslib": "^2.6.2" }, "engines": { @@ -2806,14 +2806,14 @@ } }, "node_modules/@aws-sdk/util-format-url": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.901.0.tgz", - "integrity": "sha512-GGUnJKrh3OF1F3YRSWtwPLbN904Fcfxf03gujyq1rcrDRPEkzoZB+2BzNkB27SsU6lAlwNq+4aRlZRVUloPiag==", + "version": "3.910.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.910.0.tgz", + "integrity": "sha512-cYfgDGxZnrAq7wvntBjW6/ZewRcwywOE1Q9KKPO05ZHXpWCrqKNkx0JG8h2xlu+2qX6lkLZS+NyFAlwCQa0qfA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.901.0", - "@smithy/querystring-builder": "^4.2.0", - "@smithy/types": "^4.6.0", + "@aws-sdk/types": "3.910.0", + "@smithy/querystring-builder": "^4.2.2", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2833,27 +2833,27 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.907.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.907.0.tgz", - "integrity": "sha512-Hus/2YCQmtCEfr4Ls88d07Q99Ex59uvtktiPTV963Q7w7LHuIT/JBjrbwNxtSm2KlJR9PHNdqxwN+fSuNsMGMQ==", + "version": "3.910.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.910.0.tgz", + "integrity": "sha512-iOdrRdLZHrlINk9pezNZ82P/VxO/UmtmpaOAObUN+xplCUJu31WNM2EE/HccC8PQw6XlAudpdA6HDTGiW6yVGg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.901.0", - "@smithy/types": "^4.6.0", + "@aws-sdk/types": "3.910.0", + "@smithy/types": "^4.7.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.908.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.908.0.tgz", - "integrity": "sha512-l6AEaKUAYarcEy8T8NZ+dNZ00VGLs3fW2Cqu1AuPENaSad0/ahEU+VU7MpXS8FhMRGPgplxKVgCTLyTY0Lbssw==", + "version": "3.911.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.911.0.tgz", + "integrity": "sha512-3l+f6ooLF6Z6Lz0zGi7vSKSUYn/EePPizv88eZQpEAFunBHv+CSVNPtxhxHfkm7X9tTsV4QGZRIqo3taMLolmA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.908.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.911.0", + "@aws-sdk/types": "3.910.0", + "@smithy/node-config-provider": "^4.3.2", + "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "engines": { @@ -2869,12 +2869,12 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.901.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.901.0.tgz", - "integrity": "sha512-pxFCkuAP7Q94wMTNPAwi6hEtNrp/BdFf+HOrIEeFQsk4EoOmpKY3I6S+u6A9Wg295J80Kh74LqDWM22ux3z6Aw==", + "version": "3.911.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.911.0.tgz", + "integrity": "sha512-/yh3oe26bZfCVGrIMRM9Z4hvvGJD+qx5tOLlydOkuBkm72aXON7D9+MucjJXTAcI8tF2Yq+JHa0478eHQOhnLg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.6.0", + "@smithy/types": "^4.7.1", "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, @@ -4257,12 +4257,12 @@ "dev": true }, "node_modules/@smithy/abort-controller": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.0.tgz", - "integrity": "sha512-PLUYa+SUKOEZtXFURBu/CNxlsxfaFGxSBPcStL13KpVeVWIfdezWyDqkz7iDLmwnxojXD0s5KzuB5HGHvt4Aeg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.3.tgz", + "integrity": "sha512-xWL9Mf8b7tIFuAlpjKtRPnHrR8XVrwTj5NPYO/QwZPtc0SDLsPxb56V5tzi5yspSMytISHybifez+4jlrx0vkQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.6.0", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -4295,15 +4295,15 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.3.0.tgz", - "integrity": "sha512-9oH+n8AVNiLPK/iK/agOsoWfrKZ3FGP3502tkksd6SRsKMYiu7AFX0YXo6YBADdsAj7C+G/aLKdsafIJHxuCkQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.3.3.tgz", + "integrity": "sha512-xSql8A1Bl41O9JvGU/CtgiLBlwkvpHTSKRlvz9zOBvBCPjXghZ6ZkcVzmV2f7FLAA+80+aqKmIOmy8pEDrtCaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.0", - "@smithy/types": "^4.6.0", + "@smithy/node-config-provider": "^4.3.3", + "@smithy/types": "^4.8.0", "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-middleware": "^4.2.0", + "@smithy/util-middleware": "^4.2.3", "tslib": "^2.6.2" }, "engines": { @@ -4311,18 +4311,18 @@ } }, "node_modules/@smithy/core": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.15.0.tgz", - "integrity": "sha512-VJWncXgt+ExNn0U2+Y7UywuATtRYaodGQKFo9mDyh70q+fJGedfrqi2XuKU1BhiLeXgg6RZrW7VEKfeqFhHAJA==", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.17.0.tgz", + "integrity": "sha512-Tir3DbfoTO97fEGUZjzGeoXgcQAUBRDTmuH9A8lxuP8ATrgezrAJ6cLuRvwdKN4ZbYNlHgKlBX69Hyu3THYhtg==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.2.0", - "@smithy/protocol-http": "^5.3.0", - "@smithy/types": "^4.6.0", + "@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.0", - "@smithy/util-stream": "^4.5.0", + "@smithy/util-middleware": "^4.2.3", + "@smithy/util-stream": "^4.5.3", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" @@ -4332,15 +4332,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.0.tgz", - "integrity": "sha512-SOhFVvFH4D5HJZytb0bLKxCrSnwcqPiNlrw+S4ZXjMnsC+o9JcUQzbZOEQcA8yv9wJFNhfsUiIUKiEnYL68Big==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.3.tgz", + "integrity": "sha512-hA1MQ/WAHly4SYltJKitEsIDVsNmXcQfYBRv2e+q04fnqtAX5qXaybxy/fhUeAMCnQIdAjaGDb04fMHQefWRhw==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.0", - "@smithy/property-provider": "^4.2.0", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", + "@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" }, "engines": { @@ -4348,13 +4348,13 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.0.tgz", - "integrity": "sha512-XE7CtKfyxYiNZ5vz7OvyTf1osrdbJfmUy+rbh+NLQmZumMGvY0mT0Cq1qKSfhrvLtRYzMsOBuRpi10dyI0EBPg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.3.tgz", + "integrity": "sha512-rcr0VH0uNoMrtgKuY7sMfyKqbHc4GQaQ6Yp4vwgm+Z6psPuOgL+i/Eo/QWdXRmMinL3EgFM0Z1vkfyPyfzLmjw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.6.0", + "@smithy/types": "^4.8.0", "@smithy/util-hex-encoding": "^4.2.0", "tslib": "^2.6.2" }, @@ -4363,13 +4363,13 @@ } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.0.tgz", - "integrity": "sha512-U53p7fcrk27k8irLhOwUu+UYnBqsXNLKl1XevOpsxK3y1Lndk8R7CSiZV6FN3fYFuTPuJy5pP6qa/bjDzEkRvA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.3.tgz", + "integrity": "sha512-EcS0kydOr2qJ3vV45y7nWnTlrPmVIMbUFOZbMG80+e2+xePQISX9DrcbRpVRFTS5Nqz3FiEbDcTCAV0or7bqdw==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.0", - "@smithy/types": "^4.6.0", + "@smithy/eventstream-serde-universal": "^4.2.3", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -4377,12 +4377,12 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.0.tgz", - "integrity": "sha512-uwx54t8W2Yo9Jr3nVF5cNnkAAnMCJ8Wrm+wDlQY6rY/IrEgZS3OqagtCu/9ceIcZFQ1zVW/zbN9dxb5esuojfA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.3.tgz", + "integrity": "sha512-GewKGZ6lIJ9APjHFqR2cUW+Efp98xLu1KmN0jOWxQ1TN/gx3HTUPVbLciFD8CfScBj2IiKifqh9vYFRRXrYqXA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.6.0", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -4390,13 +4390,13 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.0.tgz", - "integrity": "sha512-yjM2L6QGmWgJjVu/IgYd6hMzwm/tf4VFX0lm8/SvGbGBwc+aFl3hOzvO/e9IJ2XI+22Tx1Zg3vRpFRs04SWFcg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.3.tgz", + "integrity": "sha512-uQobOTQq2FapuSOlmGLUeGTpvcBLE5Fc7XjERUSk4dxEi4AhTwuyHYZNAvL4EMUp7lzxxkKDFaJ1GY0ovrj0Kg==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.0", - "@smithy/types": "^4.6.0", + "@smithy/eventstream-serde-universal": "^4.2.3", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -4404,13 +4404,13 @@ } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.0.tgz", - "integrity": "sha512-C3jxz6GeRzNyGKhU7oV656ZbuHY93mrfkT12rmjDdZch142ykjn8do+VOkeRNjSGKw01p4g+hdalPYPhmMwk1g==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.3.tgz", + "integrity": "sha512-QIvH/CKOk1BZPz/iwfgbh1SQD5Y0lpaw2kLA8zpLRRtYMPXeYUEWh+moTaJyqDaKlbrB174kB7FSRFiZ735tWw==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^4.2.0", - "@smithy/types": "^4.6.0", + "@smithy/eventstream-codec": "^4.2.3", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -4418,14 +4418,14 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.1.tgz", - "integrity": "sha512-3AvYYbB+Dv5EPLqnJIAgYw/9+WzeBiUYS8B+rU0pHq5NMQMvrZmevUROS4V2GAt0jEOn9viBzPLrZE+riTNd5Q==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.4.tgz", + "integrity": "sha512-bwigPylvivpRLCm+YK9I5wRIYjFESSVwl8JQ1vVx/XhCw0PtCi558NwTnT2DaVCl5pYlImGuQTSwMsZ+pIavRw==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.0", - "@smithy/querystring-builder": "^4.2.0", - "@smithy/types": "^4.6.0", + "@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" }, @@ -4434,14 +4434,14 @@ } }, "node_modules/@smithy/hash-blob-browser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.1.tgz", - "integrity": "sha512-Os9cg1fTXMwuqbvjemELlf+HB5oEeVyZmYsTbAtDQBmjGyibjmbeeqcaw7xOJLIHrkH/u0wAYabNcN6FRTqMRg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.4.tgz", + "integrity": "sha512-W7eIxD+rTNsLB/2ynjmbdeP7TgxRXprfvqQxKFEfy9HW2HeD7t+g+KCIrY0pIn/GFjA6/fIpH+JQnfg5TTk76Q==", "license": "Apache-2.0", "dependencies": { "@smithy/chunked-blob-reader": "^5.2.0", "@smithy/chunked-blob-reader-native": "^4.2.1", - "@smithy/types": "^4.6.0", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -4449,12 +4449,12 @@ } }, "node_modules/@smithy/hash-node": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.0.tgz", - "integrity": "sha512-ugv93gOhZGysTctZh9qdgng8B+xO0cj+zN0qAZ+Sgh7qTQGPOJbMdIuyP89KNfUyfAqFSNh5tMvC+h2uCpmTtA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.3.tgz", + "integrity": "sha512-6+NOdZDbfuU6s1ISp3UOk5Rg953RJ2aBLNLLBEcamLjHAg1Po9Ha7QIB5ZWhdRUVuOUrT8BVFR+O2KIPmw027g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.6.0", + "@smithy/types": "^4.8.0", "@smithy/util-buffer-from": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" @@ -4464,12 +4464,12 @@ } }, "node_modules/@smithy/hash-stream-node": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.0.tgz", - "integrity": "sha512-8dELAuGv+UEjtzrpMeNBZc1sJhO8GxFVV/Yh21wE35oX4lOE697+lsMHBoUIFAUuYkTMIeu0EuJSEsH7/8Y+UQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.3.tgz", + "integrity": "sha512-EXMSa2yiStVII3x/+BIynyOAZlS7dGvI7RFrzXa/XssBgck/7TXJIvnjnCu328GY/VwHDC4VeDyP1S4rqwpYag==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.6.0", + "@smithy/types": "^4.8.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -4478,12 +4478,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.0.tgz", - "integrity": "sha512-ZmK5X5fUPAbtvRcUPtk28aqIClVhbfcmfoS4M7UQBTnDdrNxhsrxYVv0ZEl5NaPSyExsPWqL4GsPlRvtlwg+2A==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.3.tgz", + "integrity": "sha512-Cc9W5DwDuebXEDMpOpl4iERo8I0KFjTnomK2RMdhhR87GwrSmUmwMxS4P5JdRf+LsjOdIqumcerwRgYMr/tZ9Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.6.0", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -4503,12 +4503,12 @@ } }, "node_modules/@smithy/md5-js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.0.tgz", - "integrity": "sha512-LFEPniXGKRQArFmDQ3MgArXlClFJMsXDteuQQY8WG1/zzv6gVSo96+qpkuu1oJp4MZsKrwchY0cuAoPKzEbaNA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.3.tgz", + "integrity": "sha512-5+4bUEJQi/NRgzdA5SVXvAwyvEnD0ZAiKzV3yLO6dN5BG8ScKBweZ8mxXXUtdxq+Dx5k6EshKk0XJ7vgvIPSnA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.6.0", + "@smithy/types": "^4.8.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -4517,19 +4517,19 @@ } }, "node_modules/@smithy/middleware-compression": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-4.3.1.tgz", - "integrity": "sha512-5tvL1KRHscZTxbuSiE5RJ6OCQZT0cz2N6iI9tRxtygdR0tp0WfzoVkys5v+uSZGI9LZL7QO5oMYYZD8BZRGT4g==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-4.3.4.tgz", + "integrity": "sha512-pF4uRZXgflN6IOdbqg9l9KMiZd4TTL8wC8c85izeypE4ddrdFOeci+i3T5toK9+Oq/yo5T6czRrYaxuOXUrZsw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.15.0", + "@smithy/core": "^3.17.0", "@smithy/is-array-buffer": "^4.2.0", - "@smithy/node-config-provider": "^4.3.0", - "@smithy/protocol-http": "^5.3.0", - "@smithy/types": "^4.6.0", + "@smithy/node-config-provider": "^4.3.3", + "@smithy/protocol-http": "^5.3.3", + "@smithy/types": "^4.8.0", "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-middleware": "^4.2.0", + "@smithy/util-middleware": "^4.2.3", "@smithy/util-utf8": "^4.2.0", "fflate": "0.8.1", "tslib": "^2.6.2" @@ -4539,13 +4539,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.0.tgz", - "integrity": "sha512-6ZAnwrXFecrA4kIDOcz6aLBhU5ih2is2NdcZtobBDSdSHtE9a+MThB5uqyK4XXesdOCvOcbCm2IGB95birTSOQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.3.tgz", + "integrity": "sha512-/atXLsT88GwKtfp5Jr0Ks1CSa4+lB+IgRnkNrrYP0h1wL4swHNb0YONEvTceNKNdZGJsye+W2HH8W7olbcPUeA==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.0", - "@smithy/types": "^4.6.0", + "@smithy/protocol-http": "^5.3.3", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -4553,18 +4553,18 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.1.tgz", - "integrity": "sha512-JtM4SjEgImLEJVXdsbvWHYiJ9dtuKE8bqLlvkvGi96LbejDL6qnVpVxEFUximFodoQbg0Gnkyff9EKUhFhVJFw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.4.tgz", + "integrity": "sha512-/RJhpYkMOaUZoJEkddamGPPIYeKICKXOu/ojhn85dKDM0n5iDIhjvYAQLP3K5FPhgB203O3GpWzoK2OehEoIUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.15.0", - "@smithy/middleware-serde": "^4.2.0", - "@smithy/node-config-provider": "^4.3.0", - "@smithy/shared-ini-file-loader": "^4.3.0", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", - "@smithy/util-middleware": "^4.2.0", + "@smithy/core": "^3.17.0", + "@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" }, "engines": { @@ -4572,18 +4572,18 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.1.tgz", - "integrity": "sha512-wXxS4ex8cJJteL0PPQmWYkNi9QKDWZIpsndr0wZI2EL+pSSvA/qqxXU60gBOJoIc2YgtZSWY/PE86qhKCCKP1w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.0", - "@smithy/protocol-http": "^5.3.0", - "@smithy/service-error-classification": "^4.2.0", - "@smithy/smithy-client": "^4.7.1", - "@smithy/types": "^4.6.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.4.tgz", + "integrity": "sha512-vSgABQAkuUHRO03AhR2rWxVQ1un284lkBn+NFawzdahmzksAoOeVMnXXsuPViL4GlhRHXqFaMlc8Mj04OfQk1w==", + "license": "Apache-2.0", + "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.0", + "@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" }, @@ -4592,13 +4592,13 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.0.tgz", - "integrity": "sha512-rpTQ7D65/EAbC6VydXlxjvbifTf4IH+sADKg6JmAvhkflJO2NvDeyU9qsWUNBelJiQFcXKejUHWRSdmpJmEmiw==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.3.tgz", + "integrity": "sha512-8g4NuUINpYccxiCXM5s1/V+uLtts8NcX4+sPEbvYQDZk4XoJfDpq5y2FQxfmUL89syoldpzNzA0R9nhzdtdKnQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.0", - "@smithy/types": "^4.6.0", + "@smithy/protocol-http": "^5.3.3", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -4606,12 +4606,12 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.0.tgz", - "integrity": "sha512-G5CJ//eqRd9OARrQu9MK1H8fNm2sMtqFh6j8/rPozhEL+Dokpvi1Og+aCixTuwDAGZUkJPk6hJT5jchbk/WCyg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.3.tgz", + "integrity": "sha512-iGuOJkH71faPNgOj/gWuEGS6xvQashpLwWB1HjHq1lNNiVfbiJLpZVbhddPuDbx9l4Cgl0vPLq5ltRfSaHfspA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.6.0", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -4619,14 +4619,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.0.tgz", - "integrity": "sha512-5QgHNuWdT9j9GwMPPJCKxy2KDxZ3E5l4M3/5TatSZrqYVoEiqQrDfAq8I6KWZw7RZOHtVtCzEPdYz7rHZixwcA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.3.tgz", + "integrity": "sha512-NzI1eBpBSViOav8NVy1fqOlSfkLgkUjUTlohUSgAEhHaFWA3XJiLditvavIP7OpvTjDp5u2LhtlBhkBlEisMwA==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.0", - "@smithy/shared-ini-file-loader": "^4.3.0", - "@smithy/types": "^4.6.0", + "@smithy/property-provider": "^4.2.3", + "@smithy/shared-ini-file-loader": "^4.3.3", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -4634,15 +4634,15 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.3.0.tgz", - "integrity": "sha512-RHZ/uWCmSNZ8cneoWEVsVwMZBKy/8123hEpm57vgGXA3Irf/Ja4v9TVshHK2ML5/IqzAZn0WhINHOP9xl+Qy6Q==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.2.tgz", + "integrity": "sha512-MHFvTjts24cjGo1byXqhXrbqm7uznFD/ESFx8npHMWTFQVdBZjrT1hKottmp69LBTRm/JQzP/sn1vPt0/r6AYQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.2.0", - "@smithy/protocol-http": "^5.3.0", - "@smithy/querystring-builder": "^4.2.0", - "@smithy/types": "^4.6.0", + "@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" }, "engines": { @@ -4650,12 +4650,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.0.tgz", - "integrity": "sha512-rV6wFre0BU6n/tx2Ztn5LdvEdNZ2FasQbPQmDOPfV9QQyDmsCkOAB0osQjotRCQg+nSKFmINhyda0D3AnjSBJw==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.3.tgz", + "integrity": "sha512-+1EZ+Y+njiefCohjlhyOcy1UNYjT+1PwGFHCxA/gYctjg3DQWAU19WigOXAco/Ql8hZokNehpzLd0/+3uCreqQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.6.0", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -4663,12 +4663,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.0.tgz", - "integrity": "sha512-6POSYlmDnsLKb7r1D3SVm7RaYW6H1vcNcTWGWrF7s9+2noNYvUsm7E4tz5ZQ9HXPmKn6Hb67pBDRIjrT4w/d7Q==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.3.tgz", + "integrity": "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.6.0", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -4676,12 +4676,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.0.tgz", - "integrity": "sha512-Q4oFD0ZmI8yJkiPPeGUITZj++4HHYCW3pYBYfIobUCkYpI6mbkzmG1MAQQ3lJYYWj3iNqfzOenUZu+jqdPQ16A==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.3.tgz", + "integrity": "sha512-LOVCGCmwMahYUM/P0YnU/AlDQFjcu+gWbFJooC417QRB/lDJlWSn8qmPSDp+s4YVAHOgtgbNG4sR+SxF/VOcJQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.6.0", + "@smithy/types": "^4.8.0", "@smithy/util-uri-escape": "^4.2.0", "tslib": "^2.6.2" }, @@ -4690,12 +4690,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.0.tgz", - "integrity": "sha512-BjATSNNyvVbQxOOlKse0b0pSezTWGMvA87SvoFoFlkRsKXVsN3bEtjCxvsNXJXfnAzlWFPaT9DmhWy1vn0sNEA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.3.tgz", + "integrity": "sha512-cYlSNHcTAX/wc1rpblli3aUlLMGgKZ/Oqn8hhjFASXMCXjIqeuQBei0cnq2JR8t4RtU9FpG6uyl6PxyArTiwKA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.6.0", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -4703,24 +4703,24 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.0.tgz", - "integrity": "sha512-Ylv1ttUeKatpR0wEOMnHf1hXMktPUMObDClSWl2TpCVT4DwtJhCeighLzSLbgH3jr5pBNM0LDXT5yYxUvZ9WpA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.3.tgz", + "integrity": "sha512-NkxsAxFWwsPsQiwFG2MzJ/T7uIR6AQNh1SzcxSUnmmIqIQMlLRQDKhc17M7IYjiuBXhrQRjQTo3CxX+DobS93g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.6.0" + "@smithy/types": "^4.8.0" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.3.0.tgz", - "integrity": "sha512-VCUPPtNs+rKWlqqntX0CbVvWyjhmX30JCtzO+s5dlzzxrvSfRh5SY0yxnkirvc1c80vdKQttahL71a9EsdolSQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.3.3.tgz", + "integrity": "sha512-9f9Ixej0hFhroOK2TxZfUUDR13WVa8tQzhSzPDgXe5jGL3KmaM9s8XN7RQwqtEypI82q9KHnKS71CJ+q/1xLtQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.6.0", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -4728,16 +4728,16 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.0.tgz", - "integrity": "sha512-MKNyhXEs99xAZaFhm88h+3/V+tCRDQ+PrDzRqL0xdDpq4gjxcMmf5rBA3YXgqZqMZ/XwemZEurCBQMfxZOWq/g==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.3.tgz", + "integrity": "sha512-CmSlUy+eEYbIEYN5N3vvQTRfqt0lJlQkaQUIf+oizu7BbDut0pozfDjBGecfcfWf7c62Yis4JIEgqQ/TCfodaA==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^4.2.0", - "@smithy/protocol-http": "^5.3.0", - "@smithy/types": "^4.6.0", + "@smithy/protocol-http": "^5.3.3", + "@smithy/types": "^4.8.0", "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-middleware": "^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" @@ -4747,17 +4747,17 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.7.1.tgz", - "integrity": "sha512-WXVbiyNf/WOS/RHUoFMkJ6leEVpln5ojCjNBnzoZeMsnCg3A0BRhLK3WYc4V7PmYcYPZh9IYzzAg9XcNSzYxYQ==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.0.tgz", + "integrity": "sha512-qz7RTd15GGdwJ3ZCeBKLDQuUQ88m+skh2hJwcpPm1VqLeKzgZvXf6SrNbxvx7uOqvvkjCMXqx3YB5PDJyk00ww==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.15.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-stack": "^4.2.0", - "@smithy/protocol-http": "^5.3.0", - "@smithy/types": "^4.6.0", - "@smithy/util-stream": "^4.5.0", + "@smithy/core": "^3.17.0", + "@smithy/middleware-endpoint": "^4.3.4", + "@smithy/middleware-stack": "^4.2.3", + "@smithy/protocol-http": "^5.3.3", + "@smithy/types": "^4.8.0", + "@smithy/util-stream": "^4.5.3", "tslib": "^2.6.2" }, "engines": { @@ -4765,9 +4765,9 @@ } }, "node_modules/@smithy/types": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.6.0.tgz", - "integrity": "sha512-4lI9C8NzRPOv66FaY1LL1O/0v0aLVrq/mXP/keUa9mJOApEeae43LsLd2kZRUJw91gxOQfLIrV3OvqPgWz1YsA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz", + "integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -4777,13 +4777,13 @@ } }, "node_modules/@smithy/url-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.0.tgz", - "integrity": "sha512-AlBmD6Idav2ugmoAL6UtR6ItS7jU5h5RNqLMZC7QrLCoITA9NzIN3nx9GWi8g4z1pfWh2r9r96SX/jHiNwPJ9A==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.3.tgz", + "integrity": "sha512-I066AigYvY3d9VlU3zG9XzZg1yT10aNqvCaBTw9EPgu5GrsEl1aUkcMvhkIXascYH1A8W0LQo3B1Kr1cJNcQEw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.2.0", - "@smithy/types": "^4.6.0", + "@smithy/querystring-parser": "^4.2.3", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -4854,14 +4854,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.0.tgz", - "integrity": "sha512-H4MAj8j8Yp19Mr7vVtGgi7noJjvjJbsKQJkvNnLlrIFduRFT5jq5Eri1k838YW7rN2g5FTnXpz5ktKVr1KVgPQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.3.tgz", + "integrity": "sha512-vqHoybAuZXbFXZqgzquiUXtdY+UT/aU33sxa4GBPkiYklmR20LlCn+d3Wc3yA5ZM13gQ92SZe/D8xh6hkjx+IQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.0", - "@smithy/smithy-client": "^4.7.1", - "@smithy/types": "^4.6.0", + "@smithy/property-provider": "^4.2.3", + "@smithy/smithy-client": "^4.9.0", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -4869,17 +4869,17 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.1.tgz", - "integrity": "sha512-PuDcgx7/qKEMzV1QFHJ7E4/MMeEjaA7+zS5UNcHCLPvvn59AeZQ0DSDGMpqC2xecfa/1cNGm4l8Ec/VxCuY7Ug==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.4.tgz", + "integrity": "sha512-X5/xrPHedifo7hJUUWKlpxVb2oDOiqPUXlvsZv1EZSjILoutLiJyWva3coBpn00e/gPSpH8Rn2eIbgdwHQdW7Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.3.0", - "@smithy/credential-provider-imds": "^4.2.0", - "@smithy/node-config-provider": "^4.3.0", - "@smithy/property-provider": "^4.2.0", - "@smithy/smithy-client": "^4.7.1", - "@smithy/types": "^4.6.0", + "@smithy/config-resolver": "^4.3.3", + "@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.0", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -4887,13 +4887,13 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.0.tgz", - "integrity": "sha512-TXeCn22D56vvWr/5xPqALc9oO+LN+QpFjrSM7peG/ckqEPoI3zaKZFp+bFwfmiHhn5MGWPaLCqDOJPPIixk9Wg==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.3.tgz", + "integrity": "sha512-aCfxUOVv0CzBIkU10TubdgKSx5uRvzH064kaiPEWfNIvKOtNpu642P4FP1hgOFkjQIkDObrfIDnKMKkeyrejvQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.0", - "@smithy/types": "^4.6.0", + "@smithy/node-config-provider": "^4.3.3", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -4913,12 +4913,12 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.0.tgz", - "integrity": "sha512-u9OOfDa43MjagtJZ8AapJcmimP+K2Z7szXn8xbty4aza+7P1wjFmy2ewjSbhEiYQoW1unTlOAIV165weYAaowA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.3.tgz", + "integrity": "sha512-v5ObKlSe8PWUHCqEiX2fy1gNv6goiw6E5I/PN2aXg3Fb/hse0xeaAnSpXDiWl7x6LamVKq7senB+m5LOYHUAHw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.6.0", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -4926,13 +4926,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.0.tgz", - "integrity": "sha512-BWSiuGbwRnEE2SFfaAZEX0TqaxtvtSYPM/J73PFVm+A29Fg1HTPiYFb8TmX1DXp4hgcdyJcNQmprfd5foeORsg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.3.tgz", + "integrity": "sha512-lLPWnakjC0q9z+OtiXk+9RPQiYPNAovt2IXD3CP4LkOnd9NpUsxOjMx1SnoUVB7Orb7fZp67cQMtTBKMFDvOGg==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.2.0", - "@smithy/types": "^4.6.0", + "@smithy/service-error-classification": "^4.2.3", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -4940,14 +4940,14 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.0.tgz", - "integrity": "sha512-0TD5M5HCGu5diEvZ/O/WquSjhJPasqv7trjoqHyWjNh/FBeBl7a0ztl9uFMOsauYtRfd8jvpzIAQhDHbx+nvZw==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.3.tgz", + "integrity": "sha512-oZvn8a5bwwQBNYHT2eNo0EU8Kkby3jeIg1P2Lu9EQtqDxki1LIjGRJM6dJ5CZUig8QmLxWxqOKWvg3mVoOBs5A==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/node-http-handler": "^4.3.0", - "@smithy/types": "^4.6.0", + "@smithy/fetch-http-handler": "^5.3.4", + "@smithy/node-http-handler": "^4.4.2", + "@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", @@ -4984,13 +4984,13 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.0.tgz", - "integrity": "sha512-0Z+nxUU4/4T+SL8BCNN4ztKdQjToNvUYmkF1kXO5T7Yz3Gafzh0HeIG6mrkN8Fz3gn9hSyxuAT+6h4vM+iQSBQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.3.tgz", + "integrity": "sha512-5+nU///E5sAdD7t3hs4uwvCTWQtTR8JwKwOCSJtBRx0bY1isDo1QwH87vRK86vlFLBTISqoDA2V6xvP6nF1isQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.2.0", - "@smithy/types": "^4.6.0", + "@smithy/abort-controller": "^4.2.3", + "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "engines": { @@ -10721,8 +10721,8 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.908.0", - "@aws-sdk/lib-dynamodb": "^3.908.0", + "@aws-sdk/client-dynamodb": "^3.913.0", + "@aws-sdk/lib-dynamodb": "^3.913.0", "aws-sdk-client-mock": "^4.1.0" }, "peerDependencies": { @@ -10822,7 +10822,7 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.908.0", + "@aws-sdk/client-cloudwatch": "^3.913.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, @@ -10844,11 +10844,11 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.908.0", - "@aws-sdk/client-dynamodb": "^3.908.0", - "@aws-sdk/client-secrets-manager": "^3.908.0", - "@aws-sdk/client-ssm": "^3.908.0", - "@aws-sdk/util-dynamodb": "^3.908.0", + "@aws-sdk/client-appconfigdata": "^3.913.0", + "@aws-sdk/client-dynamodb": "^3.913.0", + "@aws-sdk/client-secrets-manager": "^3.913.0", + "@aws-sdk/client-ssm": "^3.913.0", + "@aws-sdk/util-dynamodb": "^3.913.0", "@smithy/util-base64": "^4.0.0", "aws-sdk-client-mock": "^4.1.0" }, @@ -10911,7 +10911,7 @@ "license": "MIT-0", "dependencies": { "@aws-cdk/toolkit-lib": "^1.10.0", - "@aws-sdk/client-lambda": "^3.908.0", + "@aws-sdk/client-lambda": "^3.913.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.219.0", "esbuild": "^0.25.11", @@ -10932,8 +10932,8 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.908.0", - "@aws-sdk/client-xray": "^3.908.0" + "@aws-sdk/client-dynamodb": "^3.913.0", + "@aws-sdk/client-xray": "^3.913.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x" diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index f546652272..f4b1048de8 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -151,8 +151,8 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.908.0", - "@aws-sdk/lib-dynamodb": "^3.908.0", + "@aws-sdk/client-dynamodb": "^3.913.0", + "@aws-sdk/lib-dynamodb": "^3.913.0", "aws-sdk-client-mock": "^4.1.0" } } diff --git a/packages/metrics/package.json b/packages/metrics/package.json index 48f168be3d..c6fe42c47a 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -65,7 +65,7 @@ "main": "./lib/cjs/index.js", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.908.0", + "@aws-sdk/client-cloudwatch": "^3.913.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, diff --git a/packages/parameters/package.json b/packages/parameters/package.json index a614868866..4909c4cbfe 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -156,11 +156,11 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.908.0", - "@aws-sdk/client-dynamodb": "^3.908.0", - "@aws-sdk/client-secrets-manager": "^3.908.0", - "@aws-sdk/client-ssm": "^3.908.0", - "@aws-sdk/util-dynamodb": "^3.908.0", + "@aws-sdk/client-appconfigdata": "^3.913.0", + "@aws-sdk/client-dynamodb": "^3.913.0", + "@aws-sdk/client-secrets-manager": "^3.913.0", + "@aws-sdk/client-ssm": "^3.913.0", + "@aws-sdk/util-dynamodb": "^3.913.0", "@smithy/util-base64": "^4.0.0", "aws-sdk-client-mock": "^4.1.0" }, diff --git a/packages/testing/package.json b/packages/testing/package.json index ded0c443b5..8421ece985 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -99,7 +99,7 @@ "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/testing#readme", "dependencies": { "@aws-cdk/toolkit-lib": "^1.10.0", - "@aws-sdk/client-lambda": "^3.908.0", + "@aws-sdk/client-lambda": "^3.913.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.219.0", "esbuild": "^0.25.11", diff --git a/packages/tracer/package.json b/packages/tracer/package.json index d7ec8ed8e1..4e638cd58b 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -30,8 +30,8 @@ "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.908.0", - "@aws-sdk/client-xray": "^3.908.0" + "@aws-sdk/client-dynamodb": "^3.913.0", + "@aws-sdk/client-xray": "^3.913.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x" From 3886af3a275020ddae8d67cc9c5efaa74464db9c Mon Sep 17 00:00:00 2001 From: Stefano Vozza Date: Mon, 20 Oct 2025 18:05:25 +0100 Subject: [PATCH 255/255] feat(metrics): use async local storage for metrics (#4663) --- package-lock.json | 12 +- packages/metrics/package.json | 3 +- packages/metrics/src/DimensionsStore.ts | 104 ++++++ packages/metrics/src/MetadataStore.ts | 50 +++ packages/metrics/src/Metrics.ts | 233 +++++-------- packages/metrics/src/MetricsStore.ts | 157 +++++++++ .../unit/concurrency/dimensionsStore.test.ts | 156 +++++++++ .../unit/concurrency/metadataStore.test.ts | 193 +++++++++++ .../tests/unit/concurrency/metrics.test.ts | 134 ++++++++ .../unit/concurrency/metricsStore.test.ts | 319 ++++++++++++++++++ packages/metrics/tests/unit/helpers.ts | 134 ++++++++ 11 files changed, 1340 insertions(+), 155 deletions(-) create mode 100644 packages/metrics/src/DimensionsStore.ts create mode 100644 packages/metrics/src/MetadataStore.ts create mode 100644 packages/metrics/src/MetricsStore.ts create mode 100644 packages/metrics/tests/unit/concurrency/dimensionsStore.test.ts create mode 100644 packages/metrics/tests/unit/concurrency/metadataStore.test.ts create mode 100644 packages/metrics/tests/unit/concurrency/metrics.test.ts create mode 100644 packages/metrics/tests/unit/concurrency/metricsStore.test.ts create mode 100644 packages/metrics/tests/unit/helpers.ts diff --git a/package-lock.json b/package-lock.json index c6a39567de..640740e12e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10818,7 +10818,8 @@ "version": "2.27.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.27.0" + "@aws-lambda-powertools/commons": "2.27.0", + "@aws/lambda-invoke-store": "^0.1.0" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", @@ -10835,6 +10836,15 @@ } } }, + "packages/metrics/node_modules/@aws/lambda-invoke-store": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.1.0.tgz", + "integrity": "sha512-I1y5yahbSFTfKldV4qoKv2IEZ20QOhn5rPvWwGnswZ8hssN7tsLANLg9tL8dp2klz2MZDGL5jZrvBwplIWtM8A==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, "packages/parameters": { "name": "@aws-lambda-powertools/parameters", "version": "2.27.0", diff --git a/packages/metrics/package.json b/packages/metrics/package.json index c6fe42c47a..e50789a747 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -88,7 +88,8 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.27.0" + "@aws-lambda-powertools/commons": "2.27.0", + "@aws/lambda-invoke-store": "0.1.0" }, "keywords": [ "aws", diff --git a/packages/metrics/src/DimensionsStore.ts b/packages/metrics/src/DimensionsStore.ts new file mode 100644 index 0000000000..0ce43132e7 --- /dev/null +++ b/packages/metrics/src/DimensionsStore.ts @@ -0,0 +1,104 @@ +import { InvokeStore } from '@aws/lambda-invoke-store'; +import type { Dimensions } from './types/Metrics.js'; + +/** + * Manages storage of metrics dimensions with automatic context detection. + * + * This class abstracts the storage mechanism for metrics, automatically + * choosing between AsyncLocalStorage (when in async context) and a fallback + * object (when outside async context). The decision is made at runtime on + * every method call to support Lambda's transition to async contexts. + */ +class DimensionsStore { + readonly #dimensionsKey = Symbol('powertools.metrics.dimensions'); + readonly #dimensionSetsKey = Symbol('powertools.metrics.dimensionSets'); + + #fallbackDimensions: Dimensions = {}; + #fallbackDimensionSets: Dimensions[] = []; + #defaultDimensions: Dimensions = {}; + + #getDimensions(): Dimensions { + if (InvokeStore.getContext() === undefined) { + return this.#fallbackDimensions; + } + + let stored = InvokeStore.get(this.#dimensionsKey) as Dimensions | undefined; + if (stored == null) { + stored = {}; + InvokeStore.set(this.#dimensionsKey, stored); + } + return stored; + } + + #getDimensionSets(): Dimensions[] { + if (InvokeStore.getContext() === undefined) { + return this.#fallbackDimensionSets; + } + + let stored = InvokeStore.get(this.#dimensionSetsKey) as + | Dimensions[] + | undefined; + if (stored == null) { + stored = []; + InvokeStore.set(this.#dimensionSetsKey, stored); + } + return stored; + } + + public addDimension(name: string, value: string): string { + this.#getDimensions()[name] = value; + return value; + } + + public addDimensionSet(dimensionSet: Dimensions): Dimensions { + this.#getDimensionSets().push({ ...dimensionSet }); + return dimensionSet; + } + + public getDimensions(): Dimensions { + return { ...this.#getDimensions() }; + } + + public getDimensionSets(): Dimensions[] { + return this.#getDimensionSets().map((set) => ({ ...set })); + } + + public clearRequestDimensions(): void { + if (InvokeStore.getContext() === undefined) { + this.#fallbackDimensions = {}; + this.#fallbackDimensionSets = []; + return; + } + + InvokeStore.set(this.#dimensionsKey, {}); + InvokeStore.set(this.#dimensionSetsKey, []); + } + + public clearDefaultDimensions(): void { + this.#defaultDimensions = {}; + } + + public getDimensionCount(): number { + const dimensions = this.#getDimensions(); + const dimensionSets = this.#getDimensionSets(); + const dimensionSetsCount = dimensionSets.reduce( + (total, dimensionSet) => total + Object.keys(dimensionSet).length, + 0 + ); + return ( + Object.keys(dimensions).length + + Object.keys(this.#defaultDimensions).length + + dimensionSetsCount + ); + } + + public setDefaultDimensions(dimensions: Dimensions): void { + this.#defaultDimensions = { ...dimensions }; + } + + public getDefaultDimensions(): Dimensions { + return { ...this.#defaultDimensions }; + } +} + +export { DimensionsStore }; diff --git a/packages/metrics/src/MetadataStore.ts b/packages/metrics/src/MetadataStore.ts new file mode 100644 index 0000000000..833048e442 --- /dev/null +++ b/packages/metrics/src/MetadataStore.ts @@ -0,0 +1,50 @@ +import { InvokeStore } from '@aws/lambda-invoke-store'; + +/** + * Manages storage of metrics #metadata with automatic context detection. + * + * This class abstracts the storage mechanism for metrics, automatically + * choosing between AsyncLocalStorage (when in async context) and a fallback + * object (when outside async context). The decision is made at runtime on + * every method call to support Lambda's transition to async contexts. + */ +class MetadataStore { + readonly #metadataKey = Symbol('powertools.metrics.metadata'); + + #fallbackStorage: Record = {}; + + #getStorage(): Record { + if (InvokeStore.getContext() === undefined) { + return this.#fallbackStorage; + } + + let stored = InvokeStore.get(this.#metadataKey) as + | Record + | undefined; + if (stored == null) { + stored = {}; + InvokeStore.set(this.#metadataKey, stored); + } + return stored; + } + + public set(key: string, value: string): string { + this.#getStorage()[key] = value; + return value; + } + + public getAll(): Record { + return { ...this.#getStorage() }; + } + + public clear(): void { + if (InvokeStore.getContext() === undefined) { + this.#fallbackStorage = {}; + return; + } + + InvokeStore.set(this.#metadataKey, {}); + } +} + +export { MetadataStore }; diff --git a/packages/metrics/src/Metrics.ts b/packages/metrics/src/Metrics.ts index ad9e2de7f4..c29160e89b 100644 --- a/packages/metrics/src/Metrics.ts +++ b/packages/metrics/src/Metrics.ts @@ -30,6 +30,9 @@ import { MetricUnit as MetricUnits, MIN_METRIC_NAME_LENGTH, } from './constants.js'; +import { DimensionsStore } from './DimensionsStore.js'; +import { MetadataStore } from './MetadataStore.js'; +import { MetricsStore } from './MetricsStore.js'; import type { ConfigServiceInterface, Dimensions, @@ -40,7 +43,6 @@ import type { MetricsInterface, MetricsOptions, MetricUnit, - StoredMetrics, } from './types/index.js'; /** @@ -156,22 +158,9 @@ class Metrics extends Utility implements MetricsInterface { private customConfigService?: ConfigServiceInterface; /** - * Default dimensions to be added to all metrics - * @default {} + * Storage for dimensions */ - private defaultDimensions: Dimensions = {}; - - /** - * Additional dimensions for the current metrics context - * @default {} - */ - private dimensions: Dimensions = {}; - - /** - * Additional dimension sets for the current metrics context - * @default [] - */ - private dimensionSets: Dimensions[] = []; + readonly #dimensionsStore = new DimensionsStore(); /** * Name of the Lambda function @@ -193,9 +182,8 @@ class Metrics extends Utility implements MetricsInterface { /** * Additional metadata to be included with metrics - * @default {} */ - private metadata: Record = {}; + readonly #metadataStore = new MetadataStore(); /** * Namespace for the metrics @@ -210,9 +198,8 @@ class Metrics extends Utility implements MetricsInterface { /** * Storage for metrics before they are published - * @default {} */ - private storedMetrics: StoredMetrics = {}; + readonly #metricsStore = new MetricsStore(); /** * Whether to disable metrics @@ -231,15 +218,8 @@ class Metrics extends Utility implements MetricsInterface { devMode: false, }; - /** - * Custom timestamp for the metrics - */ - #timestamp?: number; - public constructor(options: MetricsOptions = {}) { super(); - - this.dimensions = {}; this.setEnvConfig(); this.setConsole(); this.#logger = options.logger || this.console; @@ -266,20 +246,22 @@ class Metrics extends Utility implements MetricsInterface { ); return; } - if (MAX_DIMENSION_COUNT <= this.getCurrentDimensionsCount()) { + if (MAX_DIMENSION_COUNT <= this.#dimensionsStore.getDimensionCount()) { throw new RangeError( `The number of metric dimensions must be lower than ${MAX_DIMENSION_COUNT}` ); } + const dimensions = this.#dimensionsStore.getDimensions(); + const defaultDimensions = this.#dimensionsStore.getDefaultDimensions(); if ( - Object.hasOwn(this.dimensions, name) || - Object.hasOwn(this.defaultDimensions, name) + Object.hasOwn(dimensions, name) || + Object.hasOwn(defaultDimensions, name) ) { this.#logger.warn( `Dimension "${name}" has already been added. The previous value will be overwritten.` ); } - this.dimensions[name] = value; + this.#dimensionsStore.addDimension(name, value); } /** @@ -296,7 +278,7 @@ class Metrics extends Utility implements MetricsInterface { */ public addDimensions(dimensions: Dimensions): void { const newDimensions = this.#sanitizeDimensions(dimensions); - const currentCount = this.getCurrentDimensionsCount(); + const currentCount = this.#dimensionsStore.getDimensionCount(); const newSetCount = Object.keys(newDimensions).length; if (currentCount + newSetCount >= MAX_DIMENSION_COUNT) { throw new RangeError( @@ -304,7 +286,7 @@ class Metrics extends Utility implements MetricsInterface { ); } - this.dimensionSets.push(newDimensions); + this.#dimensionsStore.addDimensionSet(newDimensions); } /** @@ -335,7 +317,7 @@ class Metrics extends Utility implements MetricsInterface { * @param value - The value of the metadata */ public addMetadata(key: string, value: string): void { - this.metadata[key] = value; + this.#metadataStore.set(key, value); } /** @@ -442,7 +424,7 @@ class Metrics extends Utility implements MetricsInterface { * ``` */ public clearDefaultDimensions(): void { - this.defaultDimensions = {}; + this.#dimensionsStore.clearDefaultDimensions(); } /** @@ -475,8 +457,7 @@ class Metrics extends Utility implements MetricsInterface { * The method is primarily intended for internal use, but it is exposed for advanced use cases. */ public clearDimensions(): void { - this.dimensions = {}; - this.dimensionSets = []; + this.#dimensionsStore.clearRequestDimensions(); } /** @@ -488,7 +469,7 @@ class Metrics extends Utility implements MetricsInterface { * The method is primarily intended for internal use, but it is exposed for advanced use cases. */ public clearMetadata(): void { - this.metadata = {}; + this.#metadataStore.clear(); } /** @@ -499,14 +480,14 @@ class Metrics extends Utility implements MetricsInterface { * The method is primarily intended for internal use, but it is exposed for advanced use cases. */ public clearMetrics(): void { - this.storedMetrics = {}; + this.#metricsStore.clearMetrics(); } /** * Check if there are stored metrics in the buffer. */ public hasStoredMetrics(): boolean { - return Object.keys(this.storedMetrics).length > 0; + return this.#metricsStore.hasMetrics(); } /** @@ -670,7 +651,7 @@ class Metrics extends Utility implements MetricsInterface { 'Ensure the timestamp is within 14 days in the past or up to 2 hours in the future and is also a valid number or Date object.' ); } - this.#timestamp = this.#convertTimestampToEmfFormat(timestamp); + this.#metricsStore.setTimestamp(timestamp); } /** @@ -686,16 +667,17 @@ class Metrics extends Utility implements MetricsInterface { * The object is then emitted to standard output, which in AWS Lambda is picked up by CloudWatch logs and processed asynchronously. */ public serializeMetrics(): EmfOutput { - // Storage resolution is included only for High resolution metrics - const metricDefinitions: MetricDefinition[] = Object.values( - this.storedMetrics - ).map((metricDefinition) => ({ - Name: metricDefinition.name, - Unit: metricDefinition.unit, - ...(metricDefinition.resolution === MetricResolutions.High - ? { StorageResolution: metricDefinition.resolution } - : {}), - })); + const metricDefinitions: MetricDefinition[] = this.#metricsStore + .getAllMetrics() + .map((metricDefinition) => { + return { + Name: metricDefinition.name, + Unit: metricDefinition.unit, + ...(metricDefinition.resolution === MetricResolutions.High + ? { StorageResolution: metricDefinition.resolution } + : {}), + }; + }); if (metricDefinitions.length === 0 && this.shouldThrowOnEmptyMetrics) { throw new RangeError( @@ -708,32 +690,40 @@ class Metrics extends Utility implements MetricsInterface { // We reduce the stored metrics to a single object with the metric // name as the key and the value as the value. - const metricValues = Object.values(this.storedMetrics).reduce( + const metricValues = this.#metricsStore.getAllMetrics().reduce( ( result: Record, - { name, value }: { name: string; value: number | number[] } + { + name, + value, + }: { + name: string; + value: number | number[]; + } ) => { result[name] = value; - return result; }, {} ); const dimensionNames = []; + const dimensions = this.#dimensionsStore.getDimensions(); + const dimensionSets = this.#dimensionsStore.getDimensionSets(); + const defaultDimensions = this.#dimensionsStore.getDefaultDimensions(); const allDimensionKeys = new Set([ - ...Object.keys(this.defaultDimensions), - ...Object.keys(this.dimensions), + ...Object.keys(defaultDimensions), + ...Object.keys(dimensions), ]); - if (Object.keys(this.dimensions).length > 0) { + if (Object.keys(dimensions).length > 0) { dimensionNames.push([...allDimensionKeys]); } - for (const dimensionSet of this.dimensionSets) { + for (const dimensionSet of dimensionSets) { const dimensionSetKeys = new Set([ - ...Object.keys(this.defaultDimensions), + ...Object.keys(defaultDimensions), ...Object.keys(dimensionSet), ]); dimensionNames.push([...dimensionSetKeys]); @@ -741,14 +731,14 @@ class Metrics extends Utility implements MetricsInterface { if ( dimensionNames.length === 0 && - Object.keys(this.defaultDimensions).length > 0 + Object.keys(defaultDimensions).length > 0 ) { - dimensionNames.push([...Object.keys(this.defaultDimensions)]); + dimensionNames.push(Object.keys(defaultDimensions)); } return { _aws: { - Timestamp: this.#timestamp ?? Date.now(), + Timestamp: this.#metricsStore.getTimestamp() ?? Date.now(), CloudWatchMetrics: [ { Namespace: this.namespace || DEFAULT_NAMESPACE, @@ -757,17 +747,17 @@ class Metrics extends Utility implements MetricsInterface { }, ], }, - ...this.defaultDimensions, - ...this.dimensions, + ...defaultDimensions, + ...dimensions, // Merge all dimension sets efficiently by mutating the accumulator - ...this.dimensionSets.reduce((acc, dims) => { + ...dimensionSets.reduce((acc, dims) => { for (const [key, value] of Object.entries(dims)) { acc[key] = value; } return acc; - }, {} as Dimensions), + }, {}), ...metricValues, - ...this.metadata, + ...this.#metadataStore.getAll(), }; } @@ -797,7 +787,9 @@ class Metrics extends Utility implements MetricsInterface { */ public setDefaultDimensions(dimensions: Dimensions): void { const newDimensions = this.#sanitizeDimensions(dimensions); - const currentCount = Object.keys(this.defaultDimensions).length; + const currentDefaultDimensions = + this.#dimensionsStore.getDefaultDimensions(); + const currentCount = Object.keys(currentDefaultDimensions).length; const newSetCount = Object.keys(newDimensions).length; if (currentCount + newSetCount >= MAX_DIMENSION_COUNT) { throw new RangeError( @@ -805,10 +797,10 @@ class Metrics extends Utility implements MetricsInterface { ); } - this.defaultDimensions = { - ...this.defaultDimensions, + this.#dimensionsStore.setDefaultDimensions({ + ...currentDefaultDimensions, ...newDimensions, - }; + }); } /** @@ -865,7 +857,7 @@ class Metrics extends Utility implements MetricsInterface { public singleMetric(): Metrics { return new Metrics({ namespace: this.namespace, - defaultDimensions: this.defaultDimensions, + defaultDimensions: this.#dimensionsStore.getDefaultDimensions(), singleMetric: true, logger: this.#logger, }); @@ -878,21 +870,6 @@ class Metrics extends Utility implements MetricsInterface { this.shouldThrowOnEmptyMetrics = true; } /* v8 ignore stop */ - /** - * Gets the current number of dimensions count. - */ - private getCurrentDimensionsCount(): number { - const dimensionSetsCount = this.dimensionSets.reduce( - (total, dimensionSet) => total + Object.keys(dimensionSet).length, - 0 - ); - return ( - Object.keys(this.dimensions).length + - Object.keys(this.defaultDimensions).length + - dimensionSetsCount - ); - } - /** * Get the custom config service if it exists. */ @@ -900,32 +877,6 @@ class Metrics extends Utility implements MetricsInterface { return this.customConfigService; } - /** - * Check if a metric is new or not. - * - * A metric is considered new if there is no metric with the same name already stored. - * - * When a metric is not new, we also check if the unit is consistent with the stored metric with - * the same name. If the units are inconsistent, we throw an error as this is likely a bug or typo. - * This can happen if a metric is added without using the `MetricUnit` helper in JavaScript codebases. - * - * @param name - The name of the metric - * @param unit - The unit of the metric - */ - private isNewMetric(name: string, unit: MetricUnit): boolean { - if (this.storedMetrics[name]) { - if (this.storedMetrics[name].unit !== unit) { - const currentUnit = this.storedMetrics[name].unit; - throw new Error( - `Metric "${name}" has already been added with unit "${currentUnit}", but we received unit "${unit}". Did you mean to use metric unit "${currentUnit}"?` - ); - } - - return false; - } - return true; - } - /** * Initialize the console property as an instance of the internal version of `Console()` class (PR #748) * or as the global node console if the `POWERTOOLS_DEV' env variable is set and has truthy value. @@ -1099,26 +1050,21 @@ class Metrics extends Utility implements MetricsInterface { `Invalid metric resolution '${resolution}', expected either option: ${Object.values(MetricResolutions).join(',')}` ); - if (Object.keys(this.storedMetrics).length >= MAX_METRICS_SIZE) { + if (this.#metricsStore.getMetricsCount() >= MAX_METRICS_SIZE) { this.publishStoredMetrics(); } - if (this.isNewMetric(name, unit)) { - this.storedMetrics[name] = { - unit, - value, - name, - resolution, - }; - } else { - const storedMetric = this.storedMetrics[name]; - if (!Array.isArray(storedMetric.value)) { - storedMetric.value = [storedMetric.value]; - } - storedMetric.value.push(value); - if (storedMetric.value.length === MAX_METRIC_VALUES_SIZE) { - this.publishStoredMetrics(); - } + const storedMetric = this.#metricsStore.setMetric( + name, + unit, + value, + resolution + ); + if ( + Array.isArray(storedMetric.value) && + storedMetric.value.length === MAX_METRIC_VALUES_SIZE + ) { + this.publishStoredMetrics(); } } @@ -1147,27 +1093,6 @@ class Metrics extends Utility implements MetricsInterface { return timestampMs >= minValidTimestamp && timestampMs <= maxValidTimestamp; } - /** - * Converts a given timestamp to EMF compatible format. - * - * @param timestamp - The timestamp to convert, which can be either a number (in milliseconds) or a Date object. - * @returns The timestamp in milliseconds. If the input is invalid, returns 0. - */ - #convertTimestampToEmfFormat(timestamp: number | Date): number { - if (isIntegerNumber(timestamp)) { - return timestamp; - } - if (timestamp instanceof Date) { - return timestamp.getTime(); - } - /** - * If this point is reached, it indicates timestamp was neither a valid number nor Date - * Returning zero represents the initial date of epoch time, - * which will be skipped by Amazon CloudWatch. - */ - return 0; - } - /** * Sanitizes the dimensions by removing invalid entries and skipping duplicates. * @@ -1175,6 +1100,7 @@ class Metrics extends Utility implements MetricsInterface { */ #sanitizeDimensions(dimensions: Dimensions): Dimensions { const newDimensions: Dimensions = {}; + const currentDimensions = this.#dimensionsStore.getDimensions(); for (const [key, value] of Object.entries(dimensions)) { if ( isStringUndefinedNullEmpty(key) || @@ -1185,9 +1111,10 @@ class Metrics extends Utility implements MetricsInterface { ); continue; } + const defaultDimensions = this.#dimensionsStore.getDefaultDimensions(); if ( - Object.hasOwn(this.dimensions, key) || - Object.hasOwn(this.defaultDimensions, key) || + Object.hasOwn(currentDimensions, key) || + Object.hasOwn(defaultDimensions, key) || Object.hasOwn(newDimensions, key) ) { this.#logger.warn( diff --git a/packages/metrics/src/MetricsStore.ts b/packages/metrics/src/MetricsStore.ts new file mode 100644 index 0000000000..d2c08b3559 --- /dev/null +++ b/packages/metrics/src/MetricsStore.ts @@ -0,0 +1,157 @@ +import { InvokeStore } from '@aws/lambda-invoke-store'; +import { isIntegerNumber } from '@aws-lambda-powertools/commons/typeutils'; +import { MetricResolution as MetricResolutions } from './constants.js'; +import type { + MetricResolution, + MetricUnit, + StoredMetric, + StoredMetrics, +} from './types/index.js'; + +/** + * Manages storage of metrics with automatic context detection. + * + * This class abstracts the storage mechanism for metrics, automatically + * choosing between AsyncLocalStorage (when in async context) and a fallback + * object (when outside async context). The decision is made at runtime on + * every method call to support Lambda's transition to async contexts. + */ +class MetricsStore { + readonly #storedMetricsKey = Symbol('powertools.metrics.storedMetrics'); + readonly #timestampKey = Symbol('powertools.metrics.timestamp'); + + #fallbackStorage: StoredMetrics = {}; + #fallbackTimestamp?: number; + + #getStorage(): StoredMetrics { + if (InvokeStore.getContext() === undefined) { + return this.#fallbackStorage; + } + + let stored = InvokeStore.get(this.#storedMetricsKey) as + | StoredMetrics + | undefined; + if (stored == null) { + stored = {}; + InvokeStore.set(this.#storedMetricsKey, stored); + } + return stored; + } + + public getMetric(name: string): StoredMetric | undefined { + return this.#getStorage()[name]; + } + + /** + * Adds a metric value to storage. If a metric with the same name already exists, + * the value is appended to an array. Validates that the unit matches any existing metric. + * + * @example + * ```typescript + * store.setMetric('latency', MetricUnit.Milliseconds, 100); + * // Returns: { name: 'latency', unit: 'Milliseconds', value: 100, resolution: 60 } + * + * store.setMetric('latency', MetricUnit.Milliseconds, 150); + * // Returns: { name: 'latency', unit: 'Milliseconds', value: [100, 150], resolution: 60 } + * ``` + * + * @param name - The metric name + * @param unit - The metric unit (must match existing metric if present) + * @param value - The metric value to add + * @param resolution - The metric resolution (defaults to Standard) + * @returns The stored metric with updated values + * @throws Error if unit doesn't match existing metric + */ + public setMetric( + name: string, + unit: MetricUnit, + value: number, + resolution: MetricResolution = MetricResolutions.Standard + ): StoredMetric { + const storage = this.#getStorage(); + const existingMetric = storage[name]; + + if (existingMetric === undefined) { + const newMetric: StoredMetric = { + name, + unit, + value, + resolution, + }; + storage[name] = newMetric; + return { ...newMetric }; + } + + if (existingMetric.unit !== unit) { + const currentUnit = existingMetric.unit; + throw new Error( + `Metric "${name}" has already been added with unit "${currentUnit}", but we received unit "${unit}". Did you mean to use metric unit "${currentUnit}"?` + ); + } + + if (!Array.isArray(existingMetric.value)) { + existingMetric.value = [existingMetric.value]; + } + existingMetric.value.push(value); + return { ...existingMetric, value: [...existingMetric.value] }; + } + + public getMetricNames(): string[] { + return Object.keys(this.#getStorage()); + } + + public getAllMetrics(): StoredMetric[] { + return Object.values(this.#getStorage()); + } + + public clearMetrics(): void { + if (InvokeStore.getContext() === undefined) { + this.#fallbackStorage = {}; + this.#fallbackTimestamp = undefined; + return; + } + + InvokeStore.set(this.#storedMetricsKey, {}); + InvokeStore.set(this.#timestampKey, undefined); + } + + public hasMetrics(): boolean { + return this.getMetricNames().length > 0; + } + + public getMetricsCount(): number { + return this.getMetricNames().length; + } + + public getTimestamp(): number | undefined { + if (InvokeStore.getContext() === undefined) { + return this.#fallbackTimestamp; + } + + return InvokeStore.get(this.#timestampKey) as number | undefined; + } + + public setTimestamp(timestamp: number | Date): number { + const timestampMs = this.#convertTimestampToEmfFormat(timestamp); + + if (InvokeStore.getContext() === undefined) { + this.#fallbackTimestamp = timestampMs; + return timestampMs; + } + + InvokeStore.set(this.#timestampKey, timestampMs); + return timestampMs; + } + + #convertTimestampToEmfFormat(timestamp: number | Date): number { + if (isIntegerNumber(timestamp)) { + return timestamp; + } + if (timestamp instanceof Date) { + return timestamp.getTime(); + } + return 0; + } +} + +export { MetricsStore }; diff --git a/packages/metrics/tests/unit/concurrency/dimensionsStore.test.ts b/packages/metrics/tests/unit/concurrency/dimensionsStore.test.ts new file mode 100644 index 0000000000..f1433e7f5c --- /dev/null +++ b/packages/metrics/tests/unit/concurrency/dimensionsStore.test.ts @@ -0,0 +1,156 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { DimensionsStore } from '../../../src/DimensionsStore.js'; +import { sequence } from '../helpers.js'; + +describe('DimensionsStore concurrent invocation isolation', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it.each([ + { + description: 'without InvokeStore', + useInvokeStore: false, + expectedResult1: { env: 'dev' }, + expectedResult2: { env: 'dev' }, + }, + { + description: 'with InvokeStore', + useInvokeStore: true, + expectedResult1: { env: 'prod' }, + expectedResult2: { env: 'dev' }, + }, + ])( + 'handles storing dimensions $description', + async ({ useInvokeStore, expectedResult1, expectedResult2 }) => { + // Prepare + const store = new DimensionsStore(); + + // Act + const [result1, result2] = await sequence( + { + sideEffects: [() => store.addDimension('env', 'prod')], + return: () => store.getDimensions(), + }, + { + sideEffects: [() => store.addDimension('env', 'dev')], + return: () => store.getDimensions(), + }, + { useInvokeStore } + ); + + // Assess + expect(result1).toEqual(expectedResult1); + expect(result2).toEqual(expectedResult2); + } + ); + + it.each([ + { + description: 'without InvokeStore', + useInvokeStore: false, + expectedResult1: [ + { service: 'api', version: '1.0' }, + { service: 'web', version: '2.0' }, + ], + expectedResult2: [ + { service: 'api', version: '1.0' }, + { service: 'web', version: '2.0' }, + ], + }, + { + description: 'with InvokeStore', + useInvokeStore: true, + expectedResult1: [{ service: 'api', version: '1.0' }], + expectedResult2: [{ service: 'web', version: '2.0' }], + }, + ])( + 'handles storing dimension sets $description', + async ({ useInvokeStore, expectedResult1, expectedResult2 }) => { + // Prepare + const store = new DimensionsStore(); + + // Act + const [result1, result2] = await sequence( + { + sideEffects: [ + () => store.addDimensionSet({ service: 'api', version: '1.0' }), + ], + return: () => store.getDimensionSets(), + }, + { + sideEffects: [ + () => store.addDimensionSet({ service: 'web', version: '2.0' }), + ], + return: () => store.getDimensionSets(), + }, + { useInvokeStore } + ); + + // Assess + expect(result1).toEqual(expectedResult1); + expect(result2).toEqual(expectedResult2); + } + ); + + it.each([ + { + description: 'without InvokeStore', + useInvokeStore: false, + expectedResult1: { dims: {}, sets: [] }, + expectedResult2: { dims: {}, sets: [] }, + }, + { + description: 'with InvokeStore', + useInvokeStore: true, + expectedResult1: { dims: {}, sets: [] }, + expectedResult2: { + dims: { region: 'us-east-1' }, + sets: [{ version: '2.0' }], + }, + }, + ])( + 'handles clearing the store $description', + async ({ useInvokeStore, expectedResult1, expectedResult2 }) => { + // Prepare + const store = new DimensionsStore(); + + // Act + const [result1, result2] = await sequence( + { + sideEffects: [ + () => { + store.addDimension('env', 'prod'); + store.addDimensionSet({ service: 'api' }); + }, + () => {}, // Wait for inv2 to add + () => store.clearRequestDimensions(), + ], + return: () => ({ + dims: store.getDimensions(), + sets: store.getDimensionSets(), + }), + }, + { + sideEffects: [ + () => {}, // Wait for inv1 to add + () => { + store.addDimension('region', 'us-east-1'); + store.addDimensionSet({ version: '2.0' }); + }, + () => {}, // Wait for clear + ], + return: () => ({ + dims: store.getDimensions(), + sets: store.getDimensionSets(), + }), + }, + { useInvokeStore } + ); + + // Assess + expect(result1).toEqual(expectedResult1); + expect(result2).toEqual(expectedResult2); + } + ); +}); diff --git a/packages/metrics/tests/unit/concurrency/metadataStore.test.ts b/packages/metrics/tests/unit/concurrency/metadataStore.test.ts new file mode 100644 index 0000000000..8e31e45510 --- /dev/null +++ b/packages/metrics/tests/unit/concurrency/metadataStore.test.ts @@ -0,0 +1,193 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { MetadataStore } from '../../../src/MetadataStore.js'; +import { sequence } from '../helpers.js'; + +describe('MetadataStore concurrent invocation isolation', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it.each([ + { + description: 'without InvokeStore', + useInvokeStore: false, + expectedResult1: { env: 'dev' }, + expectedResult2: { env: 'dev' }, + }, + { + description: 'with InvokeStore', + useInvokeStore: true, + expectedResult1: { env: 'prod' }, + expectedResult2: { env: 'dev' }, + }, + ])( + 'handles storing metadata $description', + async ({ useInvokeStore, expectedResult1, expectedResult2 }) => { + // Prepare + const store = new MetadataStore(); + + // Act + const [result1, result2] = await sequence( + { + sideEffects: [() => store.set('env', 'prod')], + return: () => store.getAll(), + }, + { + sideEffects: [() => store.set('env', 'dev')], + return: () => store.getAll(), + }, + { useInvokeStore } + ); + + // Assess + expect(result1).toEqual(expectedResult1); + expect(result2).toEqual(expectedResult2); + } + ); + + it.each([ + { + description: 'without InvokeStore', + useInvokeStore: false, + expectedResult1: { service: 'web', version: '1.0', region: 'us-east-1' }, + expectedResult2: { service: 'web', version: '1.0', region: 'us-east-1' }, + }, + { + description: 'with InvokeStore', + useInvokeStore: true, + expectedResult1: { service: 'api', version: '1.0' }, + expectedResult2: { service: 'web', region: 'us-east-1' }, + }, + ])( + 'handles storing multiple metadata keys $description', + async ({ useInvokeStore, expectedResult1, expectedResult2 }) => { + // Prepare + const store = new MetadataStore(); + + // Act + const [result1, result2] = await sequence( + { + sideEffects: [ + () => { + store.set('service', 'api'); + store.set('version', '1.0'); + }, + ], + return: () => store.getAll(), + }, + { + sideEffects: [ + () => { + store.set('service', 'web'); + store.set('region', 'us-east-1'); + }, + ], + return: () => store.getAll(), + }, + { useInvokeStore } + ); + + // Assess + expect(result1).toEqual(expectedResult1); + expect(result2).toEqual(expectedResult2); + } + ); + + it.each([ + { + description: 'without InvokeStore', + useInvokeStore: false, + expectedResult1: {}, + expectedResult2: {}, + }, + { + description: 'with InvokeStore', + useInvokeStore: true, + expectedResult1: {}, + expectedResult2: { region: 'us-east-1', env: 'prod' }, + }, + ])( + 'handles clearing the store $description', + async ({ useInvokeStore, expectedResult1, expectedResult2 }) => { + // Prepare + const store = new MetadataStore(); + + // Act + const [result1, result2] = await sequence( + { + sideEffects: [ + () => { + store.set('service', 'api'); + store.set('version', '1.0'); + }, + () => {}, // Wait for inv2 to add + () => store.clear(), + ], + return: () => store.getAll(), + }, + { + sideEffects: [ + () => {}, // Wait for inv1 to add + () => { + store.set('region', 'us-east-1'); + store.set('env', 'prod'); + }, + () => {}, // Wait for clear + ], + return: () => store.getAll(), + }, + { useInvokeStore } + ); + + // Assess + expect(result1).toEqual(expectedResult1); + expect(result2).toEqual(expectedResult2); + } + ); + + it.each([ + { + description: 'without InvokeStore', + useInvokeStore: false, + expectedResult1: { key: 'value3' }, + expectedResult2: { key: 'value3' }, + }, + { + description: 'with InvokeStore', + useInvokeStore: true, + expectedResult1: { key: 'value3' }, + expectedResult2: { key: 'value2' }, + }, + ])( + 'handles overwriting same key $description', + async ({ useInvokeStore, expectedResult1, expectedResult2 }) => { + // Prepare + const store = new MetadataStore(); + + // Act + const [result1, result2] = await sequence( + { + sideEffects: [ + () => store.set('key', 'value1'), + () => {}, // Wait for inv2 + () => store.set('key', 'value3'), + ], + return: () => store.getAll(), + }, + { + sideEffects: [ + () => {}, // Wait for inv1 + () => store.set('key', 'value2'), + () => {}, // Wait for inv1's final write + ], + return: () => store.getAll(), + }, + { useInvokeStore } + ); + + // Assess + expect(result1).toEqual(expectedResult1); + expect(result2).toEqual(expectedResult2); + } + ); +}); diff --git a/packages/metrics/tests/unit/concurrency/metrics.test.ts b/packages/metrics/tests/unit/concurrency/metrics.test.ts new file mode 100644 index 0000000000..950a3550a2 --- /dev/null +++ b/packages/metrics/tests/unit/concurrency/metrics.test.ts @@ -0,0 +1,134 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { Metrics, MetricUnit } from '../../../src/index.js'; +import { sequence } from '../helpers.js'; + +describe('Metrics concurrent invocation isolation', () => { + beforeEach(() => { + vi.stubEnv('POWERTOOLS_DEV', 'true'); + vi.stubEnv('POWERTOOLS_METRICS_DISABLED', 'false'); + vi.clearAllMocks(); + }); + + it.each([ + { + description: 'without InvokeStore', + useInvokeStore: false, + expectedCallCount: 1, + expectedOutputs: [ + { + env: 'dev', + key: 'value2', + count: [1, 2], + }, + ], + }, + { + description: 'with InvokeStore', + useInvokeStore: true, + expectedCallCount: 2, + expectedOutputs: [ + { env: 'prod', key: 'value1', count: 1 }, + { env: 'dev', key: 'value2', count: 2 }, + ], + }, + ])( + 'handles metrics, metadata, and dimensions $description', + async ({ useInvokeStore, expectedCallCount, expectedOutputs }) => { + const metrics = new Metrics({ singleMetric: false }); + + await sequence( + { + sideEffects: [ + () => { + metrics.addDimension('env', 'prod'); + metrics.addMetric('count', MetricUnit.Count, 1); + metrics.addMetadata('key', 'value1'); + }, + ], + return: () => metrics.publishStoredMetrics(), + }, + { + sideEffects: [ + () => { + metrics.addDimension('env', 'dev'); + metrics.addMetric('count', MetricUnit.Count, 2); + metrics.addMetadata('key', 'value2'); + }, + ], + return: () => metrics.publishStoredMetrics(), + }, + { useInvokeStore } + ); + + expect(console.log).toHaveBeenCalledTimes(expectedCallCount); + for (const expectedOutput of expectedOutputs) { + expect(console.log).toHaveEmittedEMFWith( + expect.objectContaining(expectedOutput) + ); + } + } + ); + + it.each([ + { + description: 'without InvokeStore', + useInvokeStore: false, + expectedCallCount: 1, + expectedOutputs: [ + { + _aws: expect.objectContaining({ Timestamp: 2000 }), + count: [1, 2], + }, + ], + }, + { + description: 'with InvokeStore', + useInvokeStore: true, + expectedCallCount: 2, + expectedOutputs: [ + { _aws: expect.objectContaining({ Timestamp: 1000 }), count: 1 }, + { _aws: expect.objectContaining({ Timestamp: 2000 }), count: 2 }, + ], + }, + ])( + 'handles timestamps $description', + async ({ useInvokeStore, expectedCallCount, expectedOutputs }) => { + const metrics = new Metrics({ singleMetric: false }); + const timestamp1 = 1000; + const timestamp2 = 2000; + + await sequence( + { + sideEffects: [ + () => { + metrics.setTimestamp(timestamp1); + metrics.addMetric('count', MetricUnit.Count, 1); + }, + () => {}, + () => metrics.publishStoredMetrics(), + ], + return: () => {}, + }, + { + sideEffects: [ + () => {}, + () => { + metrics.setTimestamp(timestamp2); + metrics.addMetric('count', MetricUnit.Count, 2); + }, + () => metrics.publishStoredMetrics(), + ], + return: () => {}, + }, + { useInvokeStore } + ); + + expect(console.log).toHaveBeenCalledTimes(expectedCallCount); + for (const expectedOutput of expectedOutputs) { + expect(console.log).toHaveEmittedEMFWith( + expect.objectContaining(expectedOutput) + ); + } + } + ); +}); diff --git a/packages/metrics/tests/unit/concurrency/metricsStore.test.ts b/packages/metrics/tests/unit/concurrency/metricsStore.test.ts new file mode 100644 index 0000000000..75e83e7254 --- /dev/null +++ b/packages/metrics/tests/unit/concurrency/metricsStore.test.ts @@ -0,0 +1,319 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { MetricUnit } from '../../../src/index.js'; +import { MetricsStore } from '../../../src/MetricsStore.js'; +import type { StoredMetric } from '../../../src/types/index.js'; +import { sequence } from '../helpers.js'; + +describe('MetricsStore concurrent invocation isolation', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it.each([ + { + description: 'without InvokeStore', + useInvokeStore: false, + expectedResult1: { + name: 'count', + unit: MetricUnit.Count, + value: [1, 2], + resolution: 60, + }, + expectedResult2: { + name: 'count', + unit: MetricUnit.Count, + value: [1, 2], + resolution: 60, + }, + }, + { + description: 'with InvokeStore', + useInvokeStore: true, + expectedResult1: { + name: 'count', + unit: MetricUnit.Count, + value: 1, + resolution: 60, + }, + expectedResult2: { + name: 'count', + unit: MetricUnit.Count, + value: 2, + resolution: 60, + }, + }, + ])( + 'getMetric() $description', + async ({ useInvokeStore, expectedResult1, expectedResult2 }) => { + // Prepare + const store = new MetricsStore(); + + // Act + const [result1, result2] = await sequence( + { + sideEffects: [ + () => store.setMetric('count', MetricUnit.Count, 1, 60), + ], + return: () => store.getMetric('count'), + }, + { + sideEffects: [ + () => store.setMetric('count', MetricUnit.Count, 2, 60), + ], + return: () => store.getMetric('count'), + }, + { useInvokeStore } + ); + + // Assess + expect(result1).toEqual(expectedResult1); + expect(result2).toEqual(expectedResult2); + } + ); + + const countMetric: StoredMetric = { + name: 'count', + unit: MetricUnit.Count, + value: 1, + resolution: 60, + }; + const latencyMetric: StoredMetric = { + name: 'latency', + unit: MetricUnit.Milliseconds, + value: 100, + resolution: 60, + }; + const errorMetric: StoredMetric = { + name: 'errors', + unit: MetricUnit.Count, + value: 1, + resolution: 60, + }; + + it.each([ + { + description: 'without InvokeStore', + useInvokeStore: false, + expectedResult1: [countMetric, latencyMetric, errorMetric], + expectedResult2: [countMetric, latencyMetric, errorMetric], + }, + { + description: 'with InvokeStore', + useInvokeStore: true, + expectedResult1: [countMetric, latencyMetric], + expectedResult2: [errorMetric], + }, + ])( + 'getAllMetrics() $description', + async ({ useInvokeStore, expectedResult1, expectedResult2 }) => { + // Prepare + const store = new MetricsStore(); + + // Act + const [result1, result2] = await sequence( + { + sideEffects: [ + () => { + store.setMetric('count', MetricUnit.Count, 1, 60); + store.setMetric('latency', MetricUnit.Milliseconds, 100, 60); + }, + ], + return: () => store.getAllMetrics(), + }, + { + sideEffects: [ + () => { + store.setMetric('errors', MetricUnit.Count, 1, 60); + }, + ], + return: () => store.getAllMetrics(), + }, + { useInvokeStore } + ); + + // Assess + expect(result1).toEqual(expectedResult1); + expect(result2).toEqual(expectedResult2); + } + ); + + it.each([ + { + description: 'without InvokeStore', + useInvokeStore: false, + expectedResult1: 2000, + expectedResult2: 2000, + }, + { + description: 'with InvokeStore', + useInvokeStore: true, + expectedResult1: 1000, + expectedResult2: 2000, + }, + ])( + 'timestamp $description', + async ({ useInvokeStore, expectedResult1, expectedResult2 }) => { + // Prepare + const store = new MetricsStore(); + const timestamp1 = 1000; + const timestamp2 = 2000; + + // Act + const [result1, result2] = await sequence( + { + sideEffects: [() => store.setTimestamp(timestamp1)], + return: () => store.getTimestamp(), + }, + { + sideEffects: [() => store.setTimestamp(timestamp2)], + return: () => store.getTimestamp(), + }, + { useInvokeStore } + ); + + // Assess + expect(result1).toBe(expectedResult1); + expect(result2).toBe(expectedResult2); + } + ); + + it.each([ + { + description: 'without InvokeStore', + useInvokeStore: false, + expectedResult1: { metrics: [], timestamp: undefined }, + expectedResult2: { metrics: [], timestamp: undefined }, + }, + { + description: 'with InvokeStore', + useInvokeStore: true, + expectedResult1: { metrics: [], timestamp: undefined }, + expectedResult2: { metrics: [errorMetric], timestamp: 2000 }, + }, + ])( + 'clearMetrics() $description', + async ({ useInvokeStore, expectedResult1, expectedResult2 }) => { + // Prepare + const store = new MetricsStore(); + + // Act + const [result1, result2] = await sequence( + { + sideEffects: [ + () => { + store.setMetric('count', MetricUnit.Count, 1, 60); + store.setTimestamp(1000); + }, + () => {}, // Wait for inv2 to add + () => store.clearMetrics(), + ], + return: () => ({ + metrics: store.getAllMetrics(), + timestamp: store.getTimestamp(), + }), + }, + { + sideEffects: [ + () => {}, // Wait for inv1 to add + () => { + store.setMetric('errors', MetricUnit.Count, 1, 60); + store.setTimestamp(2000); + }, + () => {}, // Wait for clear + ], + return: () => ({ + metrics: store.getAllMetrics(), + timestamp: store.getTimestamp(), + }), + }, + { useInvokeStore } + ); + + // Assess + expect(result1).toEqual(expectedResult1); + expect(result2).toEqual(expectedResult2); + } + ); + + it.each([ + { + description: 'without InvokeStore', + useInvokeStore: false, + expectedResult1: true, + expectedResult2: true, + }, + { + description: 'with InvokeStore', + useInvokeStore: true, + expectedResult1: true, + expectedResult2: false, + }, + ])( + 'hasMetrics() $description', + async ({ useInvokeStore, expectedResult1, expectedResult2 }) => { + // Prepare + const store = new MetricsStore(); + + // Act + const [result1, result2] = await sequence( + { + sideEffects: [ + () => store.setMetric('count', MetricUnit.Count, 1, 60), + ], + return: () => store.hasMetrics(), + }, + { + sideEffects: [() => {}], // No-op + return: () => store.hasMetrics(), + }, + { useInvokeStore } + ); + + // Assess + expect(result1).toBe(expectedResult1); + expect(result2).toBe(expectedResult2); + } + ); + + it.each([ + { + description: 'without InvokeStore', + useInvokeStore: false, + expectedResult1: 2, + expectedResult2: 2, + }, + { + description: 'with InvokeStore', + useInvokeStore: true, + expectedResult1: 1, + expectedResult2: 1, + }, + ])( + 'getMetricsCount() $description', + async ({ useInvokeStore, expectedResult1, expectedResult2 }) => { + // Prepare + const store = new MetricsStore(); + + // Act + const [result1, result2] = await sequence( + { + sideEffects: [ + () => store.setMetric('count', MetricUnit.Count, 1, 60), + ], + return: () => store.getMetricsCount(), + }, + { + sideEffects: [ + () => store.setMetric('errors', MetricUnit.Count, 1, 60), + ], + return: () => store.getMetricsCount(), + }, + { useInvokeStore } + ); + + // Assess + expect(result1).toBe(expectedResult1); + expect(result2).toBe(expectedResult2); + } + ); +}); diff --git a/packages/metrics/tests/unit/helpers.ts b/packages/metrics/tests/unit/helpers.ts new file mode 100644 index 0000000000..87eb7973c6 --- /dev/null +++ b/packages/metrics/tests/unit/helpers.ts @@ -0,0 +1,134 @@ +import { InvokeStore } from '@aws/lambda-invoke-store'; + +type Invocation = { + sideEffects: (() => void)[]; + return: () => unknown; +}; + +/** + * Creates a Promise with externally accessible resolve and reject functions. + * + * This is a polyfill for the proposed Promise.withResolvers() method that provides + * a more convenient way to create promises that can be resolved or rejected from + * outside the Promise constructor. + * + * We need this polyfill because this function is not available in Node 20. When we drop + * support for this version of Node, then we should remove this function and use the + * inbuilt `Promise.withResolvers` static methods. + * + * @returns Object containing the promise and its resolve/reject functions + * + * @example + * ```typescript + * const { promise, resolve, reject } = withResolvers(); + * + * // Later, from somewhere else: + * resolve('success'); + * + * // Or: + * reject(new Error('failed')); + * ``` + */ +const withResolvers = () => { + let resolve: (value: T) => void = () => {}; + let reject: (reason?: unknown) => void = () => {}; + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + return { promise, resolve, reject }; +}; + +/** + * Executes two invocations concurrently with synchronized side effects to test isolation behavior. + * + * This function ensures that side effects are executed in a specific order across both + * invocations using barrier synchronization. Each step waits for the corresponding step + * in the other invocation to complete before proceeding to the next step. + * + * @param inv1 - First invocation configuration + * @param inv1.sideEffects - Array of functions to execute sequentially, synchronized with inv2 + * @param inv1.return - Function to call after all side effects, returns the test result + * @param inv2 - Second invocation configuration + * @param inv2.sideEffects - Array of functions to execute sequentially, synchronized with inv1 + * @param inv2.return - Function to call after all side effects, returns the test result + * @param options - Execution options + * @param options.useInvokeStore - Whether to run invocations in separate InvokeStore contexts + * - `true`: Each invocation runs in its own InvokeStore.run() context (isolated) + * - `false`: Both invocations run in shared context (no isolation) + * + * @returns Promise that resolves to tuple of [inv1Result, inv2Result] + * + * @example + * ```typescript + * // Basic 2-step sequencing: inv1 acts, then inv2 acts + * const [result1, result2] = await sequence({ + * sideEffects: [() => doSomething('A')], + * return: () => getResult() + * }, { + * sideEffects: [() => doSomething('B')], + * return: () => getResult() + * }, { useInvokeStore: true }); + * + * // Execution order: inv1 doSomething('A') → inv2 doSomething('B') → both return + * ``` + * + * @example + * ```typescript + * // Complex 3-step sequencing with barriers + * const [result1, result2] = await sequence({ + * sideEffects: [ + * () => action1(), // Step 1: inv1 acts first + * () => {}, // Step 2: inv1 waits for inv2 + * () => action3() // Step 3: inv1 acts after inv2 + * ], + * return: () => getResult() + * }, { + * sideEffects: [ + * () => {}, // Step 1: inv2 waits for inv1 + * () => action2(), // Step 2: inv2 acts after inv1 + * () => {} // Step 3: inv2 waits for inv1 + * ], + * return: () => getResult() + * }, { useInvokeStore: false }); + * + * // Execution order: action1() → action2() → action3() → both return + * ``` + */ +function sequence( + inv1: Invocation, + inv2: Invocation, + options: { useInvokeStore?: boolean } +) { + const executionEnv = options?.useInvokeStore + ? (f: () => unknown) => InvokeStore.run({}, f) + : (f: () => unknown) => f(); + + const inv1Barriers = inv1.sideEffects.map(() => withResolvers()); + const inv2Barriers = inv2.sideEffects.map(() => withResolvers()); + + const invocation1 = executionEnv(async () => { + for (let i = 0; i < inv1Barriers.length; i++) { + const sideEffect = inv1.sideEffects[i] ?? (() => {}); + sideEffect(); + inv1Barriers[i].resolve(); + await inv2Barriers[i].promise; + } + return inv1.return(); + }); + + const invocation2 = executionEnv(async () => { + for (let i = 0; i < inv2Barriers.length; i++) { + await inv1Barriers[i].promise; + const sideEffect = inv2.sideEffects[i] ?? (() => {}); + sideEffect(); + inv2Barriers[i].resolve(); + } + return inv2.return(); + }); + + return Promise.all([invocation1, invocation2]); +} + +export { withResolvers, sequence }; +export type { Invocation };