1
- import type { ZodSchema , z } from 'zod' ;
1
+ import type { ZodError , ZodSchema , z } from 'zod' ;
2
2
import { ParseError } from '../errors.js' ;
3
3
import { EventBridgeSchema } from '../schemas/index.js' ;
4
4
import type { ParsedResult } from '../types/index.js' ;
5
- import { Envelope , envelopeDiscriminator } from './envelope.js' ;
5
+ import { envelopeDiscriminator } from './envelope.js' ;
6
6
7
7
/**
8
8
* Envelope for EventBridge schema that extracts and parses data from the `detail` key.
@@ -14,34 +14,41 @@ export const EventBridgeEnvelope = {
14
14
*/
15
15
[ envelopeDiscriminator ] : 'object' as const ,
16
16
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
+ }
18
28
} ,
19
29
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
+ } ) ;
22
37
23
- if ( ! parsedEnvelope . success ) {
38
+ const parsedResult = extendedSchema . safeParse ( data ) ;
39
+ if ( ! parsedResult . success ) {
24
40
return {
25
41
success : false ,
26
42
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 ,
40
44
} ) ,
41
45
originalEvent : data ,
42
46
} ;
43
47
}
44
48
45
- return parsedDetail ;
49
+ return {
50
+ success : true ,
51
+ data : parsedResult . data . detail ,
52
+ } ;
46
53
} ,
47
54
} ;
0 commit comments