diff --git a/packages/parser/src/envelopes/apigw.ts b/packages/parser/src/envelopes/apigw.ts index ee4d71e9c0..064fe8477c 100644 --- a/packages/parser/src/envelopes/apigw.ts +++ b/packages/parser/src/envelopes/apigw.ts @@ -2,6 +2,7 @@ import { Envelope } from './envelope.js'; import { z, type ZodSchema } from 'zod'; import { APIGatewayProxyEventSchema } from '../schemas/apigw.js'; import type { ParsedResult } from '../types/parser.js'; +import { ParseError } from '../errors.js'; /** * API Gateway envelope to extract data within body key @@ -21,7 +22,11 @@ export class ApiGatewayEnvelope extends Envelope { const parsedEnvelope = APIGatewayProxyEventSchema.safeParse(data); if (!parsedEnvelope.success) { return { - ...parsedEnvelope, + success: false, + error: new ParseError( + 'Failed to parse ApiGatewayEnvelope', + parsedEnvelope.error + ), originalEvent: data, }; } @@ -30,7 +35,11 @@ export class ApiGatewayEnvelope extends Envelope { if (!parsedBody.success) { return { - ...parsedBody, + success: false, + error: new ParseError( + 'Failed to parse ApiGatewayEnvelope body', + parsedBody.error + ), originalEvent: data, }; } diff --git a/packages/parser/src/envelopes/apigwv2.ts b/packages/parser/src/envelopes/apigwv2.ts index 3da86e26e4..d4abbc4738 100644 --- a/packages/parser/src/envelopes/apigwv2.ts +++ b/packages/parser/src/envelopes/apigwv2.ts @@ -2,6 +2,7 @@ import { z, type ZodSchema } from 'zod'; import { APIGatewayProxyEventV2Schema } from '../schemas/apigwv2.js'; import { Envelope } from './envelope.js'; import type { ParsedResult } from '../types/index.js'; +import { ParseError } from '../errors.js'; /** * API Gateway V2 envelope to extract data within body key @@ -21,7 +22,11 @@ export class ApiGatewayV2Envelope extends Envelope { const parsedEnvelope = APIGatewayProxyEventV2Schema.safeParse(data); if (!parsedEnvelope.success) { return { - ...parsedEnvelope, + success: false, + error: new ParseError( + 'Failed to parse API Gateway V2 envelope', + parsedEnvelope.error + ), originalEvent: data, }; } @@ -30,7 +35,11 @@ export class ApiGatewayV2Envelope extends Envelope { if (!parsedBody.success) { return { - ...parsedBody, + success: false, + error: new ParseError( + 'Failed to parse API Gateway V2 envelope body', + parsedBody.error + ), originalEvent: data, }; } diff --git a/packages/parser/src/envelopes/cloudwatch.ts b/packages/parser/src/envelopes/cloudwatch.ts index f90e6455f9..4778d9b508 100644 --- a/packages/parser/src/envelopes/cloudwatch.ts +++ b/packages/parser/src/envelopes/cloudwatch.ts @@ -2,6 +2,7 @@ import { z, type ZodSchema } from 'zod'; import { Envelope } from './envelope.js'; import { CloudWatchLogsSchema } from '../schemas/index.js'; import type { ParsedResult } from '../types/index.js'; +import { ParseError } from '../errors.js'; /** * CloudWatch Envelope to extract a List of log records. @@ -33,7 +34,10 @@ export class CloudWatchEnvelope extends Envelope { if (!parsedEnvelope.success) { return { success: false, - error: parsedEnvelope.error, + error: new ParseError( + 'Failed to parse CloudWatch envelope', + parsedEnvelope.error + ), originalEvent: data, }; } @@ -44,7 +48,10 @@ export class CloudWatchEnvelope extends Envelope { if (!parsedMessage.success) { return { success: false, - error: parsedMessage.error, + error: new ParseError( + 'Failed to parse CloudWatch log event', + parsedMessage.error + ), originalEvent: data, }; } else { diff --git a/packages/parser/src/envelopes/dynamodb.ts b/packages/parser/src/envelopes/dynamodb.ts index 4898369422..59bf83a850 100644 --- a/packages/parser/src/envelopes/dynamodb.ts +++ b/packages/parser/src/envelopes/dynamodb.ts @@ -2,6 +2,7 @@ import { z, type ZodSchema } from 'zod'; import { DynamoDBStreamSchema } from '../schemas/index.js'; import type { ParsedResult, ParsedResultError } from '../types/index.js'; import { Envelope } from './envelope.js'; +import { ParseError } from '../errors.js'; type DynamoDBStreamEnvelopeResponse = { NewImage: z.infer; @@ -38,7 +39,10 @@ export class DynamoDBStreamEnvelope extends Envelope { if (!parsedEnvelope.success) { return { success: false, - error: parsedEnvelope.error, + error: new ParseError( + 'Failed to parse DynamoDB Stream envelope', + parsedEnvelope.error + ), originalEvent: data, }; } @@ -51,8 +55,11 @@ export class DynamoDBStreamEnvelope extends Envelope { return { success: false, error: !parsedNewImage.success - ? parsedNewImage.error - : (parsedOldImage as ParsedResultError).error, + ? new ParseError('Failed to parse NewImage', parsedNewImage.error) + : new ParseError( + 'Failed to parse OldImage', + (parsedOldImage as ParsedResultError).error + ), originalEvent: data, }; } else { diff --git a/packages/parser/src/envelopes/envelope.ts b/packages/parser/src/envelopes/envelope.ts index ed55758153..9e0ae3a8cf 100644 --- a/packages/parser/src/envelopes/envelope.ts +++ b/packages/parser/src/envelopes/envelope.ts @@ -1,5 +1,6 @@ import { z, type ZodSchema } from 'zod'; import type { ParsedResult } from '../types/parser.js'; +import { ParseError } from '../errors.js'; export class Envelope { /** @@ -14,14 +15,20 @@ export class Envelope { data: unknown, schema: T ): z.infer => { - if (typeof data === 'string') { - return schema.parse(JSON.parse(data)); - } else if (typeof data === 'object') { - return schema.parse(data); - } else - throw new Error( + if (typeof data !== 'object' && typeof data !== 'string') { + throw new ParseError( `Invalid data type for envelope. Expected string or object, got ${typeof data}` ); + } + try { + if (typeof data === 'string') { + return schema.parse(JSON.parse(data)); + } else if (typeof data === 'object') { + return schema.parse(data); + } + } catch (e) { + throw new ParseError(`Failed to parse envelope`, e as Error); + } }; /** @@ -38,7 +45,7 @@ export class Envelope { if (typeof input !== 'object' && typeof input !== 'string') { return { success: false, - error: new Error( + error: new ParseError( `Invalid data type for envelope. Expected string or object, got ${typeof input}` ), originalEvent: input, @@ -56,13 +63,13 @@ export class Envelope { } : { success: false, - error: parsed.error, + error: new ParseError(`Failed to parse envelope`, parsed.error), originalEvent: input, }; } catch (e) { return { success: false, - error: e as Error, + error: new ParseError(`Failed to parse envelope`, e as Error), originalEvent: input, }; } diff --git a/packages/parser/src/envelopes/event-bridge.ts b/packages/parser/src/envelopes/event-bridge.ts index 0d166d673b..1659dd93ed 100644 --- a/packages/parser/src/envelopes/event-bridge.ts +++ b/packages/parser/src/envelopes/event-bridge.ts @@ -2,6 +2,7 @@ import { Envelope } from './envelope.js'; import { z, type ZodSchema } from 'zod'; import { EventBridgeSchema } from '../schemas/index.js'; import type { ParsedResult } from '../types/index.js'; +import { ParseError } from '../errors.js'; /** * Envelope for EventBridge schema that extracts and parses data from the `detail` key. @@ -22,7 +23,11 @@ export class EventBridgeEnvelope extends Envelope { if (!parsedEnvelope.success) { return { - ...parsedEnvelope, + success: false, + error: new ParseError( + 'Failed to parse EventBridge envelope', + parsedEnvelope.error + ), originalEvent: data, }; } @@ -31,7 +36,11 @@ export class EventBridgeEnvelope extends Envelope { if (!parsedDetail.success) { return { - ...parsedDetail, + success: false, + error: new ParseError( + 'Failed to parse EventBridge envelope detail', + parsedDetail.error + ), originalEvent: data, }; } diff --git a/packages/parser/src/envelopes/kafka.ts b/packages/parser/src/envelopes/kafka.ts index 1bbd442f3f..8c8e481a07 100644 --- a/packages/parser/src/envelopes/kafka.ts +++ b/packages/parser/src/envelopes/kafka.ts @@ -5,6 +5,7 @@ import { KafkaSelfManagedEventSchema, } from '../schemas/kafka.js'; import { ParsedResult, KafkaMskEvent } from '../types/index.js'; +import { ParseError } from '../errors.js'; /** * Kafka event envelope to extract data within body key @@ -51,7 +52,11 @@ export class KafkaEnvelope extends Envelope { if (!parsedEnvelope.success) { return { - ...parsedEnvelope, + success: false, + error: new ParseError( + 'Failed to parse Kafka envelope', + parsedEnvelope.error + ), originalEvent: data, }; } @@ -63,7 +68,10 @@ export class KafkaEnvelope extends Envelope { if (!parsedRecord.success) { return { success: false, - error: parsedRecord.error, + error: new ParseError( + 'Failed to parse Kafka record', + parsedRecord.error + ), originalEvent: data, }; } diff --git a/packages/parser/src/envelopes/kinesis-firehose.ts b/packages/parser/src/envelopes/kinesis-firehose.ts index 7dca3cae73..71535894c3 100644 --- a/packages/parser/src/envelopes/kinesis-firehose.ts +++ b/packages/parser/src/envelopes/kinesis-firehose.ts @@ -2,6 +2,7 @@ import { z, type ZodSchema } from 'zod'; import { Envelope } from './envelope.js'; import { KinesisFirehoseSchema } from '../schemas/index.js'; import type { ParsedResult } from '../types/index.js'; +import { ParseError } from '../errors.js'; /** * Kinesis Firehose Envelope to extract array of Records @@ -35,7 +36,11 @@ export class KinesisFirehoseEnvelope extends Envelope { if (!parsedEnvelope.success) { return { - ...parsedEnvelope, + success: false, + error: new ParseError( + 'Failed to parse Kinesis Firehose envelope', + parsedEnvelope.error + ), originalEvent: data, }; } @@ -46,7 +51,10 @@ export class KinesisFirehoseEnvelope extends Envelope { if (!parsedData.success) { return { success: false, - error: parsedData.error, + error: new ParseError( + 'Failed to parse Kinesis Firehose record', + parsedData.error + ), originalEvent: data, }; } diff --git a/packages/parser/src/envelopes/kinesis.ts b/packages/parser/src/envelopes/kinesis.ts index 470df40522..8ddfb3d34e 100644 --- a/packages/parser/src/envelopes/kinesis.ts +++ b/packages/parser/src/envelopes/kinesis.ts @@ -2,6 +2,7 @@ import { Envelope } from './envelope.js'; import { z, type ZodSchema } from 'zod'; import { KinesisDataStreamSchema } from '../schemas/kinesis.js'; import type { ParsedResult } from '../types/index.js'; +import { ParseError } from '../errors.js'; /** * Kinesis Data Stream Envelope to extract array of Records @@ -32,7 +33,11 @@ export class KinesisEnvelope extends Envelope { const parsedEnvelope = KinesisDataStreamSchema.safeParse(data); if (!parsedEnvelope.success) { return { - ...parsedEnvelope, + success: false, + error: new ParseError( + 'Failed to parse Kinesis Data Stream envelope', + parsedEnvelope.error + ), originalEvent: data, }; } @@ -43,7 +48,11 @@ export class KinesisEnvelope extends Envelope { const parsedRecord = super.safeParse(record.kinesis.data, schema); if (!parsedRecord.success) { return { - ...parsedRecord, + success: false, + error: new ParseError( + 'Failed to parse Kinesis Data Stream record', + parsedRecord.error + ), originalEvent: data, }; } diff --git a/packages/parser/src/envelopes/lambda.ts b/packages/parser/src/envelopes/lambda.ts index a839c68287..9d694cc517 100644 --- a/packages/parser/src/envelopes/lambda.ts +++ b/packages/parser/src/envelopes/lambda.ts @@ -2,6 +2,7 @@ import { Envelope } from './envelope.js'; import { z, type ZodSchema } from 'zod'; import { LambdaFunctionUrlSchema } from '../schemas/index.js'; import type { ParsedResult } from '../types/index.js'; +import { ParseError } from '../errors.js'; /** * Lambda function URL envelope to extract data within body key @@ -28,7 +29,8 @@ export class LambdaFunctionUrlEnvelope extends Envelope { if (!parsedEnvelope.success) { return { - ...parsedEnvelope, + success: false, + error: new ParseError('Failed to parse Lambda function URL envelope'), originalEvent: data, }; } @@ -36,7 +38,11 @@ export class LambdaFunctionUrlEnvelope extends Envelope { const parsedBody = super.safeParse(parsedEnvelope.data.body, schema); if (!parsedBody.success) { return { - ...parsedBody, + success: false, + error: new ParseError( + 'Failed to parse Lambda function URL body', + parsedBody.error + ), originalEvent: data, }; } diff --git a/packages/parser/src/envelopes/sns.ts b/packages/parser/src/envelopes/sns.ts index 1141dff305..50083d7ca7 100644 --- a/packages/parser/src/envelopes/sns.ts +++ b/packages/parser/src/envelopes/sns.ts @@ -3,6 +3,7 @@ import { Envelope } from './envelope.js'; import { SnsSchema, SnsSqsNotificationSchema } from '../schemas/sns.js'; import { SqsSchema } from '../schemas/sqs.js'; import type { ParsedResult } from '../types/index.js'; +import { ParseError } from '../errors.js'; /** * SNS Envelope to extract array of Records @@ -33,7 +34,11 @@ export class SnsEnvelope extends Envelope { if (!parsedEnvelope.success) { return { - ...parsedEnvelope, + success: false, + error: new ParseError( + `Failed to parse SNS envelope`, + parsedEnvelope.error + ), originalEvent: data, }; } @@ -43,7 +48,11 @@ export class SnsEnvelope extends Envelope { const parsedMessage = super.safeParse(record.Sns.Message, schema); if (!parsedMessage.success) { return { - ...parsedMessage, + success: false, + error: new ParseError( + `Failed to parse SNS message`, + parsedMessage.error + ), originalEvent: data, }; } @@ -91,7 +100,11 @@ export class SnsSqsEnvelope extends Envelope { const parsedEnvelope = SqsSchema.safeParse(data); if (!parsedEnvelope.success) { return { - ...parsedEnvelope, + success: false, + error: new ParseError( + `Failed to parse SQS envelope`, + parsedEnvelope.error + ), originalEvent: data, }; } @@ -106,7 +119,11 @@ export class SnsSqsEnvelope extends Envelope { ); if (!snsNotification.success) { return { - ...snsNotification, + success: false, + error: new ParseError( + `Failed to parse SNS notification`, + snsNotification.error + ), originalEvent: data, }; } @@ -116,7 +133,11 @@ export class SnsSqsEnvelope extends Envelope { ); if (!parsedMessage.success) { return { - ...parsedMessage, + success: false, + error: new ParseError( + `Failed to parse SNS message`, + parsedMessage.error + ), originalEvent: data, }; } diff --git a/packages/parser/src/envelopes/sqs.ts b/packages/parser/src/envelopes/sqs.ts index b1c8f6c059..e5350365d4 100644 --- a/packages/parser/src/envelopes/sqs.ts +++ b/packages/parser/src/envelopes/sqs.ts @@ -2,6 +2,7 @@ import { z, type ZodSchema } from 'zod'; import { SqsSchema } from '../schemas/sqs.js'; import { Envelope } from './envelope.js'; import type { ParsedResult } from '../types/index.js'; +import { ParseError } from '../errors.js'; /** * SQS Envelope to extract array of Records @@ -31,7 +32,11 @@ export class SqsEnvelope extends Envelope { const parsedEnvelope = SqsSchema.safeParse(data); if (!parsedEnvelope.success) { return { - ...parsedEnvelope, + success: false, + error: new ParseError( + 'Failed to parse Sqs Envelope', + parsedEnvelope.error + ), originalEvent: data, }; } @@ -41,7 +46,11 @@ export class SqsEnvelope extends Envelope { const parsedRecord = super.safeParse(record.body, schema); if (!parsedRecord.success) { return { - ...parsedRecord, + success: false, + error: new ParseError( + 'Failed to parse Sqs Record', + parsedRecord.error + ), originalEvent: data, }; } diff --git a/packages/parser/src/envelopes/vpc-lattice.ts b/packages/parser/src/envelopes/vpc-lattice.ts index a7150dd5a4..1f157eac3d 100644 --- a/packages/parser/src/envelopes/vpc-lattice.ts +++ b/packages/parser/src/envelopes/vpc-lattice.ts @@ -2,6 +2,7 @@ import { z, type ZodSchema } from 'zod'; import { Envelope } from './envelope.js'; import { VpcLatticeSchema } from '../schemas/index.js'; import type { ParsedResult } from '../types/index.js'; +import { ParseError } from '../errors.js'; /** * Amazon VPC Lattice envelope to extract data within body key @@ -24,7 +25,11 @@ export class VpcLatticeEnvelope extends Envelope { const parsedEnvelope = VpcLatticeSchema.safeParse(data); if (!parsedEnvelope.success) { return { - ...parsedEnvelope, + success: false, + error: new ParseError( + 'Failed to parse VpcLattice envelope', + parsedEnvelope.error + ), originalEvent: data, }; } @@ -33,7 +38,11 @@ export class VpcLatticeEnvelope extends Envelope { if (!parsedBody.success) { return { - ...parsedBody, + success: false, + error: new ParseError( + 'Failed to parse VpcLattice envelope body', + parsedBody.error + ), originalEvent: data, }; } diff --git a/packages/parser/src/envelopes/vpc-latticev2.ts b/packages/parser/src/envelopes/vpc-latticev2.ts index 7ef31b0702..50a1b058f3 100644 --- a/packages/parser/src/envelopes/vpc-latticev2.ts +++ b/packages/parser/src/envelopes/vpc-latticev2.ts @@ -2,6 +2,7 @@ import { Envelope } from './envelope.js'; import { z, type ZodSchema } from 'zod'; import { VpcLatticeV2Schema } from '../schemas/index.js'; import type { ParsedResult } from '../types/index.js'; +import { ParseError } from '../errors.js'; /** * Amazon VPC Lattice envelope to extract data within body key @@ -23,7 +24,11 @@ export class VpcLatticeV2Envelope extends Envelope { const parsedEnvelope = VpcLatticeV2Schema.safeParse(data); if (!parsedEnvelope.success) { return { - ...parsedEnvelope, + success: false, + error: new ParseError( + 'Failed to parse VpcLatticeV2 envelope.', + parsedEnvelope.error + ), originalEvent: data, }; } @@ -32,7 +37,11 @@ export class VpcLatticeV2Envelope extends Envelope { if (!parsedBody.success) { return { - ...parsedBody, + success: false, + error: new ParseError( + 'Failed to parse VpcLatticeV2 body.', + parsedBody.error + ), originalEvent: data, }; } diff --git a/packages/parser/src/errors.ts b/packages/parser/src/errors.ts new file mode 100644 index 0000000000..8e03bce5e9 --- /dev/null +++ b/packages/parser/src/errors.ts @@ -0,0 +1,25 @@ +/** + * Error thrown when a parsing error occurs. The cause of the error is included in the message, if possible. + */ +class ParseError extends Error { + /** + * we use the `cause` property, which is present in ES2022 or newer, to store the cause of the error. + * because we have to support Node 16.x, we need to add this property ourselves. + * We can remove this once we drop support for Node 16.x. + * see: https://github.com/aws-powertools/powertools-lambda-typescript/issues/2223 + * + * @see https://nodejs.org/api/errors.html#errors_error_cause + */ + public readonly cause: Error | undefined; + + public constructor(message: string, cause?: Error) { + const errorMessage = cause + ? `${message}. This error was caused by: ${cause.message}.` + : message; + super(errorMessage); + this.cause = cause; + this.name = 'ParseError'; + } +} + +export { ParseError }; diff --git a/packages/parser/src/index.ts b/packages/parser/src/index.ts index 940216fe90..e181735190 100644 --- a/packages/parser/src/index.ts +++ b/packages/parser/src/index.ts @@ -1 +1,2 @@ export { parser } from './parserDecorator.js'; +export { ParseError } from './errors.js'; diff --git a/packages/parser/src/parser.ts b/packages/parser/src/parser.ts index 89ed2e4ffb..b7537de77a 100644 --- a/packages/parser/src/parser.ts +++ b/packages/parser/src/parser.ts @@ -1,5 +1,6 @@ import type { ParsedResult, Envelope } from './types/index.js'; import { z, type ZodSchema } from 'zod'; +import { ParseError } from './errors.js'; /** * Parse the data using the provided schema, envelope and safeParse flag @@ -41,8 +42,11 @@ const parse = ( if (safeParse) { return safeParseSchema(data, schema); } - - return schema.parse(data); + try { + return schema.parse(data); + } catch (e) { + throw new ParseError('Failed to parse schema', e as Error); + } }; /** @@ -60,7 +64,11 @@ const safeParseSchema = ( return result.success ? result - : { success: false, error: result.error, originalEvent: data }; + : { + success: false, + error: new ParseError('Failed to parse schema safely', result.error), + originalEvent: data, + }; }; export { parse }; diff --git a/packages/parser/tests/unit/envelope.test.ts b/packages/parser/tests/unit/envelope.test.ts index 1f92ed6e64..8d7778bc25 100644 --- a/packages/parser/tests/unit/envelope.test.ts +++ b/packages/parser/tests/unit/envelope.test.ts @@ -1,5 +1,6 @@ -import { z, ZodError } from 'zod'; +import { z } from 'zod'; import { Envelope } from '../../src/envelopes/envelope.js'; +import { ParseError } from '../../src/errors.js'; describe('envelope: ', () => { describe('parseSafe', () => { @@ -30,25 +31,19 @@ describe('envelope: ', () => { ); expect(result).toEqual({ success: false, - error: expect.any(ZodError), + error: expect.any(ParseError), originalEvent: { name: 123 }, }); }); it('returns error when input is invalid JSON string', () => { - let err: unknown; - try { - JSON.parse('{name: "John"}'); - } catch (e) { - err = e; - } const result = Envelope.safeParse( '{name: "John"}', z.object({ name: z.string() }) ); expect(result).toEqual({ success: false, - error: err, + error: expect.any(ParseError), originalEvent: '{name: "John"}', }); }); diff --git a/packages/parser/tests/unit/envelopes/apigwt.test.ts b/packages/parser/tests/unit/envelopes/apigwt.test.ts index c9df0c03c7..0a1e675ae4 100644 --- a/packages/parser/tests/unit/envelopes/apigwt.test.ts +++ b/packages/parser/tests/unit/envelopes/apigwt.test.ts @@ -8,7 +8,7 @@ import { generateMock } from '@anatine/zod-mock'; import { TestEvents, TestSchema } from '../schema/utils.js'; import { APIGatewayProxyEvent } from '../../../src/types/'; import { ApiGatewayEnvelope } from '../../../src/envelopes/index.js'; -import { ZodError } from 'zod'; +import { ParseError } from '../../../src/errors.js'; describe('ApigwEnvelope ', () => { describe('parse', () => { @@ -26,13 +26,17 @@ describe('ApigwEnvelope ', () => { const testEvent = TestEvents.apiGatewayProxyEvent as APIGatewayProxyEvent; testEvent.body = undefined; - expect(() => ApiGatewayEnvelope.parse(testEvent, TestSchema)).toThrow(); + expect(() => ApiGatewayEnvelope.parse(testEvent, TestSchema)).toThrow( + ParseError + ); }); it('should throw invalid event provided', () => { const testEvent = TestEvents.apiGatewayProxyEvent as APIGatewayProxyEvent; testEvent.body = 'invalid'; - expect(() => ApiGatewayEnvelope.parse(testEvent, TestSchema)).toThrow(); + expect(() => ApiGatewayEnvelope.parse(testEvent, TestSchema)).toThrow( + ParseError + ); }); }); @@ -69,7 +73,7 @@ describe('ApigwEnvelope ', () => { const resp = ApiGatewayEnvelope.safeParse(testEvent, TestSchema); expect(resp).toEqual({ success: false, - error: expect.any(SyntaxError), + error: expect.any(ParseError), originalEvent: testEvent, }); }); @@ -80,7 +84,7 @@ describe('ApigwEnvelope ', () => { ); expect(resp).toEqual({ success: false, - error: expect.any(ZodError), + error: expect.any(ParseError), originalEvent: 'invalid', }); }); diff --git a/packages/parser/tests/unit/envelopes/cloudwatch.test.ts b/packages/parser/tests/unit/envelopes/cloudwatch.test.ts index adfe6e52f9..6eec52fd9a 100644 --- a/packages/parser/tests/unit/envelopes/cloudwatch.test.ts +++ b/packages/parser/tests/unit/envelopes/cloudwatch.test.ts @@ -12,7 +12,7 @@ import { } from '../../../src/schemas/'; import { TestSchema } from '../schema/utils.js'; import { CloudWatchEnvelope } from '../../../src/envelopes/index.js'; -import { ZodError } from 'zod'; +import { ParseError } from '../../../src'; describe('CloudWatch', () => { describe('parse', () => { @@ -123,7 +123,7 @@ describe('CloudWatch', () => { it('should return success false when envelope does not match', () => { expect(CloudWatchEnvelope.safeParse({ foo: 'bar' }, TestSchema)).toEqual({ success: false, - error: expect.any(ZodError), + error: expect.any(ParseError), originalEvent: { foo: 'bar' }, }); }); diff --git a/packages/parser/tests/unit/envelopes/dynamodb.test.ts b/packages/parser/tests/unit/envelopes/dynamodb.test.ts index 4d2c9fb657..80385eca45 100644 --- a/packages/parser/tests/unit/envelopes/dynamodb.test.ts +++ b/packages/parser/tests/unit/envelopes/dynamodb.test.ts @@ -7,8 +7,9 @@ import { generateMock } from '@anatine/zod-mock'; import { TestEvents } from '../schema/utils.js'; import { DynamoDBStreamEvent } from 'aws-lambda'; -import { z, ZodError } from 'zod'; +import { z } from 'zod'; import { DynamoDBStreamEnvelope } from '../../../src/envelopes/index.js'; +import { ParseError } from '../../../src/errors.js'; describe('DynamoDB', () => { const schema = z.object({ @@ -88,7 +89,7 @@ describe('DynamoDB', () => { const parsed = DynamoDBStreamEnvelope.safeParse(invalidDDBEvent, schema); expect(parsed).toEqual({ success: false, - error: expect.any(ZodError), + error: expect.any(ParseError), originalEvent: invalidDDBEvent, }); }); @@ -111,7 +112,7 @@ describe('DynamoDB', () => { const parsed = DynamoDBStreamEnvelope.safeParse(invalidDDBEvent, schema); expect(parsed).toEqual({ success: false, - error: expect.any(ZodError), + error: expect.any(ParseError), originalEvent: invalidDDBEvent, }); }); @@ -120,7 +121,7 @@ describe('DynamoDB', () => { const parsed = DynamoDBStreamEnvelope.safeParse({ foo: 'bar' }, schema); expect(parsed).toEqual({ success: false, - error: expect.any(ZodError), + error: expect.any(ParseError), originalEvent: { foo: 'bar' }, }); }); diff --git a/packages/parser/tests/unit/envelopes/eventbridge.test.ts b/packages/parser/tests/unit/envelopes/eventbridge.test.ts index 746d95b160..1c57549818 100644 --- a/packages/parser/tests/unit/envelopes/eventbridge.test.ts +++ b/packages/parser/tests/unit/envelopes/eventbridge.test.ts @@ -7,8 +7,8 @@ import { TestEvents, TestSchema } from '../schema/utils.js'; import { generateMock } from '@anatine/zod-mock'; import { EventBridgeEvent } from 'aws-lambda'; -import { ZodError } from 'zod'; import { EventBridgeEnvelope } from '../../../src/envelopes/index.js'; +import { ParseError } from '../../../src/errors.js'; describe('EventBridgeEnvelope ', () => { describe('parse', () => { @@ -89,7 +89,7 @@ describe('EventBridgeEnvelope ', () => { EventBridgeEnvelope.safeParse(eventBridgeEvent, TestSchema) ).toEqual({ success: false, - error: expect.any(ZodError), + error: expect.any(ParseError), originalEvent: eventBridgeEvent, }); }); @@ -114,7 +114,7 @@ describe('EventBridgeEnvelope ', () => { it('should return original event and error envelope is invalid', () => { expect(EventBridgeEnvelope.safeParse(1, TestSchema)).toEqual({ success: false, - error: expect.any(ZodError), + error: expect.any(ParseError), originalEvent: 1, }); }); diff --git a/packages/parser/tests/unit/envelopes/kinesis.test.ts b/packages/parser/tests/unit/envelopes/kinesis.test.ts index f84149c252..b30c0f1e75 100644 --- a/packages/parser/tests/unit/envelopes/kinesis.test.ts +++ b/packages/parser/tests/unit/envelopes/kinesis.test.ts @@ -8,7 +8,7 @@ import { generateMock } from '@anatine/zod-mock'; import { KinesisStreamEvent } from 'aws-lambda'; import { TestEvents, TestSchema } from '../schema/utils.js'; import { KinesisEnvelope } from '../../../src/envelopes/index.js'; -import { ZodError } from 'zod'; +import { ParseError } from '../../../src/errors.js'; describe('KinesisEnvelope', () => { describe('parse', () => { @@ -54,7 +54,7 @@ describe('KinesisEnvelope', () => { const resp = KinesisEnvelope.safeParse(testEvent, TestSchema); expect(resp).toEqual({ success: false, - error: expect.any(ZodError), + error: expect.any(ParseError), originalEvent: testEvent, }); }); @@ -64,7 +64,7 @@ describe('KinesisEnvelope', () => { const resp = KinesisEnvelope.safeParse(testEvent, TestSchema); expect(resp).toEqual({ success: false, - error: expect.any(SyntaxError), + error: expect.any(ParseError), originalEvent: testEvent, }); }); diff --git a/packages/parser/tests/unit/envelopes/sns.test.ts b/packages/parser/tests/unit/envelopes/sns.test.ts index c1e9b67bee..5a6389c9fe 100644 --- a/packages/parser/tests/unit/envelopes/sns.test.ts +++ b/packages/parser/tests/unit/envelopes/sns.test.ts @@ -4,11 +4,12 @@ * @group unit/parser/envelopes */ -import { z, ZodError } from 'zod'; +import { z } from 'zod'; import { generateMock } from '@anatine/zod-mock'; import { SNSEvent, SQSEvent } from 'aws-lambda'; import { TestEvents, TestSchema } from '../schema/utils.js'; import { SnsEnvelope, SnsSqsEnvelope } from '../../../src/envelopes/index.js'; +import { ParseError } from '../../../src/errors.js'; describe('Sns and SQS Envelope', () => { describe('SnsSqsEnvelope parse', () => { @@ -58,7 +59,7 @@ describe('Sns and SQS Envelope', () => { expect(SnsSqsEnvelope.safeParse(snsSqsTestEvent, TestSchema)).toEqual({ success: false, - error: expect.any(ZodError), + error: expect.any(ParseError), originalEvent: snsSqsTestEvent, }); }); @@ -71,7 +72,7 @@ describe('Sns and SQS Envelope', () => { expect(SnsSqsEnvelope.safeParse(snsSqsTestEvent, TestSchema)).toEqual({ success: false, - error: expect.any(ZodError), + error: expect.any(ParseError), originalEvent: snsSqsTestEvent, }); }); @@ -148,7 +149,7 @@ describe('SnsEnvelope', () => { expect(SnsEnvelope.safeParse(testEvent, TestSchema)).toEqual({ success: false, - error: expect.any(ZodError), + error: expect.any(ParseError), originalEvent: testEvent, }); }); diff --git a/packages/parser/tests/unit/envelopes/sqs.test.ts b/packages/parser/tests/unit/envelopes/sqs.test.ts index 4d1ab3a419..778e0baee1 100644 --- a/packages/parser/tests/unit/envelopes/sqs.test.ts +++ b/packages/parser/tests/unit/envelopes/sqs.test.ts @@ -8,7 +8,7 @@ import { generateMock } from '@anatine/zod-mock'; import { TestEvents, TestSchema } from '../schema/utils.js'; import { SQSEvent } from 'aws-lambda'; import { SqsEnvelope } from '../../../src/envelopes/sqs.js'; -import { ZodError } from 'zod'; +import { ParseError } from '../../../src/errors.js'; describe('SqsEnvelope ', () => { describe('parse', () => { @@ -54,7 +54,7 @@ describe('SqsEnvelope ', () => { sqsEvent.Records[0].body = JSON.stringify({ foo: 'bar' }); expect(SqsEnvelope.safeParse(sqsEvent, TestSchema)).toEqual({ success: false, - error: expect.any(ZodError), + error: expect.any(ParseError), originalEvent: sqsEvent, }); }); @@ -62,7 +62,7 @@ describe('SqsEnvelope ', () => { it('should return error if envelope is invalid', () => { expect(SqsEnvelope.safeParse({ foo: 'bar' }, TestSchema)).toEqual({ success: false, - error: expect.any(ZodError), + error: expect.any(ParseError), originalEvent: { foo: 'bar' }, }); }); diff --git a/packages/parser/tests/unit/parser.decorator.test.ts b/packages/parser/tests/unit/parser.decorator.test.ts index 1e05efa510..dcc4dc6756 100644 --- a/packages/parser/tests/unit/parser.decorator.test.ts +++ b/packages/parser/tests/unit/parser.decorator.test.ts @@ -10,9 +10,10 @@ import { parser } from '../../src/index.js'; import { TestSchema, TestEvents } from './schema/utils'; import { generateMock } from '@anatine/zod-mock'; import { EventBridgeSchema } from '../../src/schemas/index.js'; -import { z, ZodError } from 'zod'; +import { z } from 'zod'; import { ParsedResult, EventBridgeEvent } from '../../src/types'; import { EventBridgeEnvelope } from '../../src/envelopes/index.js'; +import { ParseError } from '../../src/errors.js'; describe('Parser Decorator', () => { const customEventBridgeSchema = EventBridgeSchema.extend({ @@ -160,7 +161,7 @@ describe('Parser Decorator', () => { // @ts-ignore await lambda.handlerWithSchemaAndSafeParse({ foo: 'bar' }, {} as Context) ).toEqual({ - error: expect.any(ZodError), + error: expect.any(ParseError), success: false, originalEvent: { foo: 'bar' }, }); @@ -193,7 +194,7 @@ describe('Parser Decorator', () => { {} as Context ) ).toEqual({ - error: expect.any(ZodError), + error: expect.any(ParseError), success: false, originalEvent: { foo: 'bar' }, });