Skip to content

Bug: Inferred type for DynamoDBStreamRecord (schema) is incorrect #4797

@benthorner

Description

@benthorner

Expected Behavior

The type inferred for DynamoDBStreamRecord (schema) should include e.g. SequenceNumber.

Current Behavior

The inferred type seems to be the lowest common denominator of:

| z.infer<typeof DynamoDBStreamChangeRecordBase>
| z.infer<typeof DynamoDBStreamToKinesisChangeRecord>,

const DynamoDBStreamToKinesisChangeRecord = DynamoDBStreamChangeRecordBase.omit(
{
SequenceNumber: true,
StreamViewType: true,
}
);

Code snippet

import {
  DynamoDBStreamRecord as DynamoDBStreamRecordSchema,
} from '@aws-lambda-powertools/parser/schemas/dynamodb';

type DynamoDBStreamRecord = z.infer<typeof DynamoDBStreamRecordSchema>;

Steps to Reproduce

  1. Write the above code snippet.
  2. Hover over the DynamoDBStreamRecord type to see it does not include e.g. dynamodb.SequenceNumber.

Possible Solution

Define the dynamodb field as a union e.g.

// Make the function generic so we can force particular return types.
const unmarshallDynamoDBTransform = <T extends z.infer<typeof DynamoDBStreamChangeRecordBase> | z.infer<typeof DynamoDBStreamToKinesisChangeRecord>>(
  object: T,
  ctx: z.RefinementCtx
): T => { ... }

// Specialise `DynamoDBStreamChangeRecord` to the full / base type.
const DynamoDBStreamChangeRecord = DynamoDBStreamChangeRecordBase.transform(
  unmarshallDynamoDBTransform<z.infer<typeof DynamoDBStreamChangeRecordBase>>
);

// Add a further type to accommodate the "ToKinesis" version.
const DynamoDBStreamToKinesisChangeRecord = DynamoDBStreamChangeRecordBase.transform(
  unmarshallDynamoDBTransform<z.infer<typeof DynamoDBStreamToKinesisChangeRecord>>
);

// Define `dynamodb field as a union.
const DynamoDBStreamRecord = z.object({
  ...,
  dynamodb: z.union([DynamoDBStreamChangeRecord, DynamoDBStreamToKinesisChangeRecord]),
  ...,
});

Powertools for AWS Lambda (TypeScript) version

latest

AWS Lambda function runtime

22.x

Packaging format used

npm

Execution logs

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingconfirmedThe scope is clear, ready for implementation

Type

No type

Projects

Status

Coming soon

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions