From 1c0ea6f1e661860dd751d8cb7d9d8a7d2b169d30 Mon Sep 17 00:00:00 2001 From: Brett Delle Grazie Date: Mon, 4 Aug 2025 14:53:02 +0200 Subject: [PATCH] fix(parser): cognito preferredRole may be null For the Cognito Trigger pre-token generation event, handle that the `preferredRole` field may be `null`. Fixes #4250 --- 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);