1- import type { z , ZodType } from 'zod' ;
1+ import { ZodType , ZodTypeAny } from 'zod' ;
22
3- import { EventType } from '@castore/core' ;
3+ import { EventDetail , EventType , EventDetailParser } from '@castore/core' ;
4+
5+ const zodPayloadParser =
6+ < PAYLOAD > ( payloadSchema : ZodType < PAYLOAD > ) =>
7+ ( eventDetail : EventDetail ) => {
8+ const parsedPayload = payloadSchema . safeParse ( eventDetail . payload ) ;
9+
10+ if ( parsedPayload . success ) {
11+ return {
12+ isValid : true ,
13+ parsedCandidate : {
14+ ...eventDetail ,
15+ payload : parsedPayload . data ,
16+ } ,
17+ } ;
18+ }
19+
20+ return {
21+ isValid : false ,
22+ parsingErrors : parsedPayload . error . errors . map (
23+ ( { message } ) => new Error ( message ) ,
24+ ) ,
25+ } ;
26+ } ;
27+
28+ const zodMetadataParser =
29+ < METADATA > ( metadataSchema : ZodType < METADATA > ) =>
30+ ( eventDetail : EventDetail ) => {
31+ const parsedMetadata = metadataSchema . safeParse ( eventDetail . metadata ) ;
32+
33+ if ( parsedMetadata . success ) {
34+ return {
35+ isValid : true ,
36+ parsedCandidate : {
37+ ...eventDetail ,
38+ metadata : parsedMetadata . data ,
39+ } ,
40+ } ;
41+ }
42+
43+ return {
44+ isValid : false ,
45+ parsingErrors : parsedMetadata . error . errors . map (
46+ ( { message } ) => new Error ( message ) ,
47+ ) ,
48+ } ;
49+ } ;
50+
51+ /* eslint-disable complexity */
52+ const zodEventDetailParser = < TYPE extends string , PAYLOAD , METADATA > (
53+ payloadSchema : ZodType < PAYLOAD > | undefined ,
54+ metadataSchema : ZodType < METADATA > | undefined ,
55+ ) : EventDetailParser < TYPE , PAYLOAD , METADATA > | undefined => {
56+ if ( payloadSchema === undefined && metadataSchema === undefined ) {
57+ return undefined ;
58+ }
59+
60+ if ( metadataSchema === undefined && payloadSchema !== undefined ) {
61+ return zodPayloadParser ( payloadSchema ) as EventDetailParser <
62+ TYPE ,
63+ PAYLOAD ,
64+ METADATA
65+ > ;
66+ }
67+
68+ if ( metadataSchema !== undefined && payloadSchema === undefined ) {
69+ return zodMetadataParser ( metadataSchema ) as EventDetailParser <
70+ TYPE ,
71+ PAYLOAD ,
72+ METADATA
73+ > ;
74+ }
75+
76+ if ( payloadSchema !== undefined && metadataSchema !== undefined ) {
77+ const parser = ( eventDetail : EventDetail ) => {
78+ const parsedPayload = payloadSchema . safeParse ( eventDetail . payload ) ;
79+ const parsedMetadata = metadataSchema . safeParse ( eventDetail . metadata ) ;
80+
81+ if ( parsedPayload . success && parsedMetadata . success ) {
82+ return {
83+ isValid : true ,
84+ parsedCandidate : {
85+ ...eventDetail ,
86+ payload : parsedPayload . data ,
87+ metadata : parsedMetadata . data ,
88+ } ,
89+ } ;
90+ }
91+
92+ const payloadErrors = parsedPayload . success
93+ ? [ ]
94+ : parsedPayload . error . errors . map ( ( { message } ) => new Error ( message ) ) ;
95+ const metadataErrors = parsedMetadata . success
96+ ? [ ]
97+ : parsedMetadata . error . errors . map ( ( { message } ) => new Error ( message ) ) ;
98+
99+ return {
100+ isValid : false ,
101+ parsingErrors : [ ...payloadErrors , ...metadataErrors ] ,
102+ } ;
103+ } ;
104+
105+ return parser as EventDetailParser < TYPE , PAYLOAD , METADATA > ;
106+ }
107+
108+ return undefined ;
109+ } ;
4110
5111export class ZodEventType <
6112 TYPE extends string = string ,
7- PAYLOAD_SCHEMA extends ZodType | undefined = ZodType | undefined ,
8- PAYLOAD = ZodType extends PAYLOAD_SCHEMA
9- ? string extends TYPE
10- ? unknown
11- : never
12- : PAYLOAD_SCHEMA extends ZodType
13- ? z . infer < PAYLOAD_SCHEMA >
113+ PAYLOAD_SCHEMA extends ZodType | undefined = string extends TYPE
114+ ? ZodTypeAny | undefined
14115 : never ,
15- METADATA_SCHEMA extends ZodType | undefined = ZodType | undefined ,
16- METADATA = ZodType extends METADATA_SCHEMA
17- ? string extends TYPE
18- ? unknown
19- : never
20- : METADATA_SCHEMA extends ZodType
21- ? z . infer < METADATA_SCHEMA >
116+ METADATA_SCHEMA extends ZodType | undefined = string extends TYPE
117+ ? ZodTypeAny | undefined
22118 : never ,
23- > extends EventType < TYPE , PAYLOAD , METADATA > {
119+ PAYLOAD = string extends TYPE
120+ ? never
121+ : PAYLOAD_SCHEMA extends ZodType
122+ ? Zod . infer < PAYLOAD_SCHEMA >
123+ : unknown ,
124+ METADATA = string extends TYPE
125+ ? never
126+ : METADATA_SCHEMA extends ZodType
127+ ? Zod . infer < METADATA_SCHEMA >
128+ : unknown ,
129+ > implements EventType < TYPE , PAYLOAD , METADATA >
130+ {
131+ _types ?: {
132+ detail : EventDetail < TYPE , PAYLOAD , METADATA > ;
133+ } ;
134+ type : TYPE ;
24135 payloadSchema ?: PAYLOAD_SCHEMA ;
25136 metadataSchema ?: METADATA_SCHEMA ;
137+ parseEventDetail ?: EventDetailParser < TYPE , PAYLOAD , METADATA > | undefined ;
26138
27139 constructor ( {
28140 type,
@@ -33,8 +145,12 @@ export class ZodEventType<
33145 payloadSchema ?: PAYLOAD_SCHEMA ;
34146 metadataSchema ?: METADATA_SCHEMA ;
35147 } ) {
36- super ( { type } ) ;
148+ this . type = type ;
37149 this . payloadSchema = payloadSchema ;
38150 this . metadataSchema = metadataSchema ;
151+ this . parseEventDetail = zodEventDetailParser < TYPE , PAYLOAD , METADATA > (
152+ payloadSchema ,
153+ metadataSchema ,
154+ ) ;
39155 }
40156}
0 commit comments