1- import type { ZodSchema , z } from 'zod' ;
1+ import type { ZodError , ZodSchema , z } from 'zod' ;
22import { ParseError } from '../errors.js' ;
33import { EventBridgeSchema } from '../schemas/index.js' ;
44import type { ParsedResult } from '../types/index.js' ;
5- import { Envelope , envelopeDiscriminator } from './envelope.js' ;
5+ import { envelopeDiscriminator } from './envelope.js' ;
66
77/**
88 * Envelope for EventBridge schema that extracts and parses data from the `detail` key.
@@ -14,34 +14,41 @@ export const EventBridgeEnvelope = {
1414 */
1515 [ envelopeDiscriminator ] : 'object' as const ,
1616 parse < T extends ZodSchema > ( data : unknown , schema : T ) : z . infer < T > {
17- return Envelope . parse ( EventBridgeSchema . parse ( data ) . detail , schema ) ;
17+ const extendedSchema = EventBridgeSchema . extend ( {
18+ detail : schema ,
19+ } ) ;
20+ try {
21+ const parsed = extendedSchema . parse ( data ) ;
22+ return parsed . detail ;
23+ } catch ( error ) {
24+ throw new ParseError ( 'Failed to parse EventBridge envelope' , {
25+ cause : error as ZodError ,
26+ } ) ;
27+ }
1828 } ,
1929
20- safeParse < T extends ZodSchema > ( data : unknown , schema : T ) : ParsedResult < unknown , z . infer < T > > {
21- const parsedEnvelope = EventBridgeSchema . safeParse ( data ) ;
30+ safeParse < T extends ZodSchema > (
31+ data : unknown ,
32+ schema : T
33+ ) : ParsedResult < unknown , z . infer < T > > {
34+ const extendedSchema = EventBridgeSchema . extend ( {
35+ detail : schema ,
36+ } ) ;
2237
23- if ( ! parsedEnvelope . success ) {
38+ const parsedResult = extendedSchema . safeParse ( data ) ;
39+ if ( ! parsedResult . success ) {
2440 return {
2541 success : false ,
2642 error : new ParseError ( 'Failed to parse EventBridge envelope' , {
27- cause : parsedEnvelope . error ,
28- } ) ,
29- originalEvent : data ,
30- } ;
31- }
32-
33- const parsedDetail = Envelope . safeParse ( parsedEnvelope . data . detail , schema ) ;
34-
35- if ( ! parsedDetail . success ) {
36- return {
37- success : false ,
38- error : new ParseError ( 'Failed to parse EventBridge envelope detail' , {
39- cause : parsedDetail . error ,
43+ cause : parsedResult . error ,
4044 } ) ,
4145 originalEvent : data ,
4246 } ;
4347 }
4448
45- return parsedDetail ;
49+ return {
50+ success : true ,
51+ data : parsedResult . data . detail ,
52+ } ;
4653 } ,
4754} ;
0 commit comments