Data validation and parsing for Standard Schema and Zod schemas with built-in support for popular AWS Lambda event sources
npx @tessl/cli install tessl/npm-aws-lambda-powertools--parser@2.29.0Data validation and parsing for AWS Lambda using Standard Schema libraries (Zod, Valibot). Validates events with built-in schemas for 20+ AWS sources and envelopes for automatic payload extraction.
npm install @aws-lambda-powertools/parser zodimport { parse, parser } from '@aws-lambda-powertools/parser';
import { parser as parserMiddleware } from '@aws-lambda-powertools/parser/middleware';
import { EventBridgeSchema, SqsSchema } from '@aws-lambda-powertools/parser/schemas';
import { EventBridgeEnvelope, SqsEnvelope } from '@aws-lambda-powertools/parser/envelopes';
import { JSONStringified, Base64Encoded } from '@aws-lambda-powertools/parser/helpers';
import { ParseError } from '@aws-lambda-powertools/parser/errors';import { parser } from '@aws-lambda-powertools/parser';
import { EventBridgeEnvelope } from '@aws-lambda-powertools/parser/envelopes';
import { z } from 'zod';
const orderSchema = z.object({
id: z.number().positive(),
items: z.array(z.object({ id: z.number(), quantity: z.number() })),
});
class Lambda {
@parser({ schema: orderSchema, envelope: EventBridgeEnvelope })
async handler(event: z.infer<typeof orderSchema>, _context: Context) {
// event is validated and typed
event.items.forEach(item => console.log(item));
}
}
export const handler = new Lambda().handler.bind(new Lambda());import { parser } from '@aws-lambda-powertools/parser/middleware';
import { SqsEnvelope } from '@aws-lambda-powertools/parser/envelopes';
import middy from '@middy/core';
import { z } from 'zod';
const schema = z.object({ id: z.number(), description: z.string() });
export const handler = middy()
.use(parser({ schema, envelope: SqsEnvelope }))
.handler(async (event) => {
// event is Array<typeof schema>
event.forEach(order => console.log(order.id));
});import { parse } from '@aws-lambda-powertools/parser';
import { EventBridgeEnvelope } from '@aws-lambda-powertools/parser/envelopes';
import { z } from 'zod';
const schema = z.object({ id: z.number() });
export const handler = async (event: unknown) => {
// Throws on error
const data = parse(event, EventBridgeEnvelope, schema);
// Safe parse returns ParsedResult
const result = parse(event, EventBridgeEnvelope, schema, true);
if (result.success) {
console.log(result.data);
} else {
console.error(result.error.message);
}
};parse<T>(data: unknown, envelope: Envelope, schema: T, safeParse?: boolean)@parser({ schema, envelope?, safeParse? })parser({ schema, envelope?, safeParse? })Built-in Schemas - 97+ schemas for AWS event sources
API Gateway: APIGatewayProxyEventSchema, APIGatewayProxyEventV2Schema, APIGatewayProxyWebsocketEventSchema, APIGatewayRequestAuthorizerEventSchema, APIGatewayTokenAuthorizerEventSchema, APIGatewayRequestAuthorizerEventV2Schema
AppSync: AppSyncResolverSchema, AppSyncBatchResolverSchema, AppSyncEventsPublishSchema, AppSyncEventsSubscribeSchema
CloudFormation: CloudFormationCustomResourceCreateSchema, CloudFormationCustomResourceUpdateSchema, CloudFormationCustomResourceDeleteSchema
CloudWatch: CloudWatchLogsSchema
Cognito: CreateAuthChallengeTriggerSchema, CustomEmailSenderTriggerSchema, CustomMessageTriggerSchema, DefineAuthChallengeTriggerSchema, PreSignupTriggerSchema, PostAuthenticationTriggerSchema, PreTokenGenerationTriggerSchemaV1, VerifyAuthChallengeTriggerSchema
DynamoDB: DynamoDBStreamSchema, DynamoDBStreamRecord
EventBridge: EventBridgeSchema
Kafka: KafkaMskEventSchema, KafkaSelfManagedEventSchema
Kinesis: KinesisDataStreamSchema, KinesisFirehoseSchema, KinesisDynamoDBStreamSchema
S3: S3Schema, S3EventNotificationEventBridgeSchema, S3ObjectLambdaEventSchema, S3SqsEventNotificationSchema
SES: SesSchema
SNS: SnsSchema, SnsSqsNotificationSchema
SQS: SqsSchema
Others: AlbSchema, LambdaFunctionUrlSchema, TransferFamilySchema, VpcLatticeSchema, VpcLatticeV2Schema
Envelopes - Extract nested payloads from AWS events
| Envelope | Type | Extracts From | Returns |
|---|---|---|---|
| ApiGatewayEnvelope | Object | event.body | T |
| ApiGatewayV2Envelope | Object | event.body | T |
| CloudWatchEnvelope | Array | event.awslogs.data.logEvents[].message | T[] |
| DynamoDBStreamEnvelope | DynamoDB | event.Records[].dynamodb.{NewImage,OldImage} | {NewImage?: T, OldImage?: T}[] |
| EventBridgeEnvelope | Object | event.detail | T |
| KafkaEnvelope | Array | event.records[topic][].value | T[] |
| KinesisEnvelope | Array | event.Records[].kinesis.data | T[] |
| KinesisFirehoseEnvelope | Array | event.records[].data | T[] |
| LambdaFunctionUrlEnvelope | Object | event.body | T |
| SnsEnvelope | Array | event.Records[].Sns.Message | T[] |
| SnsSqsEnvelope | Array | JSON.parse(event.Records[].body).Message | T[] |
| SqsEnvelope | Array | event.Records[].body | T[] |
| VpcLatticeEnvelope | Object | event.body | T |
| VpcLatticeV2Envelope | Object | event.body | T |
JSONStringified<T>(schema: ZodType<T>): ZodType<T>
Base64Encoded<T>(schema: ZodType<T>): ZodType<T>
DynamoDBMarshalled<T>(schema: ZodType<T>): ZodType<T>Extend schemas to handle JSON strings, Base64 encoding, and DynamoDB marshalling.
class ParseError extends Error {
cause?: unknown;
}
type ParsedResult<Input, Output> =
| { success: true; data: Output }
| { success: false; error: Error; originalEvent?: Input };Use safeParse: true for error handling without exceptions.
type InferOutput<Schema> = Schema['~standard']['types']['output'];
interface ParserOptions<TSchema, TEnvelope, TSafeParse> {
schema: TSchema;
envelope?: TEnvelope;
safeParse?: TSafeParse;
}