@cimplify/sdk 0.44.12 → 0.44.16

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.
Files changed (99) hide show
  1. package/dist/advanced.d.mts +1 -1
  2. package/dist/advanced.d.ts +1 -1
  3. package/dist/advanced.js +21 -21
  4. package/dist/advanced.mjs +2 -2
  5. package/dist/{chunk-6TVQQYQ5.mjs → chunk-6AZZ6AOF.mjs} +21 -1
  6. package/dist/{chunk-EZK2FXTM.mjs → chunk-7NML226B.mjs} +1 -1
  7. package/dist/{chunk-BAWKQRIB.js → chunk-CFD4J32N.js} +21 -21
  8. package/dist/{chunk-OMAP327U.js → chunk-MBGQP6FZ.js} +62 -61
  9. package/dist/{chunk-V2O5AO7I.js → chunk-MNIKXG7W.js} +26 -0
  10. package/dist/{chunk-3WD6U5RD.mjs → chunk-UXLQ7WXI.mjs} +4 -3
  11. package/dist/chunk-XL4CX75J.js +9370 -0
  12. package/dist/chunk-ZLEFMQC6.mjs +9318 -0
  13. package/dist/cli/commands/deploy.mjs +9 -1
  14. package/dist/{client-lvLvB1_K.d.ts → client-D6ZisKco.d.ts} +7 -0
  15. package/dist/{client-CkGlXZRd.d.mts → client-Dh-bHyhU.d.mts} +7 -0
  16. package/dist/index.d.mts +1 -1
  17. package/dist/index.d.ts +1 -1
  18. package/dist/index.js +106 -106
  19. package/dist/index.mjs +3 -3
  20. package/dist/mock/cli.mjs +172 -23
  21. package/dist/mock/library.d.mts +2 -2
  22. package/dist/mock/library.d.ts +2 -2
  23. package/dist/mock/library.js +172 -23
  24. package/dist/mock/library.mjs +172 -23
  25. package/dist/mock/msw.d.mts +1 -1
  26. package/dist/mock/msw.d.ts +1 -1
  27. package/dist/mock/msw.js +172 -23
  28. package/dist/mock/msw.mjs +172 -23
  29. package/dist/react.d.mts +1 -1
  30. package/dist/react.d.ts +1 -1
  31. package/dist/react.js +80 -80
  32. package/dist/react.mjs +3 -3
  33. package/dist/server-CWpUlLOQ.d.mts +1003 -0
  34. package/dist/server-CWpUlLOQ.d.ts +1003 -0
  35. package/dist/{server-CUbuQxOV.d.ts → server-CnECAQDQ.d.mts} +28 -6
  36. package/dist/{server-CUbuQxOV.d.mts → server-CnECAQDQ.d.ts} +28 -6
  37. package/dist/server.d.mts +2 -2
  38. package/dist/server.d.ts +2 -2
  39. package/dist/server.js +5 -5
  40. package/dist/server.mjs +3 -3
  41. package/dist/testing/suite.d.mts +60 -0
  42. package/dist/testing/suite.d.ts +60 -0
  43. package/dist/testing/suite.js +169 -0
  44. package/dist/testing/suite.mjs +165 -0
  45. package/dist/testing.d.mts +1359 -0
  46. package/dist/testing.d.ts +1359 -0
  47. package/dist/testing.js +213 -0
  48. package/dist/testing.mjs +4 -0
  49. package/dist/utils.js +28 -28
  50. package/dist/utils.mjs +1 -1
  51. package/package.json +18 -3
  52. package/registry/account.json +15 -0
  53. package/registry/billing-plan-selector.json +16 -0
  54. package/registry/cart-drawer.json +17 -0
  55. package/registry/currency-selector.json +15 -0
  56. package/registry/customer-input-fields.json +15 -0
  57. package/registry/delivery-estimate.json +16 -0
  58. package/registry/index.json +105 -0
  59. package/registry/location-picker.json +15 -0
  60. package/registry/recently-viewed.json +16 -0
  61. package/registry/recommendation-carousel.json +16 -0
  62. package/registry/resource-picker.json +15 -0
  63. package/registry/session-message-banner.json +15 -0
  64. package/templates/storefront-bakery/AGENTS.md +12 -0
  65. package/templates/storefront-bakery/__tests__/brand.test.ts +4 -0
  66. package/templates/storefront-bakery/__tests__/cart-flow.test.ts +4 -0
  67. package/templates/storefront-bakery/__tests__/contract.test.ts +4 -0
  68. package/templates/storefront-bakery/package.json +11 -3
  69. package/templates/storefront-bakery/vitest.config.ts +9 -0
  70. package/templates/storefront-fashion/AGENTS.md +21 -1
  71. package/templates/storefront-fashion/__tests__/brand.test.ts +4 -0
  72. package/templates/storefront-fashion/__tests__/cart-flow.test.ts +4 -0
  73. package/templates/storefront-fashion/__tests__/contract.test.ts +4 -0
  74. package/templates/storefront-fashion/package.json +11 -3
  75. package/templates/storefront-fashion/vitest.config.ts +9 -0
  76. package/templates/storefront-grocery/AGENTS.md +12 -0
  77. package/templates/storefront-grocery/__tests__/brand.test.ts +4 -0
  78. package/templates/storefront-grocery/__tests__/cart-flow.test.ts +4 -0
  79. package/templates/storefront-grocery/__tests__/contract.test.ts +4 -0
  80. package/templates/storefront-grocery/package.json +11 -3
  81. package/templates/storefront-grocery/vitest.config.ts +9 -0
  82. package/templates/storefront-restaurant/AGENTS.md +12 -0
  83. package/templates/storefront-restaurant/__tests__/brand.test.ts +4 -0
  84. package/templates/storefront-restaurant/__tests__/cart-flow.test.ts +4 -0
  85. package/templates/storefront-restaurant/__tests__/contract.test.ts +4 -0
  86. package/templates/storefront-restaurant/package.json +11 -3
  87. package/templates/storefront-restaurant/vitest.config.ts +9 -0
  88. package/templates/storefront-retail/AGENTS.md +12 -0
  89. package/templates/storefront-retail/__tests__/brand.test.ts +4 -0
  90. package/templates/storefront-retail/__tests__/cart-flow.test.ts +4 -0
  91. package/templates/storefront-retail/__tests__/contract.test.ts +4 -0
  92. package/templates/storefront-retail/package.json +11 -3
  93. package/templates/storefront-retail/vitest.config.ts +9 -0
  94. package/templates/storefront-services/AGENTS.md +12 -0
  95. package/templates/storefront-services/__tests__/brand.test.ts +4 -0
  96. package/templates/storefront-services/__tests__/cart-flow.test.ts +4 -0
  97. package/templates/storefront-services/__tests__/contract.test.ts +4 -0
  98. package/templates/storefront-services/package.json +11 -3
  99. package/templates/storefront-services/vitest.config.ts +9 -0
@@ -0,0 +1,1003 @@
1
+ import { Hono } from 'hono';
2
+
3
+ interface Clock {
4
+ now(): Date;
5
+ nowMs(): number;
6
+ iso(): string;
7
+ advance(ms: number): void;
8
+ freeze(at?: Date): void;
9
+ unfreeze(): void;
10
+ schedule(at: Date | number, fn: () => void): void;
11
+ }
12
+
13
+ interface IdGen {
14
+ ulid(): string;
15
+ prefixed(prefix: string): string;
16
+ cart(): string;
17
+ cartItem(): string;
18
+ order(): string;
19
+ orderNumber(): string;
20
+ business(): string;
21
+ product(): string;
22
+ variant(): string;
23
+ category(): string;
24
+ collection(): string;
25
+ bundle(): string;
26
+ composite(): string;
27
+ session(): string;
28
+ customer(): string;
29
+ service(): string;
30
+ booking(): string;
31
+ subscription(): string;
32
+ upload(): string;
33
+ conversation(): string;
34
+ message(): string;
35
+ quote(): string;
36
+ fxQuote(): string;
37
+ payment(): string;
38
+ raw(prefix: string): string;
39
+ }
40
+
41
+ type MockEventType = "cart.updated" | "cart.cleared" | "order.created" | "order.payment.captured" | "order.payment.failed" | "order.cancelled" | "order.confirmed" | "subscription.created" | "subscription.cancelled" | "subscription.paused" | "subscription.resumed" | "subscription.renewed" | "booking.created" | "booking.cancelled" | "booking.rescheduled" | "support.message.sent" | "support.message.received" | "auth.session.started" | "auth.session.ended" | "upload.confirmed";
42
+ interface MockEvent<T = unknown> {
43
+ id: string;
44
+ type: MockEventType;
45
+ occurred_at: string;
46
+ business_id?: string;
47
+ payload: T;
48
+ }
49
+ type Handler = (e: MockEvent) => void;
50
+ interface MockBus {
51
+ emit(type: MockEventType, payload: unknown, businessId?: string): MockEvent;
52
+ on(type: MockEventType | "*", handler: Handler): () => void;
53
+ history(limit?: number): MockEvent[];
54
+ clear(): void;
55
+ }
56
+
57
+ interface Store<T> {
58
+ get(id: string): T | undefined;
59
+ put(id: string, value: T): T;
60
+ delete(id: string): boolean;
61
+ list(filter?: (t: T) => boolean): T[];
62
+ values(): IterableIterator<T>;
63
+ size(): number;
64
+ reset(): void;
65
+ toJSON(): Record<string, T>;
66
+ loadJSON(data: Record<string, T>): void;
67
+ }
68
+
69
+ interface Session {
70
+ id: string;
71
+ token: string;
72
+ business_id: string;
73
+ customer_id?: string;
74
+ customer_name?: string;
75
+ customer_email?: string;
76
+ customer_phone?: string;
77
+ is_authenticated: boolean;
78
+ created_at: string;
79
+ expires_at: string;
80
+ }
81
+ interface OtpRequest {
82
+ id: string;
83
+ contact: string;
84
+ code: string;
85
+ expires_at: string;
86
+ attempts: number;
87
+ }
88
+ interface IdempotencyRecord {
89
+ key: string;
90
+ request_hash: string;
91
+ response: unknown;
92
+ status: number;
93
+ created_at: string;
94
+ expires_at: string;
95
+ }
96
+ interface MockBusiness {
97
+ id: string;
98
+ name: string;
99
+ handle: string;
100
+ business_type: string;
101
+ email: string;
102
+ default_currency: string;
103
+ default_phone?: string;
104
+ default_address?: string;
105
+ default_offers_table_service: boolean;
106
+ default_accepts_online_orders: boolean;
107
+ image?: string;
108
+ status: string;
109
+ created_at: string;
110
+ updated_at: string;
111
+ created_by: string;
112
+ preferences: Record<string, unknown>;
113
+ is_online_only: boolean;
114
+ enabled_payment_types: string[];
115
+ default_location_settings: Record<string, unknown>;
116
+ country_code?: string;
117
+ timezone?: string;
118
+ metadata?: Record<string, unknown>;
119
+ }
120
+ interface MockQuantityPricingTier {
121
+ min_quantity: number;
122
+ unit_price: string;
123
+ }
124
+ interface MockBillingPlan {
125
+ id: string;
126
+ name: string;
127
+ interval: "day" | "week" | "month" | "year";
128
+ interval_count: number;
129
+ price: string;
130
+ currency: string;
131
+ trial_period_days?: number;
132
+ }
133
+ interface MockProduct {
134
+ id: string;
135
+ business_id: string;
136
+ name: string;
137
+ slug: string;
138
+ description?: string;
139
+ product_type: string;
140
+ base_price: string;
141
+ currency: string;
142
+ image?: string;
143
+ images: string[];
144
+ is_available: boolean;
145
+ category_ids: string[];
146
+ collection_ids: string[];
147
+ add_on_ids: string[];
148
+ variant_ids: string[];
149
+ tags?: string[];
150
+ calories?: number;
151
+ allergies?: string[];
152
+ ingredients?: string[];
153
+ pairings?: string[];
154
+ is_signature?: boolean;
155
+ is_new?: boolean;
156
+ /** Override for the auto-derived render hint. */
157
+ render_hint?: "food" | "physical" | "general";
158
+ /** Display mode hint (card opens modal, page is a link). Storefronts can override. */
159
+ display_mode?: "card" | "page";
160
+ /** For digital products — how the SDK renders fulfilment UI. */
161
+ digital_product_type?: "download" | "license" | "event_ticket" | "access_pass" | "gift_code";
162
+ /** For wholesale products — quantity-pricing tiers. */
163
+ quantity_pricing?: MockQuantityPricingTier[];
164
+ /** For services — duration unit (drives Rental/Accommodation/Lease cards). */
165
+ duration_unit?: "minutes" | "hours" | "days" | "nights" | "weeks" | "months" | "years";
166
+ /** For schedule services — duration in minutes (presence implies non-subscription service). */
167
+ duration_minutes?: number;
168
+ /** For subscription services — billing plans. */
169
+ billing_plans?: MockBillingPlan[];
170
+ metadata?: Record<string, unknown>;
171
+ created_at: string;
172
+ updated_at: string;
173
+ }
174
+ interface MockCategory {
175
+ id: string;
176
+ business_id: string;
177
+ name: string;
178
+ slug: string;
179
+ description?: string;
180
+ image?: string;
181
+ product_ids: string[];
182
+ display_order: number;
183
+ is_active: boolean;
184
+ created_at: string;
185
+ updated_at: string;
186
+ }
187
+ interface MockCollection {
188
+ id: string;
189
+ business_id: string;
190
+ name: string;
191
+ slug: string;
192
+ description?: string;
193
+ product_ids: string[];
194
+ is_active: boolean;
195
+ created_at: string;
196
+ updated_at: string;
197
+ }
198
+ interface MockCart {
199
+ id: string;
200
+ business_id: string;
201
+ session_id?: string;
202
+ customer_id?: string;
203
+ customer_name?: string;
204
+ customer_email?: string;
205
+ customer_phone?: string;
206
+ customer_address?: string;
207
+ items: MockCartItem[];
208
+ subtotal: string;
209
+ tax_amount: string;
210
+ tax_rate?: string;
211
+ service_charge: string;
212
+ service_charge_rate?: string;
213
+ total_discounts: string;
214
+ total_price: string;
215
+ delivery_fee: string;
216
+ total_items: number;
217
+ currency: string;
218
+ applied_discount_ids: string[];
219
+ applied_discount_codes: string[];
220
+ status: string;
221
+ source: string;
222
+ channel: string;
223
+ created_at: string;
224
+ updated_at: string;
225
+ expires_at: string;
226
+ }
227
+ interface MockCartItem {
228
+ id: string;
229
+ cart_id: string;
230
+ item_id: string;
231
+ variant_id?: string;
232
+ line_key: string;
233
+ quantity: number;
234
+ price: string;
235
+ add_ons_price: string;
236
+ configuration: {
237
+ type: string;
238
+ [k: string]: unknown;
239
+ };
240
+ applied_discount_ids: string[];
241
+ item_discount_amount: string;
242
+ scheduled_start?: string;
243
+ scheduled_end?: string;
244
+ staff_id?: string;
245
+ resource_id?: string;
246
+ service_status?: "pending" | "confirmed" | "completed" | "cancelled";
247
+ confirmation_code?: string;
248
+ special_instructions?: string;
249
+ customer_inputs?: {
250
+ field_id: string;
251
+ field_name?: string;
252
+ field_type?: string;
253
+ value: unknown;
254
+ }[];
255
+ billing_plan_id?: string;
256
+ metadata?: Record<string, unknown>;
257
+ created_at: string;
258
+ updated_at: string;
259
+ }
260
+ interface MockOrder {
261
+ id: string;
262
+ business_id: string;
263
+ user_friendly_id: string;
264
+ channel: string;
265
+ status: string;
266
+ payment_state: string;
267
+ order_type: string;
268
+ customer_id?: string;
269
+ customer_name?: string;
270
+ customer_email?: string;
271
+ customer_phone?: string;
272
+ delivery_address?: string;
273
+ delivery_fee: string;
274
+ subtotal: string;
275
+ tax_amount: string;
276
+ service_charge: string;
277
+ total_discounts: string;
278
+ total_price: string;
279
+ currency: string;
280
+ items: unknown[];
281
+ applied_discount_ids: string[];
282
+ applied_discount_codes: string[];
283
+ payment_reference?: string;
284
+ pickup_time?: string;
285
+ metadata?: Record<string, unknown>;
286
+ created_at: string;
287
+ updated_at: string;
288
+ }
289
+ interface MockSubscription {
290
+ id: string;
291
+ business_id: string;
292
+ customer_id: string;
293
+ product_id: string;
294
+ status: "active" | "paused" | "cancelled" | "expired";
295
+ next_renewal_at: string;
296
+ paused_at?: string;
297
+ cancelled_at?: string;
298
+ current_period_start: string;
299
+ current_period_end: string;
300
+ created_at: string;
301
+ updated_at: string;
302
+ }
303
+ interface MockBooking {
304
+ id: string;
305
+ business_id: string;
306
+ customer_id?: string;
307
+ service_id: string;
308
+ service_name: string;
309
+ start_time: string;
310
+ end_time: string;
311
+ status: "confirmed" | "cancelled" | "completed" | "rescheduled";
312
+ participant_count: number;
313
+ confirmation_code: string;
314
+ order_id?: string;
315
+ created_at: string;
316
+ updated_at: string;
317
+ }
318
+ interface MockService {
319
+ id: string;
320
+ business_id: string;
321
+ name: string;
322
+ description?: string;
323
+ duration_minutes: number;
324
+ price: string;
325
+ is_available: boolean;
326
+ }
327
+ interface MockUpload {
328
+ id: string;
329
+ business_id: string;
330
+ filename: string;
331
+ mime_type: string;
332
+ size_bytes: number;
333
+ upload_url: string;
334
+ public_url: string;
335
+ status: "pending" | "confirmed";
336
+ created_at: string;
337
+ }
338
+ interface MockConversation {
339
+ id: string;
340
+ business_id: string;
341
+ customer_id?: string;
342
+ messages: MockChatMessage[];
343
+ created_at: string;
344
+ updated_at: string;
345
+ }
346
+ interface MockChatMessage {
347
+ id: string;
348
+ conversation_id: string;
349
+ sender_type: "customer" | "agent" | "system";
350
+ content_type: "text" | "image" | "file";
351
+ content: string;
352
+ created_at: string;
353
+ }
354
+ interface MockQuote {
355
+ id: string;
356
+ business_id: string;
357
+ product_id: string;
358
+ status: "fresh" | "stale" | "expired";
359
+ total_price: string;
360
+ expires_at: string;
361
+ created_at: string;
362
+ }
363
+ interface MockFxLock {
364
+ id: string;
365
+ base_currency: string;
366
+ pay_currency: string;
367
+ rate: number;
368
+ base_amount: string;
369
+ pay_amount: string;
370
+ expires_at: string;
371
+ created_at: string;
372
+ }
373
+ interface MockActivityEvent {
374
+ id: string;
375
+ business_id: string;
376
+ session_id?: string;
377
+ event_type: string;
378
+ payload: Record<string, unknown>;
379
+ created_at: string;
380
+ }
381
+ interface MockAddOn {
382
+ id: string;
383
+ business_id: string;
384
+ name: string;
385
+ is_multiple_allowed: boolean;
386
+ is_required: boolean;
387
+ is_mutually_exclusive: boolean;
388
+ min_selections?: number;
389
+ max_selections?: number;
390
+ created_at: string;
391
+ updated_at: string;
392
+ options: MockAddOnOption[];
393
+ }
394
+ interface MockAddOnOption {
395
+ id: string;
396
+ add_on_id: string;
397
+ business_id: string;
398
+ name: string;
399
+ default_price?: string;
400
+ description?: string;
401
+ is_required: boolean;
402
+ is_mutually_exclusive: boolean;
403
+ created_at: string;
404
+ updated_at: string;
405
+ }
406
+ interface MockProductAddOnLink {
407
+ product_id: string;
408
+ add_on_id: string;
409
+ }
410
+ interface MockVariantAxis {
411
+ id: string;
412
+ business_id: string;
413
+ product_id: string;
414
+ name: string;
415
+ display_order: number;
416
+ affects_recipe: boolean;
417
+ values: MockVariantAxisValue[];
418
+ created_at: string;
419
+ updated_at: string;
420
+ }
421
+ interface MockVariantAxisValue {
422
+ id: string;
423
+ business_id: string;
424
+ axis_id: string;
425
+ name: string;
426
+ display_order: number;
427
+ color_hex?: string;
428
+ created_at: string;
429
+ updated_at: string;
430
+ }
431
+ interface MockVariant {
432
+ id: string;
433
+ product_id: string;
434
+ business_id: string;
435
+ name: string;
436
+ sku?: string;
437
+ price_adjustment: string;
438
+ component_multiplier: string;
439
+ is_default: boolean;
440
+ is_active: boolean;
441
+ axis_value_ids: string[];
442
+ created_at: string;
443
+ updated_at: string;
444
+ }
445
+ interface MockBundle {
446
+ id: string;
447
+ business_id: string;
448
+ product_id: string;
449
+ name: string;
450
+ slug: string;
451
+ description?: string;
452
+ pricing_type: "fixed" | "percentage_discount" | "fixed_discount";
453
+ bundle_price?: string;
454
+ discount_value?: string;
455
+ product_ids: string[];
456
+ created_at: string;
457
+ updated_at: string;
458
+ }
459
+ interface MockComposite {
460
+ id: string;
461
+ business_id: string;
462
+ product_id: string;
463
+ base_price: string;
464
+ pricing_mode: "additive" | "highest_per_group" | "highest_overall" | "tiered";
465
+ min_order_quantity?: number;
466
+ max_order_quantity?: number;
467
+ groups: {
468
+ id: string;
469
+ name: string;
470
+ min: number;
471
+ max: number;
472
+ component_ids: string[];
473
+ }[];
474
+ created_at: string;
475
+ updated_at: string;
476
+ }
477
+ interface MockTag {
478
+ id: string;
479
+ business_id: string;
480
+ name: string;
481
+ slug: string;
482
+ color?: string;
483
+ icon?: string;
484
+ description?: string;
485
+ tag_group?: string;
486
+ sort_order: number;
487
+ usage_count: number;
488
+ created_at: string;
489
+ updated_at: string;
490
+ }
491
+ interface MockTaxonomy {
492
+ id: string;
493
+ business_id: string;
494
+ name: string;
495
+ slug: string;
496
+ parent_id?: string;
497
+ path: string[];
498
+ attribute_template_ids: string[];
499
+ created_at: string;
500
+ updated_at: string;
501
+ }
502
+ interface MockKnowledgeArticle {
503
+ id: string;
504
+ business_id: string;
505
+ title: string;
506
+ slug: string;
507
+ content: string;
508
+ category?: string;
509
+ tags: string[];
510
+ created_at: string;
511
+ updated_at: string;
512
+ }
513
+ interface MockAttributeDef {
514
+ id: string;
515
+ business_id: string;
516
+ namespace: string;
517
+ name: string;
518
+ slug: string;
519
+ description?: string;
520
+ attribute_type: string;
521
+ options?: string[];
522
+ unit?: string;
523
+ is_required: boolean;
524
+ is_filterable: boolean;
525
+ visibility: "admin_only" | "storefront_read" | "public";
526
+ display_order: number;
527
+ applies_to: "product" | "variant" | "both" | "category" | "collection" | "all";
528
+ created_at: string;
529
+ updated_at: string;
530
+ }
531
+ interface StateRegistry {
532
+ businesses: Store<MockBusiness>;
533
+ products: Store<MockProduct>;
534
+ categories: Store<MockCategory>;
535
+ collections: Store<MockCollection>;
536
+ carts: Store<MockCart>;
537
+ orders: Store<MockOrder>;
538
+ subscriptions: Store<MockSubscription>;
539
+ bookings: Store<MockBooking>;
540
+ services: Store<MockService>;
541
+ sessions: Store<Session>;
542
+ otps: Store<OtpRequest>;
543
+ idempotency: Store<IdempotencyRecord>;
544
+ uploads: Store<MockUpload>;
545
+ conversations: Store<MockConversation>;
546
+ quotes: Store<MockQuote>;
547
+ fxLocks: Store<MockFxLock>;
548
+ activity: Store<MockActivityEvent>;
549
+ addOns: Store<MockAddOn>;
550
+ productAddOns: Store<MockProductAddOnLink>;
551
+ variantAxes: Store<MockVariantAxis>;
552
+ variants: Store<MockVariant>;
553
+ bundles: Store<MockBundle>;
554
+ composites: Store<MockComposite>;
555
+ tags: Store<MockTag>;
556
+ taxonomies: Store<MockTaxonomy>;
557
+ knowledgeArticles: Store<MockKnowledgeArticle>;
558
+ attributeDefs: Store<MockAttributeDef>;
559
+ }
560
+
561
+ interface AuthService {
562
+ resolveSession(token: string | null): Session | null;
563
+ ensureSession(token: string | null): Session;
564
+ requestOtp(contact: string): {
565
+ otp_id: string;
566
+ expires_at: string;
567
+ code_hint?: string;
568
+ };
569
+ verifyOtp(contact: string, code: string): Session;
570
+ logout(token: string): void;
571
+ updateProfile(token: string, profile: {
572
+ name?: string;
573
+ email?: string;
574
+ phone?: string;
575
+ }): Session;
576
+ status(token: string | null): {
577
+ is_authenticated: boolean;
578
+ account_id?: string;
579
+ user_type: "customer" | "guest";
580
+ session_expires_at?: number;
581
+ /** @deprecated Kept for SDK back-compat; production lens does not return this. */
582
+ session?: Session;
583
+ };
584
+ }
585
+
586
+ interface BusinessService {
587
+ primary(): MockBusiness;
588
+ byHandle(handle: string): MockBusiness;
589
+ byDomain(domain: string): MockBusiness;
590
+ settings(businessId: string): unknown;
591
+ locations(businessId: string): unknown[];
592
+ hours(businessId: string): unknown[];
593
+ }
594
+
595
+ interface CatalogueService {
596
+ snapshot(businessId: string): {
597
+ categories: unknown[];
598
+ products: unknown[];
599
+ add_ons: unknown[];
600
+ is_complete: boolean;
601
+ total_available: number;
602
+ };
603
+ listProducts(businessId: string, opts?: {
604
+ page?: number;
605
+ limit?: number;
606
+ category_id?: string;
607
+ collection_id?: string;
608
+ }): unknown;
609
+ getProduct(productId: string): unknown;
610
+ getProductVariants(productId: string): MockVariant[];
611
+ getProductVariantAxes(productId: string): MockVariantAxis[];
612
+ getProductVariantById(productId: string, variantId: string): MockVariant;
613
+ findProductVariant(productId: string, properties: Record<string, string>): MockVariant | null;
614
+ getProductAddOns(productId: string): MockAddOn[];
615
+ getProductAttributes(productId: string): MockAttributeDef[];
616
+ listCategories(businessId: string): MockCategory[];
617
+ getCategory(id: string): MockCategory;
618
+ getCategoryProducts(id: string): unknown[];
619
+ getCategoryAttributes(id: string): MockAttributeDef[];
620
+ listCollections(businessId: string): MockCollection[];
621
+ getCollection(id: string): MockCollection;
622
+ getCollectionProducts(id: string): unknown[];
623
+ getCollectionAttributes(id: string): MockAttributeDef[];
624
+ listBundles(businessId: string): MockBundle[];
625
+ getBundle(id: string): MockBundle;
626
+ listComposites(businessId: string): MockComposite[];
627
+ getComposite(id: string): MockComposite;
628
+ getCompositeByProduct(productId: string): MockComposite | null;
629
+ calculateCompositePrice(id: string, body: unknown): unknown;
630
+ listTaxonomies(businessId: string): MockTaxonomy[];
631
+ searchTaxonomies(businessId: string, q: string): MockTaxonomy[];
632
+ getTaxonomy(id: string): MockTaxonomy;
633
+ getTaxonomyAttributes(id: string): MockAttributeDef[];
634
+ getTaxonomyPath(id: string): string[];
635
+ listAttributes(businessId: string): MockAttributeDef[];
636
+ listTags(businessId: string): MockTag[];
637
+ listKnowledgeArticles(businessId: string): MockKnowledgeArticle[];
638
+ searchKnowledgeBase(businessId: string, q: string): MockKnowledgeArticle[];
639
+ listPropertyFacets(businessId: string): unknown[];
640
+ listDeals(businessId: string): unknown[];
641
+ listOnSale(businessId: string): unknown[];
642
+ validateDiscount(code: string, businessId: string): unknown;
643
+ getProductDeals(productId: string): unknown[];
644
+ getCategoryDeals(id: string): unknown[];
645
+ getCollectionDeals(id: string): unknown[];
646
+ createQuote(businessId: string, body: unknown): unknown;
647
+ getQuote(id: string): unknown;
648
+ refreshQuote(id: string): unknown;
649
+ }
650
+
651
+ interface CustomerInputValue {
652
+ field_id: string;
653
+ field_name?: string;
654
+ field_type?: string;
655
+ value: unknown;
656
+ }
657
+ interface AddItemInput {
658
+ item_id: string;
659
+ variant_id?: string;
660
+ quantity: number;
661
+ add_on_options?: string[];
662
+ bundle_selections?: BundleSelectionInput[];
663
+ composite_selections?: ComponentSelectionInput[];
664
+ scheduled_start?: string;
665
+ scheduled_end?: string;
666
+ staff_id?: string;
667
+ resource_id?: string;
668
+ special_instructions?: string;
669
+ customer_inputs?: CustomerInputValue[];
670
+ billing_plan_id?: string;
671
+ quote_id?: string;
672
+ metadata?: Record<string, unknown>;
673
+ }
674
+ interface BundleSelectionInput {
675
+ component_id: string;
676
+ variant_id?: string;
677
+ quantity: number;
678
+ scheduled_start?: string;
679
+ scheduled_end?: string;
680
+ }
681
+ interface ComponentSelectionInput {
682
+ component_id?: string;
683
+ source_product_id?: string;
684
+ source_stock_id?: string;
685
+ source_type?: "product" | "stock" | "add_on" | "standalone";
686
+ quantity?: number;
687
+ }
688
+
689
+ interface CartService {
690
+ get(session: Session): MockCart;
691
+ getItems(session: Session): MockCartItem[];
692
+ getCount(session: Session): number;
693
+ getTotal(session: Session): string;
694
+ addItem(session: Session, body: AddItemInput): unknown;
695
+ updateQuantity(session: Session, cartItemId: string, quantity: number): unknown;
696
+ removeItem(session: Session, cartItemId: string): unknown;
697
+ clear(session: Session): unknown;
698
+ applyCoupon(session: Session, code: string): unknown;
699
+ removeCoupon(session: Session): unknown;
700
+ toUICart(cart: MockCart): unknown;
701
+ resolveCart(session: Session): MockCart;
702
+ }
703
+
704
+ interface CheckoutService {
705
+ process(session: Session, body: CheckoutBody): CheckoutResult;
706
+ authorize(body: {
707
+ order_id: string;
708
+ otp?: string;
709
+ pin?: string;
710
+ }): {
711
+ status: string;
712
+ order_id: string;
713
+ };
714
+ }
715
+ interface CheckoutBody {
716
+ cart_id: string;
717
+ location_id?: string;
718
+ customer: {
719
+ name: string;
720
+ email: string;
721
+ phone: string;
722
+ notes?: string;
723
+ save_details?: boolean;
724
+ };
725
+ order_type: string;
726
+ address_info?: Record<string, unknown>;
727
+ payment_method: string;
728
+ mobile_money_details?: {
729
+ phone_number: string;
730
+ provider: string;
731
+ };
732
+ special_instructions?: string;
733
+ metadata?: Record<string, unknown>;
734
+ pay_currency?: string;
735
+ fx_quote_id?: string;
736
+ }
737
+ interface CheckoutResult {
738
+ order_id: string;
739
+ order_number: string;
740
+ payment_status: string;
741
+ payment_reference?: string;
742
+ requires_authorization: boolean;
743
+ authorization_type?: "otp" | "pin" | "phone" | "birthday" | "address";
744
+ next_action: {
745
+ type: "none";
746
+ } | {
747
+ type: "redirect";
748
+ authorization_url: string;
749
+ } | {
750
+ type: "authorization";
751
+ authorization_type: string;
752
+ display_text?: string;
753
+ };
754
+ provider?: string;
755
+ authorization_url?: string;
756
+ display_text?: string;
757
+ /** Bearer token used for guest order access (lookup `/orders/{id}?token=...`). */
758
+ bill_token?: string;
759
+ /** Stripe-style client secret for direct PaymentIntent confirmation. */
760
+ client_secret?: string;
761
+ /** Stripe publishable key (mock value in dev). */
762
+ public_key?: string;
763
+ }
764
+
765
+ interface OrderService {
766
+ list(session: Session, opts?: {
767
+ limit?: number;
768
+ status?: string;
769
+ }): {
770
+ items: MockOrder[];
771
+ pagination: unknown;
772
+ };
773
+ get(orderId: string): MockOrder;
774
+ getPaymentStatus(orderId: string): {
775
+ order_id: string;
776
+ payment_state: string;
777
+ status: string;
778
+ };
779
+ cancel(orderId: string, reason?: string): MockOrder;
780
+ updateCustomer(orderId: string, customer: {
781
+ name?: string;
782
+ email?: string;
783
+ phone?: string;
784
+ }): MockOrder;
785
+ verifyPayment(orderId: string): {
786
+ order_id: string;
787
+ payment_state: string;
788
+ status: string;
789
+ verified: boolean;
790
+ };
791
+ }
792
+
793
+ interface SubscriptionService {
794
+ list(session: Session): MockSubscription[];
795
+ get(id: string): MockSubscription;
796
+ cancel(id: string): MockSubscription;
797
+ pause(id: string): MockSubscription;
798
+ resume(id: string): MockSubscription;
799
+ skipNext(id: string): MockSubscription;
800
+ }
801
+
802
+ interface SchedulingService {
803
+ listServices(businessId: string): MockService[];
804
+ getService(id: string): MockService;
805
+ getSlots(serviceId: string, opts?: {
806
+ date?: string;
807
+ }): unknown[];
808
+ checkSlot(serviceId: string, start: string, end: string): {
809
+ is_available: boolean;
810
+ };
811
+ getServiceAvailability(serviceId: string): unknown;
812
+ getCustomerBookings(session: Session): unknown[];
813
+ getBooking(id: string): MockBooking;
814
+ cancelBooking(id: string, reason?: string): MockBooking;
815
+ rescheduleBooking(body: {
816
+ booking_id: string;
817
+ new_start_time: string;
818
+ new_end_time: string;
819
+ }): MockBooking;
820
+ }
821
+
822
+ interface InventoryService {
823
+ productStock(productId: string): {
824
+ product_id: string;
825
+ location_id?: string;
826
+ stock_level: number;
827
+ in_stock: boolean;
828
+ };
829
+ variantStock(variantId: string): {
830
+ variant_id: string;
831
+ location_id?: string;
832
+ stock_level: number;
833
+ in_stock: boolean;
834
+ };
835
+ productAvailability(productId: string, quantity?: number): {
836
+ product_id: string;
837
+ quantity: number;
838
+ is_available: boolean;
839
+ };
840
+ variantAvailability(variantId: string, quantity?: number): {
841
+ variant_id: string;
842
+ quantity: number;
843
+ is_available: boolean;
844
+ };
845
+ /**
846
+ * Reserve stock for a cart item. No-op for product types that don't track
847
+ * inventory (services, digital). Throws on insufficient stock.
848
+ */
849
+ reserve(productId: string, variantId: string | undefined, quantity: number): void;
850
+ /** Release a previously-reserved quantity (e.g. when a line is removed). */
851
+ release(productId: string, variantId: string | undefined, quantity: number): void;
852
+ }
853
+
854
+ interface FxService {
855
+ getRate(from: string, to: string): {
856
+ from: string;
857
+ to: string;
858
+ rate: number;
859
+ updated_at: string;
860
+ };
861
+ lockQuote(body: {
862
+ base_currency: string;
863
+ pay_currency: string;
864
+ base_amount: string;
865
+ }): MockFxLock;
866
+ }
867
+
868
+ interface PlacesService {
869
+ autocomplete(body: {
870
+ query: string;
871
+ country?: string;
872
+ }): {
873
+ predictions: unknown[];
874
+ };
875
+ details(body: {
876
+ place_id: string;
877
+ }): unknown;
878
+ }
879
+
880
+ interface DeliveryService {
881
+ getFee(opts: {
882
+ lat?: number;
883
+ lng?: number;
884
+ address?: string;
885
+ cart_total?: string;
886
+ }): {
887
+ fee: string;
888
+ currency: string;
889
+ estimated_minutes: number;
890
+ provider: string;
891
+ quotes: unknown[];
892
+ };
893
+ }
894
+
895
+ interface ActivityService {
896
+ recordEvents(businessId: string, sessionId: string | undefined, events: {
897
+ event_type: string;
898
+ payload?: Record<string, unknown>;
899
+ }[]): {
900
+ recorded: number;
901
+ };
902
+ getState(businessId: string, sessionId: string | undefined): unknown;
903
+ getRecommendations(businessId: string): unknown;
904
+ dismissMessage(messageId: string): {
905
+ dismissed: boolean;
906
+ message_id: string;
907
+ };
908
+ }
909
+
910
+ interface SupportService {
911
+ openConversation(businessId: string, customerId?: string): MockConversation;
912
+ sendMessage(conversationId: string, body: {
913
+ content: string;
914
+ content_type?: string;
915
+ sender_type?: "customer" | "agent";
916
+ }): MockChatMessage;
917
+ listMessages(conversationId: string, opts?: {
918
+ limit?: number;
919
+ }): MockChatMessage[];
920
+ }
921
+
922
+ interface UploadService {
923
+ init(businessId: string, body: {
924
+ filename: string;
925
+ mime_type: string;
926
+ size_bytes: number;
927
+ }): MockUpload;
928
+ confirm(body: {
929
+ upload_id: string;
930
+ }): MockUpload;
931
+ }
932
+
933
+ interface LiteService {
934
+ bootstrap(businessId: string): unknown;
935
+ getTable(tableId: string): unknown;
936
+ getMenu(businessId: string): unknown;
937
+ getMenuCategory(categoryId: string): unknown;
938
+ }
939
+
940
+ type SeedName = "default" | "empty" | "reesa-storefront" | "restaurant" | "retail" | "services" | "grocery" | "fashion";
941
+
942
+ interface MockOptions {
943
+ seed?: SeedName;
944
+ authMode?: "permissive" | "strict";
945
+ defaultOtp?: string;
946
+ rngSeed?: number;
947
+ frozenAt?: Date;
948
+ }
949
+ interface ChaosState {
950
+ failNext: {
951
+ route: string;
952
+ count: number;
953
+ status: number;
954
+ code?: string;
955
+ }[];
956
+ latencyByRoute: {
957
+ route: string;
958
+ ms: number;
959
+ }[];
960
+ webhookUrl?: string;
961
+ webhookSecret?: string;
962
+ }
963
+ interface Deps {
964
+ clock: Clock;
965
+ ids: IdGen;
966
+ bus: MockBus;
967
+ registry: StateRegistry;
968
+ auth: AuthService;
969
+ business: BusinessService;
970
+ catalogue: CatalogueService;
971
+ cart: CartService;
972
+ checkout: CheckoutService;
973
+ orders: OrderService;
974
+ subscriptions: SubscriptionService;
975
+ scheduling: SchedulingService;
976
+ inventory: InventoryService;
977
+ fx: FxService;
978
+ places: PlacesService;
979
+ delivery: DeliveryService;
980
+ activity: ActivityService;
981
+ support: SupportService;
982
+ uploads: UploadService;
983
+ lite: LiteService;
984
+ defaultBusinessId: string;
985
+ chaos: ChaosState;
986
+ resetAll: (seed?: SeedName) => string;
987
+ }
988
+
989
+ interface CreateAppOptions extends MockOptions {
990
+ /**
991
+ * CORS origins to allow. `"*"` (default) allows any origin and is
992
+ * appropriate for local dev. Pass an explicit allow-list for production
993
+ * mock deployments.
994
+ */
995
+ cors?: string[] | "*";
996
+ }
997
+ interface AppHandle {
998
+ app: Hono;
999
+ deps: Deps;
1000
+ request: (path: string, init?: RequestInit) => Promise<Response>;
1001
+ }
1002
+
1003
+ export type { AppHandle as A, CreateAppOptions as C };