@sygnl/event-schema 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,517 @@
1
+ import { z } from 'zod';
2
+
3
+ // src/base.ts
4
+ var BaseEventMetadataSchema = z.object({
5
+ /** Unique event identifier */
6
+ event_id: z.string(),
7
+ /** ISO timestamp when event occurred */
8
+ timestamp: z.number().int().positive(),
9
+ /** Event source */
10
+ source: z.enum(["pixel", "server", "webhook", "api"]),
11
+ /** User's anonymous identifier */
12
+ anonymous_id: z.string().optional(),
13
+ /** User's authenticated identifier */
14
+ user_id: z.string().optional(),
15
+ /** Session identifier */
16
+ session_id: z.string().optional()
17
+ });
18
+ var MoneySchema = z.object({
19
+ /** Amount in the specified currency */
20
+ amount: z.number(),
21
+ /** ISO 4217 currency code */
22
+ currency: z.string().length(3).toUpperCase()
23
+ });
24
+ var ProductSchema = z.object({
25
+ /** Unique product identifier */
26
+ product_id: z.string(),
27
+ /** Product name */
28
+ name: z.string(),
29
+ /** Product SKU */
30
+ sku: z.string().optional(),
31
+ /** Product category */
32
+ category: z.string().optional(),
33
+ /** Product brand */
34
+ brand: z.string().optional(),
35
+ /** Product variant (size, color, etc.) */
36
+ variant: z.string().optional(),
37
+ /** Unit price */
38
+ price: z.number(),
39
+ /** Quantity */
40
+ quantity: z.number().int().positive().default(1),
41
+ /** Currency code */
42
+ currency: z.string().length(3).toUpperCase().default("USD"),
43
+ /** Product image URL */
44
+ image_url: z.string().url().optional(),
45
+ /** Product URL */
46
+ url: z.string().url().optional()
47
+ });
48
+ var CartSchema = z.object({
49
+ /** Cart identifier */
50
+ cart_id: z.string().optional(),
51
+ /** Products in cart */
52
+ products: z.array(ProductSchema).min(1),
53
+ /** Cart total */
54
+ total: MoneySchema,
55
+ /** Subtotal (before tax/shipping) */
56
+ subtotal: MoneySchema.optional(),
57
+ /** Tax amount */
58
+ tax: MoneySchema.optional(),
59
+ /** Shipping amount */
60
+ shipping: MoneySchema.optional(),
61
+ /** Discount amount */
62
+ discount: MoneySchema.optional(),
63
+ /** Coupon code used */
64
+ coupon: z.string().optional()
65
+ });
66
+ var PageContextSchema = z.object({
67
+ /** Current page URL */
68
+ url: z.string().url().optional(),
69
+ /** Page path */
70
+ path: z.string().optional(),
71
+ /** Page title */
72
+ title: z.string().optional(),
73
+ /** Referrer URL */
74
+ referrer: z.string().url().optional(),
75
+ /** Search query (if applicable) */
76
+ search: z.string().optional()
77
+ });
78
+ var UserTraitsSchema = z.object({
79
+ /** Email address */
80
+ email: z.string().email().optional(),
81
+ /** Phone number */
82
+ phone: z.string().optional(),
83
+ /** First name */
84
+ first_name: z.string().optional(),
85
+ /** Last name */
86
+ last_name: z.string().optional(),
87
+ /** Company name */
88
+ company: z.string().optional(),
89
+ /** Job title */
90
+ title: z.string().optional(),
91
+ /** Address city */
92
+ city: z.string().optional(),
93
+ /** Address state/region */
94
+ state: z.string().optional(),
95
+ /** Address country */
96
+ country: z.string().optional(),
97
+ /** Postal code */
98
+ postal_code: z.string().optional(),
99
+ /** Avatar/profile image URL */
100
+ avatar: z.string().url().optional()
101
+ });
102
+ var ProductViewedEventSchema = BaseEventMetadataSchema.extend({
103
+ event_type: z.literal("product_viewed"),
104
+ product: ProductSchema,
105
+ page: PageContextSchema.optional()
106
+ });
107
+ var ProductListViewedEventSchema = BaseEventMetadataSchema.extend({
108
+ event_type: z.literal("product_list_viewed"),
109
+ list_id: z.string().optional(),
110
+ list_name: z.string().optional(),
111
+ category: z.string().optional(),
112
+ products: z.array(ProductSchema),
113
+ page: PageContextSchema.optional()
114
+ });
115
+ var ProductAddedEventSchema = BaseEventMetadataSchema.extend({
116
+ event_type: z.literal("product_added"),
117
+ product: ProductSchema,
118
+ cart: CartSchema.optional()
119
+ });
120
+ var ProductRemovedEventSchema = BaseEventMetadataSchema.extend({
121
+ event_type: z.literal("product_removed"),
122
+ product: ProductSchema,
123
+ cart: CartSchema.optional()
124
+ });
125
+ var CartViewedEventSchema = BaseEventMetadataSchema.extend({
126
+ event_type: z.literal("cart_viewed"),
127
+ cart: CartSchema
128
+ });
129
+ var CheckoutStartedEventSchema = BaseEventMetadataSchema.extend({
130
+ event_type: z.literal("checkout_started"),
131
+ cart: CartSchema,
132
+ checkout_id: z.string().optional()
133
+ });
134
+ var CheckoutStepCompletedEventSchema = BaseEventMetadataSchema.extend({
135
+ event_type: z.literal("checkout_step_completed"),
136
+ checkout_id: z.string(),
137
+ step: z.number().int().positive(),
138
+ step_name: z.string().optional(),
139
+ shipping_method: z.string().optional(),
140
+ payment_method: z.string().optional()
141
+ });
142
+ var PaymentInfoEnteredEventSchema = BaseEventMetadataSchema.extend({
143
+ event_type: z.literal("payment_info_entered"),
144
+ checkout_id: z.string(),
145
+ payment_method: z.string(),
146
+ cart: CartSchema.optional()
147
+ });
148
+ var OrderCompletedEventSchema = BaseEventMetadataSchema.extend({
149
+ event_type: z.literal("order_completed"),
150
+ order_id: z.string(),
151
+ checkout_id: z.string().optional(),
152
+ total: MoneySchema,
153
+ subtotal: MoneySchema.optional(),
154
+ revenue: MoneySchema,
155
+ tax: MoneySchema.optional(),
156
+ shipping: MoneySchema.optional(),
157
+ discount: MoneySchema.optional(),
158
+ coupon: z.string().optional(),
159
+ products: z.array(ProductSchema),
160
+ payment_method: z.string().optional(),
161
+ shipping_method: z.string().optional()
162
+ });
163
+ var OrderUpdatedEventSchema = BaseEventMetadataSchema.extend({
164
+ event_type: z.literal("order_updated"),
165
+ order_id: z.string(),
166
+ total: MoneySchema.optional(),
167
+ status: z.string().optional(),
168
+ products: z.array(ProductSchema).optional()
169
+ });
170
+ var OrderRefundedEventSchema = BaseEventMetadataSchema.extend({
171
+ event_type: z.literal("order_refunded"),
172
+ order_id: z.string(),
173
+ refund_amount: MoneySchema,
174
+ refund_reason: z.string().optional(),
175
+ products: z.array(ProductSchema).optional()
176
+ });
177
+ var OrderCancelledEventSchema = BaseEventMetadataSchema.extend({
178
+ event_type: z.literal("order_cancelled"),
179
+ order_id: z.string(),
180
+ cancel_reason: z.string().optional()
181
+ });
182
+ var EcommerceEventSchema = z.discriminatedUnion("event_type", [
183
+ ProductViewedEventSchema,
184
+ ProductListViewedEventSchema,
185
+ ProductAddedEventSchema,
186
+ ProductRemovedEventSchema,
187
+ CartViewedEventSchema,
188
+ CheckoutStartedEventSchema,
189
+ CheckoutStepCompletedEventSchema,
190
+ PaymentInfoEnteredEventSchema,
191
+ OrderCompletedEventSchema,
192
+ OrderUpdatedEventSchema,
193
+ OrderRefundedEventSchema,
194
+ OrderCancelledEventSchema
195
+ ]);
196
+ var SubscriptionPlanSchema = z.object({
197
+ plan_id: z.string(),
198
+ plan_name: z.string(),
199
+ plan_type: z.enum(["free", "trial", "paid"]).optional(),
200
+ billing_period: z.enum(["monthly", "yearly", "quarterly", "lifetime"]).optional(),
201
+ price: MoneySchema.optional()
202
+ });
203
+ var UserSignedUpEventSchema = BaseEventMetadataSchema.extend({
204
+ event_type: z.literal("user_signed_up"),
205
+ user_traits: UserTraitsSchema.optional(),
206
+ signup_method: z.enum(["email", "google", "github", "sso", "other"]).optional(),
207
+ referral_code: z.string().optional()
208
+ });
209
+ var UserInvitedEventSchema = BaseEventMetadataSchema.extend({
210
+ event_type: z.literal("user_invited"),
211
+ invited_email: z.string().email(),
212
+ inviter_id: z.string(),
213
+ role: z.string().optional(),
214
+ team_id: z.string().optional()
215
+ });
216
+ var UserLoggedInEventSchema = BaseEventMetadataSchema.extend({
217
+ event_type: z.literal("user_logged_in"),
218
+ login_method: z.enum(["email", "google", "github", "sso", "other"]).optional()
219
+ });
220
+ var UserLoggedOutEventSchema = BaseEventMetadataSchema.extend({
221
+ event_type: z.literal("user_logged_out")
222
+ });
223
+ var AccountCreatedEventSchema = BaseEventMetadataSchema.extend({
224
+ event_type: z.literal("account_created"),
225
+ account_id: z.string(),
226
+ account_name: z.string(),
227
+ plan: SubscriptionPlanSchema.optional()
228
+ });
229
+ var AccountDeletedEventSchema = BaseEventMetadataSchema.extend({
230
+ event_type: z.literal("account_deleted"),
231
+ account_id: z.string(),
232
+ delete_reason: z.string().optional()
233
+ });
234
+ var TrialStartedEventSchema = BaseEventMetadataSchema.extend({
235
+ event_type: z.literal("trial_started"),
236
+ plan: SubscriptionPlanSchema,
237
+ trial_days: z.number().int().positive(),
238
+ trial_end_date: z.number().int().positive()
239
+ });
240
+ var TrialConvertedEventSchema = BaseEventMetadataSchema.extend({
241
+ event_type: z.literal("trial_converted"),
242
+ from_plan: SubscriptionPlanSchema,
243
+ to_plan: SubscriptionPlanSchema
244
+ });
245
+ var TrialEndedEventSchema = BaseEventMetadataSchema.extend({
246
+ event_type: z.literal("trial_ended"),
247
+ plan: SubscriptionPlanSchema,
248
+ converted: z.boolean()
249
+ });
250
+ var SubscriptionStartedEventSchema = BaseEventMetadataSchema.extend({
251
+ event_type: z.literal("subscription_started"),
252
+ subscription_id: z.string(),
253
+ plan: SubscriptionPlanSchema,
254
+ billing_period_start: z.number().int().positive(),
255
+ billing_period_end: z.number().int().positive()
256
+ });
257
+ var SubscriptionUpgradedEventSchema = BaseEventMetadataSchema.extend({
258
+ event_type: z.literal("subscription_upgraded"),
259
+ subscription_id: z.string(),
260
+ from_plan: SubscriptionPlanSchema,
261
+ to_plan: SubscriptionPlanSchema,
262
+ prorated_amount: MoneySchema.optional()
263
+ });
264
+ var SubscriptionDowngradedEventSchema = BaseEventMetadataSchema.extend({
265
+ event_type: z.literal("subscription_downgraded"),
266
+ subscription_id: z.string(),
267
+ from_plan: SubscriptionPlanSchema,
268
+ to_plan: SubscriptionPlanSchema,
269
+ effective_date: z.number().int().positive().optional()
270
+ });
271
+ var SubscriptionCancelledEventSchema = BaseEventMetadataSchema.extend({
272
+ event_type: z.literal("subscription_cancelled"),
273
+ subscription_id: z.string(),
274
+ plan: SubscriptionPlanSchema,
275
+ cancel_reason: z.string().optional(),
276
+ cancel_at_period_end: z.boolean().default(true),
277
+ effective_date: z.number().int().positive().optional()
278
+ });
279
+ var SubscriptionRenewedEventSchema = BaseEventMetadataSchema.extend({
280
+ event_type: z.literal("subscription_renewed"),
281
+ subscription_id: z.string(),
282
+ plan: SubscriptionPlanSchema,
283
+ billing_period_start: z.number().int().positive(),
284
+ billing_period_end: z.number().int().positive()
285
+ });
286
+ var SubscriptionPausedEventSchema = BaseEventMetadataSchema.extend({
287
+ event_type: z.literal("subscription_paused"),
288
+ subscription_id: z.string(),
289
+ pause_reason: z.string().optional()
290
+ });
291
+ var SubscriptionResumedEventSchema = BaseEventMetadataSchema.extend({
292
+ event_type: z.literal("subscription_resumed"),
293
+ subscription_id: z.string()
294
+ });
295
+ var PaymentSucceededEventSchema = BaseEventMetadataSchema.extend({
296
+ event_type: z.literal("payment_succeeded"),
297
+ payment_id: z.string(),
298
+ subscription_id: z.string().optional(),
299
+ invoice_id: z.string().optional(),
300
+ amount: MoneySchema,
301
+ payment_method: z.string().optional()
302
+ });
303
+ var PaymentFailedEventSchema = BaseEventMetadataSchema.extend({
304
+ event_type: z.literal("payment_failed"),
305
+ payment_id: z.string().optional(),
306
+ subscription_id: z.string().optional(),
307
+ invoice_id: z.string().optional(),
308
+ amount: MoneySchema,
309
+ failure_reason: z.string().optional(),
310
+ retry_attempt: z.number().int().nonnegative().optional()
311
+ });
312
+ var InvoiceCreatedEventSchema = BaseEventMetadataSchema.extend({
313
+ event_type: z.literal("invoice_created"),
314
+ invoice_id: z.string(),
315
+ subscription_id: z.string().optional(),
316
+ amount: MoneySchema,
317
+ due_date: z.number().int().positive().optional()
318
+ });
319
+ var InvoicePaidEventSchema = BaseEventMetadataSchema.extend({
320
+ event_type: z.literal("invoice_paid"),
321
+ invoice_id: z.string(),
322
+ subscription_id: z.string().optional(),
323
+ amount: MoneySchema,
324
+ paid_at: z.number().int().positive()
325
+ });
326
+ var FeatureUsedEventSchema = BaseEventMetadataSchema.extend({
327
+ event_type: z.literal("feature_used"),
328
+ feature_name: z.string(),
329
+ feature_id: z.string().optional(),
330
+ usage_count: z.number().int().nonnegative().optional(),
331
+ metadata: z.record(z.unknown()).optional()
332
+ });
333
+ var LimitReachedEventSchema = BaseEventMetadataSchema.extend({
334
+ event_type: z.literal("limit_reached"),
335
+ limit_type: z.string(),
336
+ current_usage: z.number(),
337
+ limit_value: z.number(),
338
+ plan: SubscriptionPlanSchema.optional()
339
+ });
340
+ var QuotaExceededEventSchema = BaseEventMetadataSchema.extend({
341
+ event_type: z.literal("quota_exceeded"),
342
+ quota_type: z.string(),
343
+ current_usage: z.number(),
344
+ quota_limit: z.number(),
345
+ plan: SubscriptionPlanSchema.optional()
346
+ });
347
+ var SaasEventSchema = z.discriminatedUnion("event_type", [
348
+ UserSignedUpEventSchema,
349
+ UserInvitedEventSchema,
350
+ UserLoggedInEventSchema,
351
+ UserLoggedOutEventSchema,
352
+ AccountCreatedEventSchema,
353
+ AccountDeletedEventSchema,
354
+ TrialStartedEventSchema,
355
+ TrialConvertedEventSchema,
356
+ TrialEndedEventSchema,
357
+ SubscriptionStartedEventSchema,
358
+ SubscriptionUpgradedEventSchema,
359
+ SubscriptionDowngradedEventSchema,
360
+ SubscriptionCancelledEventSchema,
361
+ SubscriptionRenewedEventSchema,
362
+ SubscriptionPausedEventSchema,
363
+ SubscriptionResumedEventSchema,
364
+ PaymentSucceededEventSchema,
365
+ PaymentFailedEventSchema,
366
+ InvoiceCreatedEventSchema,
367
+ InvoicePaidEventSchema,
368
+ FeatureUsedEventSchema,
369
+ LimitReachedEventSchema,
370
+ QuotaExceededEventSchema
371
+ ]);
372
+ var CustomEventSchema = BaseEventMetadataSchema.extend({
373
+ /** Custom event type (user-defined) */
374
+ event_type: z.string(),
375
+ /** Custom event properties (user-defined) */
376
+ properties: z.record(z.unknown()).optional()
377
+ });
378
+ function createCustomEventSchema(eventType, propertiesSchema) {
379
+ return BaseEventMetadataSchema.extend({
380
+ event_type: z.literal(eventType),
381
+ properties: propertiesSchema
382
+ });
383
+ }
384
+ var CoreEventSchema = z.union([EcommerceEventSchema, SaasEventSchema]);
385
+ var AnyEventSchema = z.union([
386
+ EcommerceEventSchema,
387
+ SaasEventSchema,
388
+ CustomEventSchema
389
+ ]);
390
+ function validateEvent(data) {
391
+ try {
392
+ const parsed = AnyEventSchema.parse(data);
393
+ return {
394
+ success: true,
395
+ data: parsed,
396
+ error: null
397
+ };
398
+ } catch (error) {
399
+ if (error instanceof z.ZodError) {
400
+ return {
401
+ success: false,
402
+ data: null,
403
+ error
404
+ };
405
+ }
406
+ throw error;
407
+ }
408
+ }
409
+ function validateEcommerceEvent(data) {
410
+ try {
411
+ const parsed = EcommerceEventSchema.parse(data);
412
+ return {
413
+ success: true,
414
+ data: parsed,
415
+ error: null
416
+ };
417
+ } catch (error) {
418
+ if (error instanceof z.ZodError) {
419
+ return {
420
+ success: false,
421
+ data: null,
422
+ error
423
+ };
424
+ }
425
+ throw error;
426
+ }
427
+ }
428
+ function validateSaasEvent(data) {
429
+ try {
430
+ const parsed = SaasEventSchema.parse(data);
431
+ return {
432
+ success: true,
433
+ data: parsed,
434
+ error: null
435
+ };
436
+ } catch (error) {
437
+ if (error instanceof z.ZodError) {
438
+ return {
439
+ success: false,
440
+ data: null,
441
+ error
442
+ };
443
+ }
444
+ throw error;
445
+ }
446
+ }
447
+ function validateCustomEvent(data) {
448
+ try {
449
+ const parsed = CustomEventSchema.parse(data);
450
+ return {
451
+ success: true,
452
+ data: parsed,
453
+ error: null
454
+ };
455
+ } catch (error) {
456
+ if (error instanceof z.ZodError) {
457
+ return {
458
+ success: false,
459
+ data: null,
460
+ error
461
+ };
462
+ }
463
+ throw error;
464
+ }
465
+ }
466
+ function isEcommerceEvent(event) {
467
+ const ecommerceTypes = [
468
+ "product_viewed",
469
+ "product_list_viewed",
470
+ "product_added",
471
+ "product_removed",
472
+ "cart_viewed",
473
+ "checkout_started",
474
+ "checkout_step_completed",
475
+ "payment_info_entered",
476
+ "order_completed",
477
+ "order_updated",
478
+ "order_refunded",
479
+ "order_cancelled"
480
+ ];
481
+ return ecommerceTypes.includes(event.event_type);
482
+ }
483
+ function isSaasEvent(event) {
484
+ const saasTypes = [
485
+ "user_signed_up",
486
+ "user_invited",
487
+ "user_logged_in",
488
+ "user_logged_out",
489
+ "account_created",
490
+ "account_deleted",
491
+ "trial_started",
492
+ "trial_converted",
493
+ "trial_ended",
494
+ "subscription_started",
495
+ "subscription_upgraded",
496
+ "subscription_downgraded",
497
+ "subscription_cancelled",
498
+ "subscription_renewed",
499
+ "subscription_paused",
500
+ "subscription_resumed",
501
+ "payment_succeeded",
502
+ "payment_failed",
503
+ "invoice_created",
504
+ "invoice_paid",
505
+ "feature_used",
506
+ "limit_reached",
507
+ "quota_exceeded"
508
+ ];
509
+ return saasTypes.includes(event.event_type);
510
+ }
511
+ function isCustomEvent(event) {
512
+ return !isEcommerceEvent(event) && !isSaasEvent(event);
513
+ }
514
+
515
+ export { AccountCreatedEventSchema, AccountDeletedEventSchema, AnyEventSchema, BaseEventMetadataSchema, CartSchema, CartViewedEventSchema, CheckoutStartedEventSchema, CheckoutStepCompletedEventSchema, CoreEventSchema, CustomEventSchema, EcommerceEventSchema, FeatureUsedEventSchema, InvoiceCreatedEventSchema, InvoicePaidEventSchema, LimitReachedEventSchema, MoneySchema, OrderCancelledEventSchema, OrderCompletedEventSchema, OrderRefundedEventSchema, OrderUpdatedEventSchema, PageContextSchema, PaymentFailedEventSchema, PaymentInfoEnteredEventSchema, PaymentSucceededEventSchema, ProductAddedEventSchema, ProductListViewedEventSchema, ProductRemovedEventSchema, ProductSchema, ProductViewedEventSchema, QuotaExceededEventSchema, SaasEventSchema, SubscriptionCancelledEventSchema, SubscriptionDowngradedEventSchema, SubscriptionPausedEventSchema, SubscriptionPlanSchema, SubscriptionRenewedEventSchema, SubscriptionResumedEventSchema, SubscriptionStartedEventSchema, SubscriptionUpgradedEventSchema, TrialConvertedEventSchema, TrialEndedEventSchema, TrialStartedEventSchema, UserInvitedEventSchema, UserLoggedInEventSchema, UserLoggedOutEventSchema, UserSignedUpEventSchema, UserTraitsSchema, createCustomEventSchema, isCustomEvent, isEcommerceEvent, isSaasEvent, validateCustomEvent, validateEcommerceEvent, validateEvent, validateSaasEvent };
516
+ //# sourceMappingURL=index.js.map
517
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/base.ts","../src/ecommerce.ts","../src/saas.ts","../src/custom.ts","../src/validators.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from 'zod';\n\n/**\n * Base metadata that all events must have\n */\nexport const BaseEventMetadataSchema = z.object({\n /** Unique event identifier */\n event_id: z.string(),\n \n /** ISO timestamp when event occurred */\n timestamp: z.number().int().positive(),\n \n /** Event source */\n source: z.enum(['pixel', 'server', 'webhook', 'api']),\n \n /** User's anonymous identifier */\n anonymous_id: z.string().optional(),\n \n /** User's authenticated identifier */\n user_id: z.string().optional(),\n \n /** Session identifier */\n session_id: z.string().optional(),\n});\n\nexport type BaseEventMetadata = z.infer<typeof BaseEventMetadataSchema>;\n\n/**\n * Monetary value schema\n */\nexport const MoneySchema = z.object({\n /** Amount in the specified currency */\n amount: z.number(),\n \n /** ISO 4217 currency code */\n currency: z.string().length(3).toUpperCase(),\n});\n\nexport type Money = z.infer<typeof MoneySchema>;\n\n/**\n * Product schema (for e-commerce)\n */\nexport const ProductSchema = z.object({\n /** Unique product identifier */\n product_id: z.string(),\n \n /** Product name */\n name: z.string(),\n \n /** Product SKU */\n sku: z.string().optional(),\n \n /** Product category */\n category: z.string().optional(),\n \n /** Product brand */\n brand: z.string().optional(),\n \n /** Product variant (size, color, etc.) */\n variant: z.string().optional(),\n \n /** Unit price */\n price: z.number(),\n \n /** Quantity */\n quantity: z.number().int().positive().default(1),\n \n /** Currency code */\n currency: z.string().length(3).toUpperCase().default('USD'),\n \n /** Product image URL */\n image_url: z.string().url().optional(),\n \n /** Product URL */\n url: z.string().url().optional(),\n});\n\nexport type Product = z.infer<typeof ProductSchema>;\n\n/**\n * Cart schema\n */\nexport const CartSchema = z.object({\n /** Cart identifier */\n cart_id: z.string().optional(),\n \n /** Products in cart */\n products: z.array(ProductSchema).min(1),\n \n /** Cart total */\n total: MoneySchema,\n \n /** Subtotal (before tax/shipping) */\n subtotal: MoneySchema.optional(),\n \n /** Tax amount */\n tax: MoneySchema.optional(),\n \n /** Shipping amount */\n shipping: MoneySchema.optional(),\n \n /** Discount amount */\n discount: MoneySchema.optional(),\n \n /** Coupon code used */\n coupon: z.string().optional(),\n});\n\nexport type Cart = z.infer<typeof CartSchema>;\n\n/**\n * Page context schema\n */\nexport const PageContextSchema = z.object({\n /** Current page URL */\n url: z.string().url().optional(),\n \n /** Page path */\n path: z.string().optional(),\n \n /** Page title */\n title: z.string().optional(),\n \n /** Referrer URL */\n referrer: z.string().url().optional(),\n \n /** Search query (if applicable) */\n search: z.string().optional(),\n});\n\nexport type PageContext = z.infer<typeof PageContextSchema>;\n\n/**\n * User traits schema (for identify events)\n */\nexport const UserTraitsSchema = z.object({\n /** Email address */\n email: z.string().email().optional(),\n \n /** Phone number */\n phone: z.string().optional(),\n \n /** First name */\n first_name: z.string().optional(),\n \n /** Last name */\n last_name: z.string().optional(),\n \n /** Company name */\n company: z.string().optional(),\n \n /** Job title */\n title: z.string().optional(),\n \n /** Address city */\n city: z.string().optional(),\n \n /** Address state/region */\n state: z.string().optional(),\n \n /** Address country */\n country: z.string().optional(),\n \n /** Postal code */\n postal_code: z.string().optional(),\n \n /** Avatar/profile image URL */\n avatar: z.string().url().optional(),\n});\n\nexport type UserTraits = z.infer<typeof UserTraitsSchema>;\n","import { z } from 'zod';\nimport {\n BaseEventMetadataSchema,\n ProductSchema,\n CartSchema,\n MoneySchema,\n PageContextSchema,\n} from './base';\n\n/**\n * E-commerce Event Types (locked - do not modify)\n */\nexport type EcommerceEventType =\n | 'product_viewed'\n | 'product_list_viewed'\n | 'product_added'\n | 'product_removed'\n | 'cart_viewed'\n | 'checkout_started'\n | 'checkout_step_completed'\n | 'payment_info_entered'\n | 'order_completed'\n | 'order_updated'\n | 'order_refunded'\n | 'order_cancelled';\n\n// ==================== Product Events ====================\n\n/**\n * Product Viewed Event\n * Fired when a user views a product detail page\n */\nexport const ProductViewedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('product_viewed'),\n product: ProductSchema,\n page: PageContextSchema.optional(),\n});\n\nexport type ProductViewedEvent = z.infer<typeof ProductViewedEventSchema>;\n\n/**\n * Product List Viewed Event\n * Fired when a user views a product listing/collection page\n */\nexport const ProductListViewedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('product_list_viewed'),\n list_id: z.string().optional(),\n list_name: z.string().optional(),\n category: z.string().optional(),\n products: z.array(ProductSchema),\n page: PageContextSchema.optional(),\n});\n\nexport type ProductListViewedEvent = z.infer<typeof ProductListViewedEventSchema>;\n\n// ==================== Cart Events ====================\n\n/**\n * Product Added Event\n * Fired when a product is added to cart\n */\nexport const ProductAddedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('product_added'),\n product: ProductSchema,\n cart: CartSchema.optional(),\n});\n\nexport type ProductAddedEvent = z.infer<typeof ProductAddedEventSchema>;\n\n/**\n * Product Removed Event\n * Fired when a product is removed from cart\n */\nexport const ProductRemovedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('product_removed'),\n product: ProductSchema,\n cart: CartSchema.optional(),\n});\n\nexport type ProductRemovedEvent = z.infer<typeof ProductRemovedEventSchema>;\n\n/**\n * Cart Viewed Event\n * Fired when a user views their shopping cart\n */\nexport const CartViewedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('cart_viewed'),\n cart: CartSchema,\n});\n\nexport type CartViewedEvent = z.infer<typeof CartViewedEventSchema>;\n\n// ==================== Checkout Events ====================\n\n/**\n * Checkout Started Event\n * Fired when a user begins the checkout process\n */\nexport const CheckoutStartedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('checkout_started'),\n cart: CartSchema,\n checkout_id: z.string().optional(),\n});\n\nexport type CheckoutStartedEvent = z.infer<typeof CheckoutStartedEventSchema>;\n\n/**\n * Checkout Step Completed Event\n * Fired when a user completes a step in a multi-step checkout\n */\nexport const CheckoutStepCompletedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('checkout_step_completed'),\n checkout_id: z.string(),\n step: z.number().int().positive(),\n step_name: z.string().optional(),\n shipping_method: z.string().optional(),\n payment_method: z.string().optional(),\n});\n\nexport type CheckoutStepCompletedEvent = z.infer<typeof CheckoutStepCompletedEventSchema>;\n\n/**\n * Payment Info Entered Event\n * Fired when a user enters payment information\n */\nexport const PaymentInfoEnteredEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('payment_info_entered'),\n checkout_id: z.string(),\n payment_method: z.string(),\n cart: CartSchema.optional(),\n});\n\nexport type PaymentInfoEnteredEvent = z.infer<typeof PaymentInfoEnteredEventSchema>;\n\n// ==================== Order Events ====================\n\n/**\n * Order Completed Event\n * Fired when an order is successfully completed (purchase)\n */\nexport const OrderCompletedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('order_completed'),\n order_id: z.string(),\n checkout_id: z.string().optional(),\n total: MoneySchema,\n subtotal: MoneySchema.optional(),\n revenue: MoneySchema,\n tax: MoneySchema.optional(),\n shipping: MoneySchema.optional(),\n discount: MoneySchema.optional(),\n coupon: z.string().optional(),\n products: z.array(ProductSchema),\n payment_method: z.string().optional(),\n shipping_method: z.string().optional(),\n});\n\nexport type OrderCompletedEvent = z.infer<typeof OrderCompletedEventSchema>;\n\n/**\n * Order Updated Event\n * Fired when an order is modified after completion\n */\nexport const OrderUpdatedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('order_updated'),\n order_id: z.string(),\n total: MoneySchema.optional(),\n status: z.string().optional(),\n products: z.array(ProductSchema).optional(),\n});\n\nexport type OrderUpdatedEvent = z.infer<typeof OrderUpdatedEventSchema>;\n\n/**\n * Order Refunded Event\n * Fired when an order or items are refunded\n */\nexport const OrderRefundedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('order_refunded'),\n order_id: z.string(),\n refund_amount: MoneySchema,\n refund_reason: z.string().optional(),\n products: z.array(ProductSchema).optional(),\n});\n\nexport type OrderRefundedEvent = z.infer<typeof OrderRefundedEventSchema>;\n\n/**\n * Order Cancelled Event\n * Fired when an order is cancelled\n */\nexport const OrderCancelledEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('order_cancelled'),\n order_id: z.string(),\n cancel_reason: z.string().optional(),\n});\n\nexport type OrderCancelledEvent = z.infer<typeof OrderCancelledEventSchema>;\n\n// ==================== Union Type ====================\n\n/**\n * All E-commerce Events (discriminated union)\n */\nexport type EcommerceEvent =\n | ProductViewedEvent\n | ProductListViewedEvent\n | ProductAddedEvent\n | ProductRemovedEvent\n | CartViewedEvent\n | CheckoutStartedEvent\n | CheckoutStepCompletedEvent\n | PaymentInfoEnteredEvent\n | OrderCompletedEvent\n | OrderUpdatedEvent\n | OrderRefundedEvent\n | OrderCancelledEvent;\n\n/**\n * E-commerce Event Schema (runtime validation)\n */\nexport const EcommerceEventSchema = z.discriminatedUnion('event_type', [\n ProductViewedEventSchema,\n ProductListViewedEventSchema,\n ProductAddedEventSchema,\n ProductRemovedEventSchema,\n CartViewedEventSchema,\n CheckoutStartedEventSchema,\n CheckoutStepCompletedEventSchema,\n PaymentInfoEnteredEventSchema,\n OrderCompletedEventSchema,\n OrderUpdatedEventSchema,\n OrderRefundedEventSchema,\n OrderCancelledEventSchema,\n]);\n","import { z } from 'zod';\nimport { BaseEventMetadataSchema, MoneySchema, UserTraitsSchema } from './base';\n\n/**\n * SaaS Event Types (locked - do not modify)\n */\nexport type SaasEventType =\n | 'user_signed_up'\n | 'user_invited'\n | 'user_logged_in'\n | 'user_logged_out'\n | 'account_created'\n | 'account_deleted'\n | 'trial_started'\n | 'trial_converted'\n | 'trial_ended'\n | 'subscription_started'\n | 'subscription_upgraded'\n | 'subscription_downgraded'\n | 'subscription_cancelled'\n | 'subscription_renewed'\n | 'subscription_paused'\n | 'subscription_resumed'\n | 'payment_succeeded'\n | 'payment_failed'\n | 'invoice_created'\n | 'invoice_paid'\n | 'feature_used'\n | 'limit_reached'\n | 'quota_exceeded';\n\n/**\n * Subscription plan schema\n */\nexport const SubscriptionPlanSchema = z.object({\n plan_id: z.string(),\n plan_name: z.string(),\n plan_type: z.enum(['free', 'trial', 'paid']).optional(),\n billing_period: z.enum(['monthly', 'yearly', 'quarterly', 'lifetime']).optional(),\n price: MoneySchema.optional(),\n});\n\nexport type SubscriptionPlan = z.infer<typeof SubscriptionPlanSchema>;\n\n// ==================== User Lifecycle Events ====================\n\n/**\n * User Signed Up Event\n * Fired when a new user creates an account\n */\nexport const UserSignedUpEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('user_signed_up'),\n user_traits: UserTraitsSchema.optional(),\n signup_method: z.enum(['email', 'google', 'github', 'sso', 'other']).optional(),\n referral_code: z.string().optional(),\n});\n\nexport type UserSignedUpEvent = z.infer<typeof UserSignedUpEventSchema>;\n\n/**\n * User Invited Event\n * Fired when a user invites another user\n */\nexport const UserInvitedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('user_invited'),\n invited_email: z.string().email(),\n inviter_id: z.string(),\n role: z.string().optional(),\n team_id: z.string().optional(),\n});\n\nexport type UserInvitedEvent = z.infer<typeof UserInvitedEventSchema>;\n\n/**\n * User Logged In Event\n * Fired when a user logs in\n */\nexport const UserLoggedInEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('user_logged_in'),\n login_method: z.enum(['email', 'google', 'github', 'sso', 'other']).optional(),\n});\n\nexport type UserLoggedInEvent = z.infer<typeof UserLoggedInEventSchema>;\n\n/**\n * User Logged Out Event\n * Fired when a user logs out\n */\nexport const UserLoggedOutEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('user_logged_out'),\n});\n\nexport type UserLoggedOutEvent = z.infer<typeof UserLoggedOutEventSchema>;\n\n/**\n * Account Created Event\n * Fired when an organization/team account is created\n */\nexport const AccountCreatedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('account_created'),\n account_id: z.string(),\n account_name: z.string(),\n plan: SubscriptionPlanSchema.optional(),\n});\n\nexport type AccountCreatedEvent = z.infer<typeof AccountCreatedEventSchema>;\n\n/**\n * Account Deleted Event\n * Fired when an account is deleted\n */\nexport const AccountDeletedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('account_deleted'),\n account_id: z.string(),\n delete_reason: z.string().optional(),\n});\n\nexport type AccountDeletedEvent = z.infer<typeof AccountDeletedEventSchema>;\n\n// ==================== Trial Events ====================\n\n/**\n * Trial Started Event\n * Fired when a user starts a trial\n */\nexport const TrialStartedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('trial_started'),\n plan: SubscriptionPlanSchema,\n trial_days: z.number().int().positive(),\n trial_end_date: z.number().int().positive(),\n});\n\nexport type TrialStartedEvent = z.infer<typeof TrialStartedEventSchema>;\n\n/**\n * Trial Converted Event\n * Fired when a trial converts to a paid subscription\n */\nexport const TrialConvertedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('trial_converted'),\n from_plan: SubscriptionPlanSchema,\n to_plan: SubscriptionPlanSchema,\n});\n\nexport type TrialConvertedEvent = z.infer<typeof TrialConvertedEventSchema>;\n\n/**\n * Trial Ended Event\n * Fired when a trial expires without conversion\n */\nexport const TrialEndedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('trial_ended'),\n plan: SubscriptionPlanSchema,\n converted: z.boolean(),\n});\n\nexport type TrialEndedEvent = z.infer<typeof TrialEndedEventSchema>;\n\n// ==================== Subscription Events ====================\n\n/**\n * Subscription Started Event\n * Fired when a new subscription begins\n */\nexport const SubscriptionStartedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('subscription_started'),\n subscription_id: z.string(),\n plan: SubscriptionPlanSchema,\n billing_period_start: z.number().int().positive(),\n billing_period_end: z.number().int().positive(),\n});\n\nexport type SubscriptionStartedEvent = z.infer<typeof SubscriptionStartedEventSchema>;\n\n/**\n * Subscription Upgraded Event\n * Fired when a subscription is upgraded to a higher tier\n */\nexport const SubscriptionUpgradedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('subscription_upgraded'),\n subscription_id: z.string(),\n from_plan: SubscriptionPlanSchema,\n to_plan: SubscriptionPlanSchema,\n prorated_amount: MoneySchema.optional(),\n});\n\nexport type SubscriptionUpgradedEvent = z.infer<typeof SubscriptionUpgradedEventSchema>;\n\n/**\n * Subscription Downgraded Event\n * Fired when a subscription is downgraded to a lower tier\n */\nexport const SubscriptionDowngradedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('subscription_downgraded'),\n subscription_id: z.string(),\n from_plan: SubscriptionPlanSchema,\n to_plan: SubscriptionPlanSchema,\n effective_date: z.number().int().positive().optional(),\n});\n\nexport type SubscriptionDowngradedEvent = z.infer<typeof SubscriptionDowngradedEventSchema>;\n\n/**\n * Subscription Cancelled Event\n * Fired when a subscription is cancelled\n */\nexport const SubscriptionCancelledEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('subscription_cancelled'),\n subscription_id: z.string(),\n plan: SubscriptionPlanSchema,\n cancel_reason: z.string().optional(),\n cancel_at_period_end: z.boolean().default(true),\n effective_date: z.number().int().positive().optional(),\n});\n\nexport type SubscriptionCancelledEvent = z.infer<typeof SubscriptionCancelledEventSchema>;\n\n/**\n * Subscription Renewed Event\n * Fired when a subscription automatically renews\n */\nexport const SubscriptionRenewedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('subscription_renewed'),\n subscription_id: z.string(),\n plan: SubscriptionPlanSchema,\n billing_period_start: z.number().int().positive(),\n billing_period_end: z.number().int().positive(),\n});\n\nexport type SubscriptionRenewedEvent = z.infer<typeof SubscriptionRenewedEventSchema>;\n\n/**\n * Subscription Paused Event\n * Fired when a subscription is temporarily paused\n */\nexport const SubscriptionPausedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('subscription_paused'),\n subscription_id: z.string(),\n pause_reason: z.string().optional(),\n});\n\nexport type SubscriptionPausedEvent = z.infer<typeof SubscriptionPausedEventSchema>;\n\n/**\n * Subscription Resumed Event\n * Fired when a paused subscription is resumed\n */\nexport const SubscriptionResumedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('subscription_resumed'),\n subscription_id: z.string(),\n});\n\nexport type SubscriptionResumedEvent = z.infer<typeof SubscriptionResumedEventSchema>;\n\n// ==================== Payment Events ====================\n\n/**\n * Payment Succeeded Event\n * Fired when a payment is successfully processed\n */\nexport const PaymentSucceededEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('payment_succeeded'),\n payment_id: z.string(),\n subscription_id: z.string().optional(),\n invoice_id: z.string().optional(),\n amount: MoneySchema,\n payment_method: z.string().optional(),\n});\n\nexport type PaymentSucceededEvent = z.infer<typeof PaymentSucceededEventSchema>;\n\n/**\n * Payment Failed Event\n * Fired when a payment fails\n */\nexport const PaymentFailedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('payment_failed'),\n payment_id: z.string().optional(),\n subscription_id: z.string().optional(),\n invoice_id: z.string().optional(),\n amount: MoneySchema,\n failure_reason: z.string().optional(),\n retry_attempt: z.number().int().nonnegative().optional(),\n});\n\nexport type PaymentFailedEvent = z.infer<typeof PaymentFailedEventSchema>;\n\n/**\n * Invoice Created Event\n * Fired when an invoice is generated\n */\nexport const InvoiceCreatedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('invoice_created'),\n invoice_id: z.string(),\n subscription_id: z.string().optional(),\n amount: MoneySchema,\n due_date: z.number().int().positive().optional(),\n});\n\nexport type InvoiceCreatedEvent = z.infer<typeof InvoiceCreatedEventSchema>;\n\n/**\n * Invoice Paid Event\n * Fired when an invoice is paid\n */\nexport const InvoicePaidEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('invoice_paid'),\n invoice_id: z.string(),\n subscription_id: z.string().optional(),\n amount: MoneySchema,\n paid_at: z.number().int().positive(),\n});\n\nexport type InvoicePaidEvent = z.infer<typeof InvoicePaidEventSchema>;\n\n// ==================== Usage Events ====================\n\n/**\n * Feature Used Event\n * Fired when a user uses a specific feature\n */\nexport const FeatureUsedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('feature_used'),\n feature_name: z.string(),\n feature_id: z.string().optional(),\n usage_count: z.number().int().nonnegative().optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\nexport type FeatureUsedEvent = z.infer<typeof FeatureUsedEventSchema>;\n\n/**\n * Limit Reached Event\n * Fired when a user reaches their plan limit\n */\nexport const LimitReachedEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('limit_reached'),\n limit_type: z.string(),\n current_usage: z.number(),\n limit_value: z.number(),\n plan: SubscriptionPlanSchema.optional(),\n});\n\nexport type LimitReachedEvent = z.infer<typeof LimitReachedEventSchema>;\n\n/**\n * Quota Exceeded Event\n * Fired when a user exceeds their quota\n */\nexport const QuotaExceededEventSchema = BaseEventMetadataSchema.extend({\n event_type: z.literal('quota_exceeded'),\n quota_type: z.string(),\n current_usage: z.number(),\n quota_limit: z.number(),\n plan: SubscriptionPlanSchema.optional(),\n});\n\nexport type QuotaExceededEvent = z.infer<typeof QuotaExceededEventSchema>;\n\n// ==================== Union Type ====================\n\n/**\n * All SaaS Events (discriminated union)\n */\nexport type SaasEvent =\n | UserSignedUpEvent\n | UserInvitedEvent\n | UserLoggedInEvent\n | UserLoggedOutEvent\n | AccountCreatedEvent\n | AccountDeletedEvent\n | TrialStartedEvent\n | TrialConvertedEvent\n | TrialEndedEvent\n | SubscriptionStartedEvent\n | SubscriptionUpgradedEvent\n | SubscriptionDowngradedEvent\n | SubscriptionCancelledEvent\n | SubscriptionRenewedEvent\n | SubscriptionPausedEvent\n | SubscriptionResumedEvent\n | PaymentSucceededEvent\n | PaymentFailedEvent\n | InvoiceCreatedEvent\n | InvoicePaidEvent\n | FeatureUsedEvent\n | LimitReachedEvent\n | QuotaExceededEvent;\n\n/**\n * SaaS Event Schema (runtime validation)\n */\nexport const SaasEventSchema = z.discriminatedUnion('event_type', [\n UserSignedUpEventSchema,\n UserInvitedEventSchema,\n UserLoggedInEventSchema,\n UserLoggedOutEventSchema,\n AccountCreatedEventSchema,\n AccountDeletedEventSchema,\n TrialStartedEventSchema,\n TrialConvertedEventSchema,\n TrialEndedEventSchema,\n SubscriptionStartedEventSchema,\n SubscriptionUpgradedEventSchema,\n SubscriptionDowngradedEventSchema,\n SubscriptionCancelledEventSchema,\n SubscriptionRenewedEventSchema,\n SubscriptionPausedEventSchema,\n SubscriptionResumedEventSchema,\n PaymentSucceededEventSchema,\n PaymentFailedEventSchema,\n InvoiceCreatedEventSchema,\n InvoicePaidEventSchema,\n FeatureUsedEventSchema,\n LimitReachedEventSchema,\n QuotaExceededEventSchema,\n]);\n","import { z } from 'zod';\nimport { BaseEventMetadataSchema } from './base';\n\n/**\n * Custom Event\n * \n * Use this for events not covered by core schemas.\n * You define the event_type and properties.\n * \n * @example\n * ```typescript\n * const myEvent: CustomEvent = {\n * event_type: 'video_watched',\n * event_id: '123',\n * timestamp: Date.now(),\n * source: 'pixel',\n * properties: {\n * video_id: 'abc',\n * duration: 120,\n * percentage_watched: 75\n * }\n * };\n * ```\n */\nexport const CustomEventSchema = BaseEventMetadataSchema.extend({\n /** Custom event type (user-defined) */\n event_type: z.string(),\n \n /** Custom event properties (user-defined) */\n properties: z.record(z.unknown()).optional(),\n});\n\nexport type CustomEvent = z.infer<typeof CustomEventSchema>;\n\n/**\n * Helper type to create a strongly-typed custom event\n * \n * @example\n * ```typescript\n * type VideoWatchedEvent = TypedCustomEvent<'video_watched', {\n * video_id: string;\n * duration: number;\n * percentage_watched: number;\n * }>;\n * \n * const event: VideoWatchedEvent = {\n * event_type: 'video_watched',\n * event_id: '123',\n * timestamp: Date.now(),\n * source: 'pixel',\n * properties: {\n * video_id: 'abc',\n * duration: 120,\n * percentage_watched: 75\n * }\n * };\n * ```\n */\nexport type TypedCustomEvent<\n EventType extends string,\n Properties extends Record<string, unknown>\n> = Omit<CustomEvent, 'event_type' | 'properties'> & {\n event_type: EventType;\n properties: Properties;\n};\n\n/**\n * Helper function to create a Zod schema for a typed custom event\n * \n * @example\n * ```typescript\n * const VideoWatchedSchema = createCustomEventSchema(\n * 'video_watched',\n * z.object({\n * video_id: z.string(),\n * duration: z.number(),\n * percentage_watched: z.number().min(0).max(100),\n * })\n * );\n * \n * type VideoWatchedEvent = z.infer<typeof VideoWatchedSchema>;\n * \n * // Validate at runtime\n * const validated = VideoWatchedSchema.parse(rawEvent);\n * ```\n */\nexport function createCustomEventSchema<PropertiesSchema extends z.ZodTypeAny>(\n eventType: string,\n propertiesSchema: PropertiesSchema\n) {\n return BaseEventMetadataSchema.extend({\n event_type: z.literal(eventType),\n properties: propertiesSchema,\n });\n}\n\n/**\n * Example: Create custom event types for common use cases\n */\n\n// Video event\nexport type VideoEvent = TypedCustomEvent<\n 'video_watched' | 'video_started' | 'video_completed' | 'video_paused',\n {\n video_id: string;\n video_title?: string;\n duration?: number;\n current_time?: number;\n percentage_watched?: number;\n }\n>;\n\n// Article/Content event\nexport type ContentEvent = TypedCustomEvent<\n 'article_viewed' | 'article_read' | 'content_downloaded',\n {\n content_id: string;\n content_title?: string;\n content_type?: 'article' | 'whitepaper' | 'case-study' | 'ebook';\n read_time?: number;\n scroll_depth?: number;\n }\n>;\n\n// Form event\nexport type FormEvent = TypedCustomEvent<\n 'form_viewed' | 'form_started' | 'form_submitted' | 'form_abandoned',\n {\n form_id: string;\n form_name?: string;\n field_count?: number;\n completed_fields?: number;\n }\n>;\n\n// Search event\nexport type SearchEvent = TypedCustomEvent<\n 'search_performed' | 'search_results_viewed',\n {\n query: string;\n results_count?: number;\n category?: string;\n }\n>;\n\n// Notification event\nexport type NotificationEvent = TypedCustomEvent<\n 'notification_sent' | 'notification_opened' | 'notification_clicked',\n {\n notification_id: string;\n notification_type?: 'email' | 'push' | 'sms' | 'in-app';\n campaign_id?: string;\n }\n>;\n","import { z } from 'zod';\nimport { EcommerceEventSchema, type EcommerceEvent } from './ecommerce';\nimport { SaasEventSchema, type SaasEvent } from './saas';\nimport { CustomEventSchema, type CustomEvent } from './custom';\n\n/**\n * All Core Event Types (e-commerce + SaaS)\n */\nexport type CoreEvent = EcommerceEvent | SaasEvent;\n\n/**\n * All Event Types (core + custom)\n */\nexport type AnyEvent = CoreEvent | CustomEvent;\n\n/**\n * Core Event Schema (e-commerce + SaaS combined)\n */\nexport const CoreEventSchema = z.union([EcommerceEventSchema, SaasEventSchema]);\n\n/**\n * Any Event Schema (core + custom)\n */\nexport const AnyEventSchema = z.union([\n EcommerceEventSchema,\n SaasEventSchema,\n CustomEventSchema,\n]);\n\n/**\n * Validation result types\n */\nexport type ValidationSuccess<T> = {\n success: true;\n data: T;\n error: null;\n};\n\nexport type ValidationError = {\n success: false;\n data: null;\n error: z.ZodError;\n};\n\nexport type ValidationResult<T> = ValidationSuccess<T> | ValidationError;\n\n/**\n * Validate any event (type-safe wrapper around Zod parse)\n * \n * @param data - Raw event data\n * @returns Validation result with typed data or error\n * \n * @example\n * ```typescript\n * const result = validateEvent(rawData);\n * \n * if (result.success) {\n * console.log('Valid event:', result.data);\n * // result.data is properly typed as AnyEvent\n * } else {\n * console.error('Validation failed:', result.error.errors);\n * }\n * ```\n */\nexport function validateEvent(data: unknown): ValidationResult<AnyEvent> {\n try {\n const parsed = AnyEventSchema.parse(data);\n return {\n success: true,\n data: parsed,\n error: null,\n };\n } catch (error) {\n if (error instanceof z.ZodError) {\n return {\n success: false,\n data: null,\n error,\n };\n }\n throw error;\n }\n}\n\n/**\n * Validate e-commerce event specifically\n */\nexport function validateEcommerceEvent(\n data: unknown\n): ValidationResult<EcommerceEvent> {\n try {\n const parsed = EcommerceEventSchema.parse(data);\n return {\n success: true,\n data: parsed,\n error: null,\n };\n } catch (error) {\n if (error instanceof z.ZodError) {\n return {\n success: false,\n data: null,\n error,\n };\n }\n throw error;\n }\n}\n\n/**\n * Validate SaaS event specifically\n */\nexport function validateSaasEvent(data: unknown): ValidationResult<SaasEvent> {\n try {\n const parsed = SaasEventSchema.parse(data);\n return {\n success: true,\n data: parsed,\n error: null,\n };\n } catch (error) {\n if (error instanceof z.ZodError) {\n return {\n success: false,\n data: null,\n error,\n };\n }\n throw error;\n }\n}\n\n/**\n * Validate custom event\n */\nexport function validateCustomEvent(\n data: unknown\n): ValidationResult<CustomEvent> {\n try {\n const parsed = CustomEventSchema.parse(data);\n return {\n success: true,\n data: parsed,\n error: null,\n };\n } catch (error) {\n if (error instanceof z.ZodError) {\n return {\n success: false,\n data: null,\n error,\n };\n }\n throw error;\n }\n}\n\n/**\n * Type guard to check if event is e-commerce\n */\nexport function isEcommerceEvent(event: AnyEvent): event is EcommerceEvent {\n const ecommerceTypes = [\n 'product_viewed',\n 'product_list_viewed',\n 'product_added',\n 'product_removed',\n 'cart_viewed',\n 'checkout_started',\n 'checkout_step_completed',\n 'payment_info_entered',\n 'order_completed',\n 'order_updated',\n 'order_refunded',\n 'order_cancelled',\n ];\n return ecommerceTypes.includes(event.event_type);\n}\n\n/**\n * Type guard to check if event is SaaS\n */\nexport function isSaasEvent(event: AnyEvent): event is SaasEvent {\n const saasTypes = [\n 'user_signed_up',\n 'user_invited',\n 'user_logged_in',\n 'user_logged_out',\n 'account_created',\n 'account_deleted',\n 'trial_started',\n 'trial_converted',\n 'trial_ended',\n 'subscription_started',\n 'subscription_upgraded',\n 'subscription_downgraded',\n 'subscription_cancelled',\n 'subscription_renewed',\n 'subscription_paused',\n 'subscription_resumed',\n 'payment_succeeded',\n 'payment_failed',\n 'invoice_created',\n 'invoice_paid',\n 'feature_used',\n 'limit_reached',\n 'quota_exceeded',\n ];\n return saasTypes.includes(event.event_type);\n}\n\n/**\n * Type guard to check if event is custom\n */\nexport function isCustomEvent(event: AnyEvent): event is CustomEvent {\n return !isEcommerceEvent(event) && !isSaasEvent(event);\n}\n"]}