@zappie/sdk 0.1.1 → 0.1.2

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 (188) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cart/errors.js +13 -0
  3. package/dist/cart/errors.js.map +7 -0
  4. package/dist/cart/index.js +768 -0
  5. package/dist/cart/index.js.map +7 -0
  6. package/dist/cart/item.js +12 -1
  7. package/dist/cart/item.js.map +7 -1
  8. package/dist/cart/preview.js +32 -0
  9. package/dist/cart/preview.js.map +7 -0
  10. package/dist/cart/price.js +25 -0
  11. package/dist/cart/price.js.map +7 -0
  12. package/dist/cart/quote-client.js +76 -0
  13. package/dist/cart/quote-client.js.map +7 -0
  14. package/dist/cart/quote-response.js +178 -0
  15. package/dist/cart/quote-response.js.map +7 -0
  16. package/dist/cart/reconcile.js +108 -0
  17. package/dist/cart/reconcile.js.map +7 -0
  18. package/dist/cart/source-menu.js +21 -0
  19. package/dist/cart/source-menu.js.map +7 -0
  20. package/dist/cart/storage.js +174 -0
  21. package/dist/cart/storage.js.map +7 -0
  22. package/dist/cart/types.js +1 -0
  23. package/dist/cart/types.js.map +7 -0
  24. package/dist/cart/validate.js +265 -0
  25. package/dist/cart/validate.js.map +7 -0
  26. package/dist/cart/wire.js +42 -0
  27. package/dist/cart/wire.js.map +7 -0
  28. package/dist/cart/working-set.js +80 -0
  29. package/dist/cart/working-set.js.map +7 -0
  30. package/dist/checkout/client.js +102 -0
  31. package/dist/checkout/client.js.map +7 -0
  32. package/dist/checkout/error.js +21 -0
  33. package/dist/checkout/error.js.map +7 -0
  34. package/dist/checkout/index.js +13 -1
  35. package/dist/checkout/index.js.map +7 -1
  36. package/dist/checkout/readiness.js +36 -0
  37. package/dist/checkout/readiness.js.map +7 -0
  38. package/dist/checkout/sdk.js +9 -0
  39. package/dist/checkout/sdk.js.map +7 -0
  40. package/dist/checkout/session.js +58 -0
  41. package/dist/checkout/session.js.map +7 -0
  42. package/dist/checkout/types.js +1 -0
  43. package/dist/checkout/types.js.map +7 -0
  44. package/dist/client.js +253 -0
  45. package/dist/client.js.map +7 -0
  46. package/dist/config/index.js +13 -1
  47. package/dist/config/index.js.map +7 -0
  48. package/dist/config.js +28 -0
  49. package/dist/config.js.map +7 -0
  50. package/dist/customer/client.js +149 -0
  51. package/dist/customer/client.js.map +7 -0
  52. package/dist/customer/error.js +20 -0
  53. package/dist/customer/error.js.map +7 -0
  54. package/dist/customer/index.js +8 -3
  55. package/dist/customer/index.js.map +7 -1
  56. package/dist/customer/navigation.js +45 -0
  57. package/dist/customer/navigation.js.map +7 -0
  58. package/dist/customer/react.js +67 -2
  59. package/dist/customer/react.js.map +7 -1
  60. package/dist/customer/request.js +37 -0
  61. package/dist/customer/request.js.map +7 -0
  62. package/dist/customer/sdk.js +6 -0
  63. package/dist/customer/sdk.js.map +7 -0
  64. package/dist/customer/types.js +1 -0
  65. package/dist/customer/types.js.map +7 -0
  66. package/dist/customer/watch-order.js +80 -0
  67. package/dist/customer/watch-order.js.map +7 -0
  68. package/dist/debug.js +78 -1
  69. package/dist/debug.js.map +7 -1
  70. package/dist/errors.js +69 -0
  71. package/dist/errors.js.map +7 -0
  72. package/dist/index.js +29 -1
  73. package/dist/index.js.map +7 -1
  74. package/dist/internal/abort.js +29 -0
  75. package/dist/internal/abort.js.map +7 -0
  76. package/dist/internal/cache.js +142 -0
  77. package/dist/internal/cache.js.map +7 -0
  78. package/dist/internal/customer-http.js +74 -0
  79. package/dist/internal/customer-http.js.map +7 -0
  80. package/dist/internal/digest.js +15 -0
  81. package/dist/internal/digest.js.map +7 -0
  82. package/dist/internal/emitter.js +27 -0
  83. package/dist/internal/emitter.js.map +7 -0
  84. package/dist/internal/money-math.js +30 -0
  85. package/dist/internal/money-math.js.map +7 -0
  86. package/dist/internal.js +9 -1
  87. package/dist/internal.js.map +7 -1
  88. package/dist/models.js +1 -0
  89. package/dist/models.js.map +7 -0
  90. package/dist/money.js +58 -0
  91. package/dist/money.js.map +7 -0
  92. package/dist/persist/catalogue.js +206 -2
  93. package/dist/persist/catalogue.js.map +7 -1
  94. package/dist/places/client.js +97 -0
  95. package/dist/places/client.js.map +7 -0
  96. package/dist/places/error.js +20 -0
  97. package/dist/places/error.js.map +7 -0
  98. package/dist/places/index.js +8 -1
  99. package/dist/places/index.js.map +7 -1
  100. package/dist/places/request.js +40 -0
  101. package/dist/places/request.js.map +7 -0
  102. package/dist/places/sdk.js +10 -0
  103. package/dist/places/sdk.js.map +7 -0
  104. package/dist/places/search.js +80 -0
  105. package/dist/places/search.js.map +7 -0
  106. package/dist/places/types.js +1 -0
  107. package/dist/places/types.js.map +7 -0
  108. package/dist/react/cart.js +30 -0
  109. package/dist/react/cart.js.map +7 -0
  110. package/dist/react/hooks.js +91 -0
  111. package/dist/react/hooks.js.map +7 -0
  112. package/dist/react/index.js +18 -1
  113. package/dist/react/index.js.map +7 -1
  114. package/dist/react/provider.js +34 -0
  115. package/dist/react/provider.js.map +7 -0
  116. package/dist/server/index.js +32 -2
  117. package/dist/server/index.js.map +7 -1
  118. package/dist/server/storefront-url/build-v1.js +75 -0
  119. package/dist/server/storefront-url/build-v1.js.map +7 -0
  120. package/dist/server/storefront-url/build-v2.js +79 -0
  121. package/dist/server/storefront-url/build-v2.js.map +7 -0
  122. package/dist/server/storefront-url/build.js +19 -0
  123. package/dist/server/storefront-url/build.js.map +7 -0
  124. package/dist/server/storefront-url/contract.js +25 -0
  125. package/dist/server/storefront-url/contract.js.map +7 -0
  126. package/dist/server/storefront-url/index.js +16 -0
  127. package/dist/server/storefront-url/index.js.map +7 -0
  128. package/dist/server/storefront-url/installation.js +58 -0
  129. package/dist/server/storefront-url/installation.js.map +7 -0
  130. package/dist/server/storefront-url/params.js +72 -0
  131. package/dist/server/storefront-url/params.js.map +7 -0
  132. package/dist/server/storefront-url/parse-v1.js +135 -0
  133. package/dist/server/storefront-url/parse-v1.js.map +7 -0
  134. package/dist/server/storefront-url/parse-v2.js +139 -0
  135. package/dist/server/storefront-url/parse-v2.js.map +7 -0
  136. package/dist/server/storefront-url/parse.js +9 -0
  137. package/dist/server/storefront-url/parse.js.map +7 -0
  138. package/dist/server/storefront-url/redirect.js +30 -0
  139. package/dist/server/storefront-url/redirect.js.map +7 -0
  140. package/dist/server/storefront-url/sign-in.js +17 -0
  141. package/dist/server/storefront-url/sign-in.js.map +7 -0
  142. package/dist/server/storefront-url/types.js +55 -0
  143. package/dist/server/storefront-url/types.js.map +7 -0
  144. package/dist/server/storefront-url/url.js +61 -0
  145. package/dist/server/storefront-url/url.js.map +7 -0
  146. package/dist/server/webhook.js +96 -0
  147. package/dist/server/webhook.js.map +7 -0
  148. package/dist/site-config/helpers.js +59 -0
  149. package/dist/site-config/helpers.js.map +7 -0
  150. package/dist/site-config/sections.js +105 -0
  151. package/dist/site-config/sections.js.map +7 -0
  152. package/dist/site-config/types.js +31 -0
  153. package/dist/site-config/types.js.map +7 -0
  154. package/dist/site-config/validate.js +165 -0
  155. package/dist/site-config/validate.js.map +7 -0
  156. package/dist/template/index.js +46 -3
  157. package/dist/template/index.js.map +7 -1
  158. package/dist/template/react.js +81 -2
  159. package/dist/template/react.js.map +7 -1
  160. package/dist/testing/index.js +451 -2
  161. package/dist/testing/index.js.map +7 -1
  162. package/dist/transport/category-page.js +21 -2
  163. package/dist/transport/category-page.js.map +7 -1
  164. package/dist/transport/mappers.js +326 -0
  165. package/dist/transport/mappers.js.map +7 -0
  166. package/dist/transport/rest.js +313 -0
  167. package/dist/transport/rest.js.map +7 -0
  168. package/dist/transport/search.js +32 -2
  169. package/dist/transport/search.js.map +7 -1
  170. package/dist/transport/selected-menu.js +79 -2
  171. package/dist/transport/selected-menu.js.map +7 -1
  172. package/dist/transport/store.js +120 -2
  173. package/dist/transport/store.js.map +7 -1
  174. package/dist/transport/types.js +1 -0
  175. package/dist/transport/types.js.map +7 -0
  176. package/dist/url/index.js +16 -2
  177. package/dist/url/index.js.map +7 -1
  178. package/dist/visits/index.js +62 -1
  179. package/dist/visits/index.js.map +7 -1
  180. package/dist/visits/page-views.js +103 -0
  181. package/dist/visits/page-views.js.map +7 -0
  182. package/package.json +3 -3
  183. package/dist/cart/quote.js +0 -1
  184. package/dist/cart/quote.js.map +0 -1
  185. package/dist/chunk-I55A5QXJ.js +0 -2
  186. package/dist/chunk-I55A5QXJ.js.map +0 -1
  187. package/dist/chunk-LFBQICYU.js +0 -2
  188. package/dist/chunk-LFBQICYU.js.map +0 -1
@@ -1,2 +1,451 @@
1
- import {m,d,b,i,j}from'../chunk-LFBQICYU.js';export{o as VERSION}from'../chunk-LFBQICYU.js';import {e,a,h}from'../chunk-I55A5QXJ.js';function W(s,_={}){let n=structuredClone(s),u=async(i$1,e)=>{i(e.signal),_.latencyMs&&await j(_.latencyMs,e.signal);let o=_.failWith?.[i$1];if(o)throw new a(o,`Mock ${i$1} failure`)},m$1=i=>{let e=n.menus[i];if(!e)throw new a("branch_not_found","No fixture for this branch");return structuredClone(e)},w={async quote(i,e$1){await u("quote",i);let o=m$1(e$1.branch_id),S=n.store.branches.find(t=>t.id===e$1.branch_id),p=[],g=e$1.lines.map(t=>{let l=o.items[t.item_id],b$1={itemId:t.item_id,...t.menu_id!==void 0?{menuId:t.menu_id}:{},quantity:t.quantity,choices:t.options.map(a=>({groupId:a.group_id,choiceId:a.choice_id,quantity:a.quantity})),inputs:t.inputs,...t.variant_id?{variantId:t.variant_id}:{}},y=d(l,b$1,{menu:o,branch:S});p.push(...y.map(a=>({code:a.code,severity:a.severity,message:a.message,line_id:t.line_id,...a.groupId?{group_id:a.groupId}:{},fixes:[]})));let d$1=l&&!y.length?b(l,b$1):e(0,n.store.currency);return {line_id:t.line_id,unit_price:{amount_minor:d$1.amountMinor,currency:d$1.currency},line_total:{amount_minor:h(d$1,t.quantity).amountMinor,currency:d$1.currency}}}),h$1={amount_minor:g.reduce((t,l)=>t+l.line_total.amount_minor,0),currency:n.store.currency};return {branch_id:e$1.branch_id,lines:g,subtotal:h$1,total:h$1,charges:[],discounts:[],issues:p,can_checkout:!p.some(t=>t.severity==="blocking"),checkout:p.some(t=>t.severity==="blocking")?{ready:false,reason:"issues"}:{ready:true},menu_version:o.version,expires_at:new Date(Date.now()+3e5).toISOString()}},async getStore(i){return await u("getStore",i),structuredClone(n.store)},async getMenu(i){await u("getMenu",i);let e=m$1(i.branchId);return i.ifNoneMatch===e.version?{notModified:true}:{menu:e,etag:e.version}},async getMenuVersion(i){await u("getMenuVersion",i);let e=m$1(i.branchId);return {version:e.version,availabilityHash:e.version}},async getItem(i){await u("getItem",i);let e=m$1(i.branchId).items[i.itemId];if(!e)throw new a("item_not_found","Item not found");return e}};return m({store:n.store.slug,key:"pk_test_fixture",transport:w})}var q={pickup:true,delivery:true,dineIn:false,scheduling:false},N={id:"biz_fixture",slug:"default-store",name:"Default storefront",currency:"NGN",timezone:"Africa/Lagos",brand:{},fulfilment:q,paymentMethods:["card"],branches:[{id:"br_fixture",slug:"main",name:"Main",openingTimes:[{day:1,opens:"08:00",closes:"22:00"}],isOpen:true,fulfilment:q}]},C={id:"menu_fixture",branchId:"br_fixture",name:"Menu",version:"fixture-v1",categories:[{id:"cat_fixture",name:"Food",itemIds:["item_fixture"]}],items:{item_fixture:{id:"item_fixture",name:"Lunch",images:[],price:e(65e4,"NGN"),isAvailable:true,quantity:{min:1,step:1},variants:[{id:"variant_fixture",attributeChoices:{},price:e(65e4,"NGN"),isAvailable:true}],optionGroups:[],tags:[]}}},r=s=>e(s,"NGN"),T={id:"biz_template",slug:"default-template",name:"Default template",description:"A public storefront fixture for template authors.",templateSettings:{accent:"#175c3a",headerPhoto:"https://example.com/default-template-cover.png"},currency:"NGN",timezone:"Africa/Lagos",brand:{logoUrl:"https://example.com/default-template-logo.png",coverImageUrl:"https://example.com/default-template-cover.png"},fulfilment:{pickup:true,delivery:true,dineIn:true,scheduling:true},paymentMethods:["card","bank_transfer","wallet"],branches:[{id:"br_template_main",slug:"main",name:"Main",timezone:"Africa/Lagos",address:"1 Example Street, Lagos",phone:"+234 800 000 0000",pickupAddress:{placeId:"place_template_main",coordinates:{lat:6.5244,lng:3.3792}},socialLinks:[{type:"INSTAGRAM",url:"https://instagram.com/default-template"},{type:"WEBSITE",url:"https://example.com"}],openingTimes:[1,2,3,4,5].map(s=>({day:s,opens:"08:00",closes:"22:00"})),isOpen:true,isDefault:true,fulfilment:{pickup:true,delivery:true,dineIn:true,scheduling:true},minimumOrder:r(2e5)},{id:"br_template_island",slug:"island",name:"Island",timezone:"Africa/Lagos",openingTimes:[{day:6,opens:"10:00",closes:"18:00"}],specialHours:[{date:"2026-12-25",closed:true}],isOpen:false,closedUntil:"2026-12-26T10:00:00+01:00",fulfilment:{pickup:false,delivery:true,dineIn:false,scheduling:false}}]},G={id:"menu_template",branchId:"br_template_main",name:"All day",version:"template-v1",categories:[{id:"cat_popular",name:"Popular",itemIds:["item_jollof","item_zobo"]},{id:"cat_mains",name:"Mains",itemIds:["item_jollof"]},{id:"cat_drinks",name:"Drinks and desserts",itemIds:["item_zobo","item_cake"]}],items:{item_jollof:{id:"item_jollof",name:"Jollof rice",description:"Smoky party jollof.",images:[],price:r(45e4),isAvailable:true,quantity:{min:1,max:10,step:1},variants:[{id:"variant_jollof",attributeChoices:{},price:r(45e4),isAvailable:true}],optionGroups:[{id:"grp_protein",name:"Protein",kind:"select",required:true,selection:{min:1,max:1},isAttribute:false,choices:[{id:"opt_chicken",name:"Chicken",price:r(0),isAvailable:true},{id:"opt_beef",name:"Beef",price:r(5e4),isAvailable:true},{id:"opt_fish",name:"Fish",price:r(8e4),isAvailable:false}]},{id:"grp_sauce",name:"Sauce",helpText:"Required with chicken.",kind:"select",required:false,selection:{min:0,max:1},isAttribute:false,choices:[{id:"opt_pepper",name:"Pepper sauce",price:r(0),isAvailable:true},{id:"opt_stew",name:"Stew",price:r(2e4),isAvailable:true}],conditions:[{groupId:"grp_protein",choiceIds:["opt_chicken"],match:"any",setRequired:true,setMin:1}]},{id:"grp_extras",name:"Extras",kind:"select",required:false,selection:{min:0,max:3},isAttribute:false,choices:[{id:"opt_plantain",name:"Plantain",price:r(3e4),isAvailable:true,quantity:{min:1,max:3}},{id:"opt_egg",name:"Boiled egg",price:r(15e3),isAvailable:true}]},{id:"grp_note",name:"Note for the kitchen",kind:"text",required:false,selection:{min:0},isAttribute:false,choices:[],input:{maxLength:140,placeholder:"No onions, please"}}],tags:["popular"]},item_zobo:{id:"item_zobo",name:"Zobo",images:[],price:r(12e4),isAvailable:true,quantity:{min:1,step:1},variants:[{id:"variant_zobo_small",attributeChoices:{grp_size:"opt_small"},price:r(12e4),isAvailable:true},{id:"variant_zobo_large",attributeChoices:{grp_size:"opt_large"},price:r(2e5),isAvailable:false}],optionGroups:[{id:"grp_size",name:"Size",kind:"select",required:true,selection:{min:1,max:1},isAttribute:true,choices:[{id:"opt_small",name:"Small",price:r(0),isAvailable:true},{id:"opt_large",name:"Large",price:r(0),isAvailable:false}]}],tags:[]},item_cake:{id:"item_cake",name:"Chocolate cake",images:[],price:r(35e4),compareAtPrice:r(4e5),isAvailable:false,quantity:{min:1,step:1},variants:[{id:"variant_cake",attributeChoices:{},price:r(35e4),isAvailable:false}],optionGroups:[],tags:[]}}},Z={minimal:{store:N,menu:C},defaultTemplate:{store:T,menu:G}};
2
- export{W as createMockZappie,Z as fixtures};//# sourceMappingURL=index.js.map
1
+ // src/testing/index.ts
2
+ import { estimateUnitPrice } from "../cart/price.js";
3
+ import { validateLine } from "../cart/validate.js";
4
+ import { createZappie } from "../client.js";
5
+ import { ZappieError } from "../errors.js";
6
+ import { delay, throwIfAborted } from "../internal/abort.js";
7
+ import { multiplyMoney } from "../internal/money-math.js";
8
+ import { money } from "../money.js";
9
+ import { VERSION } from "../index.js";
10
+ function createMockZappie(input, opts = {}) {
11
+ const fixtures2 = structuredClone(input);
12
+ const before = async (method, ctx) => {
13
+ throwIfAborted(ctx.signal);
14
+ if (opts.latencyMs) {
15
+ await delay(opts.latencyMs, ctx.signal);
16
+ }
17
+ const code = opts.failWith?.[method];
18
+ if (code) {
19
+ throw new ZappieError(code, `Mock ${method} failure`);
20
+ }
21
+ };
22
+ const menu2 = (id) => {
23
+ const value = fixtures2.menus[id];
24
+ if (!value) {
25
+ throw new ZappieError("branch_not_found", "No fixture for this branch");
26
+ }
27
+ return structuredClone(value);
28
+ };
29
+ const transport = {
30
+ async quote(ctx, body) {
31
+ await before("quote", ctx);
32
+ const value = menu2(body.branch_id);
33
+ const branch = fixtures2.store.branches.find(
34
+ (b) => b.id === body.branch_id
35
+ );
36
+ const issues = [];
37
+ const lines = body.lines.map((line) => {
38
+ const item = value.items[line.item_id];
39
+ const input2 = {
40
+ itemId: line.item_id,
41
+ ...line.menu_id !== void 0 ? { menuId: line.menu_id } : {},
42
+ quantity: line.quantity,
43
+ choices: line.options.map((c) => ({
44
+ groupId: c.group_id,
45
+ choiceId: c.choice_id,
46
+ quantity: c.quantity
47
+ })),
48
+ inputs: line.inputs,
49
+ ...line.variant_id ? { variantId: line.variant_id } : {}
50
+ };
51
+ const invalid = validateLine(item, input2, { menu: value, branch });
52
+ issues.push(
53
+ ...invalid.map((i) => ({
54
+ code: i.code,
55
+ severity: i.severity,
56
+ message: i.message,
57
+ line_id: line.line_id,
58
+ ...i.groupId ? { group_id: i.groupId } : {},
59
+ fixes: []
60
+ }))
61
+ );
62
+ const price = item && !invalid.length ? estimateUnitPrice(item, input2) : money(0, fixtures2.store.currency);
63
+ return {
64
+ line_id: line.line_id,
65
+ unit_price: {
66
+ amount_minor: price.amountMinor,
67
+ currency: price.currency
68
+ },
69
+ line_total: {
70
+ amount_minor: multiplyMoney(price, line.quantity).amountMinor,
71
+ currency: price.currency
72
+ }
73
+ };
74
+ });
75
+ const subtotal = {
76
+ amount_minor: lines.reduce((n, l) => n + l.line_total.amount_minor, 0),
77
+ currency: fixtures2.store.currency
78
+ };
79
+ return {
80
+ branch_id: body.branch_id,
81
+ lines,
82
+ subtotal,
83
+ total: subtotal,
84
+ charges: [],
85
+ discounts: [],
86
+ issues,
87
+ can_checkout: !issues.some((issue) => issue.severity === "blocking"),
88
+ checkout: issues.some((issue) => issue.severity === "blocking") ? { ready: false, reason: "issues" } : { ready: true },
89
+ menu_version: value.version,
90
+ expires_at: new Date(Date.now() + 3e5).toISOString()
91
+ };
92
+ },
93
+ async getStore(ctx) {
94
+ await before("getStore", ctx);
95
+ return structuredClone(fixtures2.store);
96
+ },
97
+ async getMenu(ctx) {
98
+ await before("getMenu", ctx);
99
+ const value = menu2(ctx.branchId);
100
+ return ctx.ifNoneMatch === value.version ? { notModified: true } : { menu: value, etag: value.version };
101
+ },
102
+ async getMenuVersion(ctx) {
103
+ await before("getMenuVersion", ctx);
104
+ const value = menu2(ctx.branchId);
105
+ return { version: value.version, availabilityHash: value.version };
106
+ },
107
+ async getItem(ctx) {
108
+ await before("getItem", ctx);
109
+ const value = menu2(ctx.branchId).items[ctx.itemId];
110
+ if (!value) {
111
+ throw new ZappieError("item_not_found", "Item not found");
112
+ }
113
+ return value;
114
+ }
115
+ };
116
+ return createZappie({
117
+ store: fixtures2.store.slug,
118
+ key: "pk_test_fixture",
119
+ transport
120
+ });
121
+ }
122
+ var fulfilment = {
123
+ pickup: true,
124
+ delivery: true,
125
+ dineIn: false,
126
+ scheduling: false
127
+ };
128
+ var store = {
129
+ id: "biz_fixture",
130
+ slug: "default-store",
131
+ name: "Default storefront",
132
+ currency: "NGN",
133
+ timezone: "Africa/Lagos",
134
+ brand: {},
135
+ fulfilment,
136
+ paymentMethods: ["card"],
137
+ branches: [
138
+ {
139
+ id: "br_fixture",
140
+ slug: "main",
141
+ name: "Main",
142
+ openingTimes: [{ day: 1, opens: "08:00", closes: "22:00" }],
143
+ isOpen: true,
144
+ fulfilment
145
+ }
146
+ ]
147
+ };
148
+ var menu = {
149
+ id: "menu_fixture",
150
+ branchId: "br_fixture",
151
+ name: "Menu",
152
+ version: "fixture-v1",
153
+ categories: [{ id: "cat_fixture", name: "Food", itemIds: ["item_fixture"] }],
154
+ items: {
155
+ item_fixture: {
156
+ id: "item_fixture",
157
+ name: "Lunch",
158
+ images: [],
159
+ price: money(65e4, "NGN"),
160
+ isAvailable: true,
161
+ quantity: { min: 1, step: 1 },
162
+ variants: [
163
+ {
164
+ id: "variant_fixture",
165
+ attributeChoices: {},
166
+ price: money(65e4, "NGN"),
167
+ isAvailable: true
168
+ }
169
+ ],
170
+ optionGroups: [],
171
+ tags: []
172
+ }
173
+ }
174
+ };
175
+ var ngn = (amountMinor) => money(amountMinor, "NGN");
176
+ var templateStore = {
177
+ id: "biz_template",
178
+ slug: "default-template",
179
+ name: "Default template",
180
+ description: "A public storefront fixture for template authors.",
181
+ templateSettings: {
182
+ accent: "#175c3a",
183
+ headerPhoto: "https://example.com/default-template-cover.png"
184
+ },
185
+ currency: "NGN",
186
+ timezone: "Africa/Lagos",
187
+ brand: {
188
+ logoUrl: "https://example.com/default-template-logo.png",
189
+ coverImageUrl: "https://example.com/default-template-cover.png"
190
+ },
191
+ fulfilment: { pickup: true, delivery: true, dineIn: true, scheduling: true },
192
+ paymentMethods: ["card", "bank_transfer", "wallet"],
193
+ branches: [
194
+ {
195
+ id: "br_template_main",
196
+ slug: "main",
197
+ name: "Main",
198
+ timezone: "Africa/Lagos",
199
+ address: "1 Example Street, Lagos",
200
+ phone: "+234 800 000 0000",
201
+ pickupAddress: {
202
+ placeId: "place_template_main",
203
+ coordinates: { lat: 6.5244, lng: 3.3792 }
204
+ },
205
+ socialLinks: [
206
+ { type: "INSTAGRAM", url: "https://instagram.com/default-template" },
207
+ { type: "WEBSITE", url: "https://example.com" }
208
+ ],
209
+ openingTimes: [1, 2, 3, 4, 5].map((day) => ({
210
+ day,
211
+ opens: "08:00",
212
+ closes: "22:00"
213
+ })),
214
+ isOpen: true,
215
+ isDefault: true,
216
+ fulfilment: {
217
+ pickup: true,
218
+ delivery: true,
219
+ dineIn: true,
220
+ scheduling: true
221
+ },
222
+ minimumOrder: ngn(2e5)
223
+ },
224
+ {
225
+ id: "br_template_island",
226
+ slug: "island",
227
+ name: "Island",
228
+ timezone: "Africa/Lagos",
229
+ openingTimes: [{ day: 6, opens: "10:00", closes: "18:00" }],
230
+ specialHours: [{ date: "2026-12-25", closed: true }],
231
+ isOpen: false,
232
+ closedUntil: "2026-12-26T10:00:00+01:00",
233
+ fulfilment: {
234
+ pickup: false,
235
+ delivery: true,
236
+ dineIn: false,
237
+ scheduling: false
238
+ }
239
+ }
240
+ ]
241
+ };
242
+ var templateMenu = {
243
+ id: "menu_template",
244
+ branchId: "br_template_main",
245
+ name: "All day",
246
+ version: "template-v1",
247
+ categories: [
248
+ {
249
+ id: "cat_popular",
250
+ name: "Popular",
251
+ itemIds: ["item_jollof", "item_zobo"]
252
+ },
253
+ { id: "cat_mains", name: "Mains", itemIds: ["item_jollof"] },
254
+ {
255
+ id: "cat_drinks",
256
+ name: "Drinks and desserts",
257
+ itemIds: ["item_zobo", "item_cake"]
258
+ }
259
+ ],
260
+ items: {
261
+ item_jollof: {
262
+ id: "item_jollof",
263
+ name: "Jollof rice",
264
+ description: "Smoky party jollof.",
265
+ images: [],
266
+ price: ngn(45e4),
267
+ isAvailable: true,
268
+ quantity: { min: 1, max: 10, step: 1 },
269
+ variants: [
270
+ {
271
+ id: "variant_jollof",
272
+ attributeChoices: {},
273
+ price: ngn(45e4),
274
+ isAvailable: true
275
+ }
276
+ ],
277
+ optionGroups: [
278
+ {
279
+ id: "grp_protein",
280
+ name: "Protein",
281
+ kind: "select",
282
+ required: true,
283
+ selection: { min: 1, max: 1 },
284
+ isAttribute: false,
285
+ choices: [
286
+ {
287
+ id: "opt_chicken",
288
+ name: "Chicken",
289
+ price: ngn(0),
290
+ isAvailable: true
291
+ },
292
+ {
293
+ id: "opt_beef",
294
+ name: "Beef",
295
+ price: ngn(5e4),
296
+ isAvailable: true
297
+ },
298
+ {
299
+ id: "opt_fish",
300
+ name: "Fish",
301
+ price: ngn(8e4),
302
+ isAvailable: false
303
+ }
304
+ ]
305
+ },
306
+ {
307
+ id: "grp_sauce",
308
+ name: "Sauce",
309
+ helpText: "Required with chicken.",
310
+ kind: "select",
311
+ required: false,
312
+ selection: { min: 0, max: 1 },
313
+ isAttribute: false,
314
+ choices: [
315
+ {
316
+ id: "opt_pepper",
317
+ name: "Pepper sauce",
318
+ price: ngn(0),
319
+ isAvailable: true
320
+ },
321
+ {
322
+ id: "opt_stew",
323
+ name: "Stew",
324
+ price: ngn(2e4),
325
+ isAvailable: true
326
+ }
327
+ ],
328
+ conditions: [
329
+ {
330
+ groupId: "grp_protein",
331
+ choiceIds: ["opt_chicken"],
332
+ match: "any",
333
+ setRequired: true,
334
+ setMin: 1
335
+ }
336
+ ]
337
+ },
338
+ {
339
+ id: "grp_extras",
340
+ name: "Extras",
341
+ kind: "select",
342
+ required: false,
343
+ selection: { min: 0, max: 3 },
344
+ isAttribute: false,
345
+ choices: [
346
+ {
347
+ id: "opt_plantain",
348
+ name: "Plantain",
349
+ price: ngn(3e4),
350
+ isAvailable: true,
351
+ quantity: { min: 1, max: 3 }
352
+ },
353
+ {
354
+ id: "opt_egg",
355
+ name: "Boiled egg",
356
+ price: ngn(15e3),
357
+ isAvailable: true
358
+ }
359
+ ]
360
+ },
361
+ {
362
+ id: "grp_note",
363
+ name: "Note for the kitchen",
364
+ kind: "text",
365
+ required: false,
366
+ selection: { min: 0 },
367
+ isAttribute: false,
368
+ choices: [],
369
+ input: { maxLength: 140, placeholder: "No onions, please" }
370
+ }
371
+ ],
372
+ tags: ["popular"]
373
+ },
374
+ item_zobo: {
375
+ id: "item_zobo",
376
+ name: "Zobo",
377
+ images: [],
378
+ price: ngn(12e4),
379
+ isAvailable: true,
380
+ quantity: { min: 1, step: 1 },
381
+ variants: [
382
+ {
383
+ id: "variant_zobo_small",
384
+ attributeChoices: { grp_size: "opt_small" },
385
+ price: ngn(12e4),
386
+ isAvailable: true
387
+ },
388
+ {
389
+ id: "variant_zobo_large",
390
+ attributeChoices: { grp_size: "opt_large" },
391
+ price: ngn(2e5),
392
+ isAvailable: false
393
+ }
394
+ ],
395
+ optionGroups: [
396
+ {
397
+ id: "grp_size",
398
+ name: "Size",
399
+ kind: "select",
400
+ required: true,
401
+ selection: { min: 1, max: 1 },
402
+ isAttribute: true,
403
+ choices: [
404
+ {
405
+ id: "opt_small",
406
+ name: "Small",
407
+ price: ngn(0),
408
+ isAvailable: true
409
+ },
410
+ {
411
+ id: "opt_large",
412
+ name: "Large",
413
+ price: ngn(0),
414
+ isAvailable: false
415
+ }
416
+ ]
417
+ }
418
+ ],
419
+ tags: []
420
+ },
421
+ item_cake: {
422
+ id: "item_cake",
423
+ name: "Chocolate cake",
424
+ images: [],
425
+ price: ngn(35e4),
426
+ compareAtPrice: ngn(4e5),
427
+ isAvailable: false,
428
+ quantity: { min: 1, step: 1 },
429
+ variants: [
430
+ {
431
+ id: "variant_cake",
432
+ attributeChoices: {},
433
+ price: ngn(35e4),
434
+ isAvailable: false
435
+ }
436
+ ],
437
+ optionGroups: [],
438
+ tags: []
439
+ }
440
+ }
441
+ };
442
+ var fixtures = {
443
+ minimal: { store, menu },
444
+ defaultTemplate: { store: templateStore, menu: templateMenu }
445
+ };
446
+ export {
447
+ VERSION,
448
+ createMockZappie,
449
+ fixtures
450
+ };
451
+ //# sourceMappingURL=index.js.map
@@ -1 +1,7 @@
1
- {"version":3,"sources":["../../src/testing/index.ts"],"names":["createMockZappie","input","opts","fixtures","before","method","ctx","throwIfAborted","delay","code","ZappieError","menu","id","value","transport","body","branch","b","issues","lines","line","item","c","invalid","validateLine","i","price","estimateUnitPrice","money","multiplyMoney","subtotal","n","issue","createZappie","fulfilment","store","ngn","amountMinor","templateStore","day","templateMenu"],"mappings":"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","file":"index.js","sourcesContent":["import { estimateUnitPrice } from \"../cart/price\";\nimport type { WireQuote } from \"../cart/types\";\nimport { validateLine } from \"../cart/validate\";\nimport { createZappie } from \"../client\";\nimport type { ZappieErrorCode } from \"../errors\";\nimport { ZappieError } from \"../errors\";\nimport { delay, throwIfAborted } from \"../internal/abort\";\nimport { multiplyMoney } from \"../internal/money-math\";\nimport type { Menu, Store } from \"../models\";\nimport { money } from \"../money\";\nimport type { RequestCtx, Transport } from \"../transport/types\";\nexport { VERSION } from \"../index\";\n/** Store and branch menus supplied to the deterministic mock transport. */\nexport type MockFixtures = { store: Store; menus: Record<string, Menu> };\n/** Mock timing and per-operation failures. */\nexport type MockOptions = {\n latencyMs?: number;\n failWith?: Partial<Record<keyof Transport, ZappieErrorCode>>;\n};\n/** Create an isolated in-memory SDK client without making network requests. */\nexport function createMockZappie(input: MockFixtures, opts: MockOptions = {}) {\n const fixtures = structuredClone(input);\n const before = async (method: keyof Transport, ctx: RequestCtx) => {\n throwIfAborted(ctx.signal);\n if (opts.latencyMs) {\n await delay(opts.latencyMs, ctx.signal);\n }\n const code = opts.failWith?.[method];\n if (code) {\n throw new ZappieError(code, `Mock ${method} failure`);\n }\n };\n const menu = (id: string) => {\n const value = fixtures.menus[id];\n if (!value) {\n throw new ZappieError(\"branch_not_found\", \"No fixture for this branch\");\n }\n return structuredClone(value);\n };\n const transport: Transport = {\n async quote(ctx, body): Promise<WireQuote> {\n await before(\"quote\", ctx);\n const value = menu(body.branch_id);\n const branch = fixtures.store.branches.find(\n (b) => b.id === body.branch_id,\n )!;\n const issues: WireQuote[\"issues\"] = [];\n const lines = body.lines.map((line) => {\n const item = value.items[line.item_id];\n const input = {\n itemId: line.item_id,\n ...(line.menu_id !== undefined ? { menuId: line.menu_id } : {}),\n quantity: line.quantity,\n choices: line.options.map((c) => ({\n groupId: c.group_id,\n choiceId: c.choice_id,\n quantity: c.quantity,\n })),\n inputs: line.inputs,\n ...(line.variant_id ? { variantId: line.variant_id } : {}),\n };\n const invalid = validateLine(item, input, { menu: value, branch });\n issues.push(\n ...invalid.map((i) => ({\n code: i.code,\n severity: i.severity,\n message: i.message,\n line_id: line.line_id,\n ...(i.groupId ? { group_id: i.groupId } : {}),\n fixes: [],\n })),\n );\n const price =\n item && !invalid.length\n ? estimateUnitPrice(item, input)\n : money(0, fixtures.store.currency);\n return {\n line_id: line.line_id,\n unit_price: {\n amount_minor: price.amountMinor,\n currency: price.currency,\n },\n line_total: {\n amount_minor: multiplyMoney(price, line.quantity).amountMinor,\n currency: price.currency,\n },\n };\n });\n const subtotal = {\n amount_minor: lines.reduce((n, l) => n + l.line_total.amount_minor, 0),\n currency: fixtures.store.currency,\n };\n return {\n branch_id: body.branch_id,\n lines,\n subtotal,\n total: subtotal,\n charges: [],\n discounts: [],\n issues,\n can_checkout: !issues.some((issue) => issue.severity === \"blocking\"),\n checkout: issues.some((issue) => issue.severity === \"blocking\")\n ? { ready: false, reason: \"issues\" }\n : { ready: true },\n menu_version: value.version,\n expires_at: new Date(Date.now() + 300_000).toISOString(),\n };\n },\n async getStore(ctx) {\n await before(\"getStore\", ctx);\n return structuredClone(fixtures.store);\n },\n async getMenu(ctx) {\n await before(\"getMenu\", ctx);\n const value = menu(ctx.branchId);\n return ctx.ifNoneMatch === value.version\n ? { notModified: true }\n : { menu: value, etag: value.version };\n },\n async getMenuVersion(ctx) {\n await before(\"getMenuVersion\", ctx);\n const value = menu(ctx.branchId);\n return { version: value.version, availabilityHash: value.version };\n },\n async getItem(ctx) {\n await before(\"getItem\", ctx);\n const value = menu(ctx.branchId).items[ctx.itemId];\n if (!value) {\n throw new ZappieError(\"item_not_found\", \"Item not found\");\n }\n return value;\n },\n };\n return createZappie({\n store: fixtures.store.slug,\n key: \"pk_test_fixture\",\n transport,\n });\n}\nconst fulfilment = {\n pickup: true,\n delivery: true,\n dineIn: false,\n scheduling: false,\n};\nconst store: Store = {\n id: \"biz_fixture\",\n slug: \"default-store\",\n name: \"Default storefront\",\n currency: \"NGN\",\n timezone: \"Africa/Lagos\",\n brand: {},\n fulfilment,\n paymentMethods: [\"card\"],\n branches: [\n {\n id: \"br_fixture\",\n slug: \"main\",\n name: \"Main\",\n openingTimes: [{ day: 1, opens: \"08:00\", closes: \"22:00\" }],\n isOpen: true,\n fulfilment,\n },\n ],\n};\nconst menu: Menu = {\n id: \"menu_fixture\",\n branchId: \"br_fixture\",\n name: \"Menu\",\n version: \"fixture-v1\",\n categories: [{ id: \"cat_fixture\", name: \"Food\", itemIds: [\"item_fixture\"] }],\n items: {\n item_fixture: {\n id: \"item_fixture\",\n name: \"Lunch\",\n images: [],\n price: money(650000, \"NGN\"),\n isAvailable: true,\n quantity: { min: 1, step: 1 },\n variants: [\n {\n id: \"variant_fixture\",\n attributeChoices: {},\n price: money(650000, \"NGN\"),\n isAvailable: true,\n },\n ],\n optionGroups: [],\n tags: [],\n },\n },\n};\nconst ngn = (amountMinor: number) => money(amountMinor, \"NGN\");\nconst templateStore: Store = {\n id: \"biz_template\",\n slug: \"default-template\",\n name: \"Default template\",\n description: \"A public storefront fixture for template authors.\",\n templateSettings: {\n accent: \"#175c3a\",\n headerPhoto: \"https://example.com/default-template-cover.png\",\n },\n currency: \"NGN\",\n timezone: \"Africa/Lagos\",\n brand: {\n logoUrl: \"https://example.com/default-template-logo.png\",\n coverImageUrl: \"https://example.com/default-template-cover.png\",\n },\n fulfilment: { pickup: true, delivery: true, dineIn: true, scheduling: true },\n paymentMethods: [\"card\", \"bank_transfer\", \"wallet\"],\n branches: [\n {\n id: \"br_template_main\",\n slug: \"main\",\n name: \"Main\",\n timezone: \"Africa/Lagos\",\n address: \"1 Example Street, Lagos\",\n phone: \"+234 800 000 0000\",\n pickupAddress: {\n placeId: \"place_template_main\",\n coordinates: { lat: 6.5244, lng: 3.3792 },\n },\n socialLinks: [\n { type: \"INSTAGRAM\", url: \"https://instagram.com/default-template\" },\n { type: \"WEBSITE\", url: \"https://example.com\" },\n ],\n openingTimes: [1, 2, 3, 4, 5].map((day) => ({\n day: day as 1 | 2 | 3 | 4 | 5,\n opens: \"08:00\",\n closes: \"22:00\",\n })),\n isOpen: true,\n isDefault: true,\n fulfilment: {\n pickup: true,\n delivery: true,\n dineIn: true,\n scheduling: true,\n },\n minimumOrder: ngn(200000),\n },\n {\n id: \"br_template_island\",\n slug: \"island\",\n name: \"Island\",\n timezone: \"Africa/Lagos\",\n openingTimes: [{ day: 6, opens: \"10:00\", closes: \"18:00\" }],\n specialHours: [{ date: \"2026-12-25\", closed: true }],\n isOpen: false,\n closedUntil: \"2026-12-26T10:00:00+01:00\",\n fulfilment: {\n pickup: false,\n delivery: true,\n dineIn: false,\n scheduling: false,\n },\n },\n ],\n};\nconst templateMenu: Menu = {\n id: \"menu_template\",\n branchId: \"br_template_main\",\n name: \"All day\",\n version: \"template-v1\",\n categories: [\n {\n id: \"cat_popular\",\n name: \"Popular\",\n itemIds: [\"item_jollof\", \"item_zobo\"],\n },\n { id: \"cat_mains\", name: \"Mains\", itemIds: [\"item_jollof\"] },\n {\n id: \"cat_drinks\",\n name: \"Drinks and desserts\",\n itemIds: [\"item_zobo\", \"item_cake\"],\n },\n ],\n items: {\n item_jollof: {\n id: \"item_jollof\",\n name: \"Jollof rice\",\n description: \"Smoky party jollof.\",\n images: [],\n price: ngn(450000),\n isAvailable: true,\n quantity: { min: 1, max: 10, step: 1 },\n variants: [\n {\n id: \"variant_jollof\",\n attributeChoices: {},\n price: ngn(450000),\n isAvailable: true,\n },\n ],\n optionGroups: [\n {\n id: \"grp_protein\",\n name: \"Protein\",\n kind: \"select\",\n required: true,\n selection: { min: 1, max: 1 },\n isAttribute: false,\n choices: [\n {\n id: \"opt_chicken\",\n name: \"Chicken\",\n price: ngn(0),\n isAvailable: true,\n },\n {\n id: \"opt_beef\",\n name: \"Beef\",\n price: ngn(50000),\n isAvailable: true,\n },\n {\n id: \"opt_fish\",\n name: \"Fish\",\n price: ngn(80000),\n isAvailable: false,\n },\n ],\n },\n {\n id: \"grp_sauce\",\n name: \"Sauce\",\n helpText: \"Required with chicken.\",\n kind: \"select\",\n required: false,\n selection: { min: 0, max: 1 },\n isAttribute: false,\n choices: [\n {\n id: \"opt_pepper\",\n name: \"Pepper sauce\",\n price: ngn(0),\n isAvailable: true,\n },\n {\n id: \"opt_stew\",\n name: \"Stew\",\n price: ngn(20000),\n isAvailable: true,\n },\n ],\n conditions: [\n {\n groupId: \"grp_protein\",\n choiceIds: [\"opt_chicken\"],\n match: \"any\",\n setRequired: true,\n setMin: 1,\n },\n ],\n },\n {\n id: \"grp_extras\",\n name: \"Extras\",\n kind: \"select\",\n required: false,\n selection: { min: 0, max: 3 },\n isAttribute: false,\n choices: [\n {\n id: \"opt_plantain\",\n name: \"Plantain\",\n price: ngn(30000),\n isAvailable: true,\n quantity: { min: 1, max: 3 },\n },\n {\n id: \"opt_egg\",\n name: \"Boiled egg\",\n price: ngn(15000),\n isAvailable: true,\n },\n ],\n },\n {\n id: \"grp_note\",\n name: \"Note for the kitchen\",\n kind: \"text\",\n required: false,\n selection: { min: 0 },\n isAttribute: false,\n choices: [],\n input: { maxLength: 140, placeholder: \"No onions, please\" },\n },\n ],\n tags: [\"popular\"],\n },\n item_zobo: {\n id: \"item_zobo\",\n name: \"Zobo\",\n images: [],\n price: ngn(120000),\n isAvailable: true,\n quantity: { min: 1, step: 1 },\n variants: [\n {\n id: \"variant_zobo_small\",\n attributeChoices: { grp_size: \"opt_small\" },\n price: ngn(120000),\n isAvailable: true,\n },\n {\n id: \"variant_zobo_large\",\n attributeChoices: { grp_size: \"opt_large\" },\n price: ngn(200000),\n isAvailable: false,\n },\n ],\n optionGroups: [\n {\n id: \"grp_size\",\n name: \"Size\",\n kind: \"select\",\n required: true,\n selection: { min: 1, max: 1 },\n isAttribute: true,\n choices: [\n {\n id: \"opt_small\",\n name: \"Small\",\n price: ngn(0),\n isAvailable: true,\n },\n {\n id: \"opt_large\",\n name: \"Large\",\n price: ngn(0),\n isAvailable: false,\n },\n ],\n },\n ],\n tags: [],\n },\n item_cake: {\n id: \"item_cake\",\n name: \"Chocolate cake\",\n images: [],\n price: ngn(350000),\n compareAtPrice: ngn(400000),\n isAvailable: false,\n quantity: { min: 1, step: 1 },\n variants: [\n {\n id: \"variant_cake\",\n attributeChoices: {},\n price: ngn(350000),\n isAvailable: false,\n },\n ],\n optionGroups: [],\n tags: [],\n },\n },\n};\n/**\n * Sample data with no merchant IDs or photos. `minimal` has one plain item.\n * `defaultTemplate` covers several branches, shared category membership, required and\n * conditional options, per-choice quantities, text input and attribute variants.\n */\nexport const fixtures = {\n minimal: { store, menu },\n defaultTemplate: { store: templateStore, menu: templateMenu },\n};\n"]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/testing/index.ts"],
4
+ "sourcesContent": ["import { estimateUnitPrice } from \"../cart/price\";\nimport type { WireQuote } from \"../cart/types\";\nimport { validateLine } from \"../cart/validate\";\nimport { createZappie } from \"../client\";\nimport type { ZappieErrorCode } from \"../errors\";\nimport { ZappieError } from \"../errors\";\nimport { delay, throwIfAborted } from \"../internal/abort\";\nimport { multiplyMoney } from \"../internal/money-math\";\nimport type { Menu, Store } from \"../models\";\nimport { money } from \"../money\";\nimport type { RequestCtx, Transport } from \"../transport/types\";\nexport { VERSION } from \"../index\";\n/** Store and branch menus supplied to the deterministic mock transport. */\nexport type MockFixtures = { store: Store; menus: Record<string, Menu> };\n/** Mock timing and per-operation failures. */\nexport type MockOptions = {\n latencyMs?: number;\n failWith?: Partial<Record<keyof Transport, ZappieErrorCode>>;\n};\n/** Create an isolated in-memory SDK client without making network requests. */\nexport function createMockZappie(input: MockFixtures, opts: MockOptions = {}) {\n const fixtures = structuredClone(input);\n const before = async (method: keyof Transport, ctx: RequestCtx) => {\n throwIfAborted(ctx.signal);\n if (opts.latencyMs) {\n await delay(opts.latencyMs, ctx.signal);\n }\n const code = opts.failWith?.[method];\n if (code) {\n throw new ZappieError(code, `Mock ${method} failure`);\n }\n };\n const menu = (id: string) => {\n const value = fixtures.menus[id];\n if (!value) {\n throw new ZappieError(\"branch_not_found\", \"No fixture for this branch\");\n }\n return structuredClone(value);\n };\n const transport: Transport = {\n async quote(ctx, body): Promise<WireQuote> {\n await before(\"quote\", ctx);\n const value = menu(body.branch_id);\n const branch = fixtures.store.branches.find(\n (b) => b.id === body.branch_id,\n )!;\n const issues: WireQuote[\"issues\"] = [];\n const lines = body.lines.map((line) => {\n const item = value.items[line.item_id];\n const input = {\n itemId: line.item_id,\n ...(line.menu_id !== undefined ? { menuId: line.menu_id } : {}),\n quantity: line.quantity,\n choices: line.options.map((c) => ({\n groupId: c.group_id,\n choiceId: c.choice_id,\n quantity: c.quantity,\n })),\n inputs: line.inputs,\n ...(line.variant_id ? { variantId: line.variant_id } : {}),\n };\n const invalid = validateLine(item, input, { menu: value, branch });\n issues.push(\n ...invalid.map((i) => ({\n code: i.code,\n severity: i.severity,\n message: i.message,\n line_id: line.line_id,\n ...(i.groupId ? { group_id: i.groupId } : {}),\n fixes: [],\n })),\n );\n const price =\n item && !invalid.length\n ? estimateUnitPrice(item, input)\n : money(0, fixtures.store.currency);\n return {\n line_id: line.line_id,\n unit_price: {\n amount_minor: price.amountMinor,\n currency: price.currency,\n },\n line_total: {\n amount_minor: multiplyMoney(price, line.quantity).amountMinor,\n currency: price.currency,\n },\n };\n });\n const subtotal = {\n amount_minor: lines.reduce((n, l) => n + l.line_total.amount_minor, 0),\n currency: fixtures.store.currency,\n };\n return {\n branch_id: body.branch_id,\n lines,\n subtotal,\n total: subtotal,\n charges: [],\n discounts: [],\n issues,\n can_checkout: !issues.some((issue) => issue.severity === \"blocking\"),\n checkout: issues.some((issue) => issue.severity === \"blocking\")\n ? { ready: false, reason: \"issues\" }\n : { ready: true },\n menu_version: value.version,\n expires_at: new Date(Date.now() + 300_000).toISOString(),\n };\n },\n async getStore(ctx) {\n await before(\"getStore\", ctx);\n return structuredClone(fixtures.store);\n },\n async getMenu(ctx) {\n await before(\"getMenu\", ctx);\n const value = menu(ctx.branchId);\n return ctx.ifNoneMatch === value.version\n ? { notModified: true }\n : { menu: value, etag: value.version };\n },\n async getMenuVersion(ctx) {\n await before(\"getMenuVersion\", ctx);\n const value = menu(ctx.branchId);\n return { version: value.version, availabilityHash: value.version };\n },\n async getItem(ctx) {\n await before(\"getItem\", ctx);\n const value = menu(ctx.branchId).items[ctx.itemId];\n if (!value) {\n throw new ZappieError(\"item_not_found\", \"Item not found\");\n }\n return value;\n },\n };\n return createZappie({\n store: fixtures.store.slug,\n key: \"pk_test_fixture\",\n transport,\n });\n}\nconst fulfilment = {\n pickup: true,\n delivery: true,\n dineIn: false,\n scheduling: false,\n};\nconst store: Store = {\n id: \"biz_fixture\",\n slug: \"default-store\",\n name: \"Default storefront\",\n currency: \"NGN\",\n timezone: \"Africa/Lagos\",\n brand: {},\n fulfilment,\n paymentMethods: [\"card\"],\n branches: [\n {\n id: \"br_fixture\",\n slug: \"main\",\n name: \"Main\",\n openingTimes: [{ day: 1, opens: \"08:00\", closes: \"22:00\" }],\n isOpen: true,\n fulfilment,\n },\n ],\n};\nconst menu: Menu = {\n id: \"menu_fixture\",\n branchId: \"br_fixture\",\n name: \"Menu\",\n version: \"fixture-v1\",\n categories: [{ id: \"cat_fixture\", name: \"Food\", itemIds: [\"item_fixture\"] }],\n items: {\n item_fixture: {\n id: \"item_fixture\",\n name: \"Lunch\",\n images: [],\n price: money(650000, \"NGN\"),\n isAvailable: true,\n quantity: { min: 1, step: 1 },\n variants: [\n {\n id: \"variant_fixture\",\n attributeChoices: {},\n price: money(650000, \"NGN\"),\n isAvailable: true,\n },\n ],\n optionGroups: [],\n tags: [],\n },\n },\n};\nconst ngn = (amountMinor: number) => money(amountMinor, \"NGN\");\nconst templateStore: Store = {\n id: \"biz_template\",\n slug: \"default-template\",\n name: \"Default template\",\n description: \"A public storefront fixture for template authors.\",\n templateSettings: {\n accent: \"#175c3a\",\n headerPhoto: \"https://example.com/default-template-cover.png\",\n },\n currency: \"NGN\",\n timezone: \"Africa/Lagos\",\n brand: {\n logoUrl: \"https://example.com/default-template-logo.png\",\n coverImageUrl: \"https://example.com/default-template-cover.png\",\n },\n fulfilment: { pickup: true, delivery: true, dineIn: true, scheduling: true },\n paymentMethods: [\"card\", \"bank_transfer\", \"wallet\"],\n branches: [\n {\n id: \"br_template_main\",\n slug: \"main\",\n name: \"Main\",\n timezone: \"Africa/Lagos\",\n address: \"1 Example Street, Lagos\",\n phone: \"+234 800 000 0000\",\n pickupAddress: {\n placeId: \"place_template_main\",\n coordinates: { lat: 6.5244, lng: 3.3792 },\n },\n socialLinks: [\n { type: \"INSTAGRAM\", url: \"https://instagram.com/default-template\" },\n { type: \"WEBSITE\", url: \"https://example.com\" },\n ],\n openingTimes: [1, 2, 3, 4, 5].map((day) => ({\n day: day as 1 | 2 | 3 | 4 | 5,\n opens: \"08:00\",\n closes: \"22:00\",\n })),\n isOpen: true,\n isDefault: true,\n fulfilment: {\n pickup: true,\n delivery: true,\n dineIn: true,\n scheduling: true,\n },\n minimumOrder: ngn(200000),\n },\n {\n id: \"br_template_island\",\n slug: \"island\",\n name: \"Island\",\n timezone: \"Africa/Lagos\",\n openingTimes: [{ day: 6, opens: \"10:00\", closes: \"18:00\" }],\n specialHours: [{ date: \"2026-12-25\", closed: true }],\n isOpen: false,\n closedUntil: \"2026-12-26T10:00:00+01:00\",\n fulfilment: {\n pickup: false,\n delivery: true,\n dineIn: false,\n scheduling: false,\n },\n },\n ],\n};\nconst templateMenu: Menu = {\n id: \"menu_template\",\n branchId: \"br_template_main\",\n name: \"All day\",\n version: \"template-v1\",\n categories: [\n {\n id: \"cat_popular\",\n name: \"Popular\",\n itemIds: [\"item_jollof\", \"item_zobo\"],\n },\n { id: \"cat_mains\", name: \"Mains\", itemIds: [\"item_jollof\"] },\n {\n id: \"cat_drinks\",\n name: \"Drinks and desserts\",\n itemIds: [\"item_zobo\", \"item_cake\"],\n },\n ],\n items: {\n item_jollof: {\n id: \"item_jollof\",\n name: \"Jollof rice\",\n description: \"Smoky party jollof.\",\n images: [],\n price: ngn(450000),\n isAvailable: true,\n quantity: { min: 1, max: 10, step: 1 },\n variants: [\n {\n id: \"variant_jollof\",\n attributeChoices: {},\n price: ngn(450000),\n isAvailable: true,\n },\n ],\n optionGroups: [\n {\n id: \"grp_protein\",\n name: \"Protein\",\n kind: \"select\",\n required: true,\n selection: { min: 1, max: 1 },\n isAttribute: false,\n choices: [\n {\n id: \"opt_chicken\",\n name: \"Chicken\",\n price: ngn(0),\n isAvailable: true,\n },\n {\n id: \"opt_beef\",\n name: \"Beef\",\n price: ngn(50000),\n isAvailable: true,\n },\n {\n id: \"opt_fish\",\n name: \"Fish\",\n price: ngn(80000),\n isAvailable: false,\n },\n ],\n },\n {\n id: \"grp_sauce\",\n name: \"Sauce\",\n helpText: \"Required with chicken.\",\n kind: \"select\",\n required: false,\n selection: { min: 0, max: 1 },\n isAttribute: false,\n choices: [\n {\n id: \"opt_pepper\",\n name: \"Pepper sauce\",\n price: ngn(0),\n isAvailable: true,\n },\n {\n id: \"opt_stew\",\n name: \"Stew\",\n price: ngn(20000),\n isAvailable: true,\n },\n ],\n conditions: [\n {\n groupId: \"grp_protein\",\n choiceIds: [\"opt_chicken\"],\n match: \"any\",\n setRequired: true,\n setMin: 1,\n },\n ],\n },\n {\n id: \"grp_extras\",\n name: \"Extras\",\n kind: \"select\",\n required: false,\n selection: { min: 0, max: 3 },\n isAttribute: false,\n choices: [\n {\n id: \"opt_plantain\",\n name: \"Plantain\",\n price: ngn(30000),\n isAvailable: true,\n quantity: { min: 1, max: 3 },\n },\n {\n id: \"opt_egg\",\n name: \"Boiled egg\",\n price: ngn(15000),\n isAvailable: true,\n },\n ],\n },\n {\n id: \"grp_note\",\n name: \"Note for the kitchen\",\n kind: \"text\",\n required: false,\n selection: { min: 0 },\n isAttribute: false,\n choices: [],\n input: { maxLength: 140, placeholder: \"No onions, please\" },\n },\n ],\n tags: [\"popular\"],\n },\n item_zobo: {\n id: \"item_zobo\",\n name: \"Zobo\",\n images: [],\n price: ngn(120000),\n isAvailable: true,\n quantity: { min: 1, step: 1 },\n variants: [\n {\n id: \"variant_zobo_small\",\n attributeChoices: { grp_size: \"opt_small\" },\n price: ngn(120000),\n isAvailable: true,\n },\n {\n id: \"variant_zobo_large\",\n attributeChoices: { grp_size: \"opt_large\" },\n price: ngn(200000),\n isAvailable: false,\n },\n ],\n optionGroups: [\n {\n id: \"grp_size\",\n name: \"Size\",\n kind: \"select\",\n required: true,\n selection: { min: 1, max: 1 },\n isAttribute: true,\n choices: [\n {\n id: \"opt_small\",\n name: \"Small\",\n price: ngn(0),\n isAvailable: true,\n },\n {\n id: \"opt_large\",\n name: \"Large\",\n price: ngn(0),\n isAvailable: false,\n },\n ],\n },\n ],\n tags: [],\n },\n item_cake: {\n id: \"item_cake\",\n name: \"Chocolate cake\",\n images: [],\n price: ngn(350000),\n compareAtPrice: ngn(400000),\n isAvailable: false,\n quantity: { min: 1, step: 1 },\n variants: [\n {\n id: \"variant_cake\",\n attributeChoices: {},\n price: ngn(350000),\n isAvailable: false,\n },\n ],\n optionGroups: [],\n tags: [],\n },\n },\n};\n/**\n * Sample data with no merchant IDs or photos. `minimal` has one plain item.\n * `defaultTemplate` covers several branches, shared category membership, required and\n * conditional options, per-choice quantities, text input and attribute variants.\n */\nexport const fixtures = {\n minimal: { store, menu },\n defaultTemplate: { store: templateStore, menu: templateMenu },\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["fixtures", "menu", "input"]
7
+ }
@@ -1,2 +1,21 @@
1
- function c(e,r,s,t){let o=s(e,r.branchId);if(e.next_cursor!=null&&(typeof e.next_cursor!="string"||!e.next_cursor||e.next_cursor===r.cursor)||o.categories.some(n=>n.id!==r.categoryId)||Object.keys(o.items).some(n=>!o.categories.some(u=>u.itemIds.includes(n)))||!o.menus?.some(n=>n.id===r.menuId&&n.categoryIds.includes(r.categoryId)))throw t();return {menu:{...o,completeness:"partial"},menuId:r.menuId,categoryId:r.categoryId,...typeof e.next_cursor=="string"&&e.next_cursor?{nextCursor:e.next_cursor}:{}}}export{c as categoryPage};//# sourceMappingURL=category-page.js.map
2
- //# sourceMappingURL=category-page.js.map
1
+ // src/transport/category-page.ts
2
+ function categoryPage(raw, ctx, mapMenu, invalid) {
3
+ const menu = mapMenu(raw, ctx.branchId);
4
+ if (raw.next_cursor != null && (typeof raw.next_cursor !== "string" || !raw.next_cursor || raw.next_cursor === ctx.cursor) || menu.categories.some((c) => c.id !== ctx.categoryId) || Object.keys(menu.items).some(
5
+ (id) => !menu.categories.some((c) => c.itemIds.includes(id))
6
+ ) || !menu.menus?.some(
7
+ (m) => m.id === ctx.menuId && m.categoryIds.includes(ctx.categoryId)
8
+ )) {
9
+ throw invalid();
10
+ }
11
+ return {
12
+ menu: { ...menu, completeness: "partial" },
13
+ menuId: ctx.menuId,
14
+ categoryId: ctx.categoryId,
15
+ ...typeof raw.next_cursor === "string" && raw.next_cursor ? { nextCursor: raw.next_cursor } : {}
16
+ };
17
+ }
18
+ export {
19
+ categoryPage
20
+ };
21
+ //# sourceMappingURL=category-page.js.map
@@ -1 +1,7 @@
1
- {"version":3,"sources":["../../src/transport/category-page.ts"],"names":["categoryPage","raw","ctx","mapMenu","invalid","menu","c","id","m"],"mappings":"AASO,SAASA,CAAAA,CACdC,EACAC,CAAAA,CAMAC,CAAAA,CACAC,EACc,CACd,IAAMC,CAAAA,CAAOF,CAAAA,CAAQF,CAAAA,CAAKC,CAAAA,CAAI,QAAQ,CAAA,CACtC,GACGD,CAAAA,CAAI,WAAA,EAAe,IAAA,GACjB,OAAOA,EAAI,WAAA,EAAgB,QAAA,EAC1B,CAACA,CAAAA,CAAI,WAAA,EACLA,CAAAA,CAAI,cAAgBC,CAAAA,CAAI,MAAA,CAAA,EAC5BG,EAAK,UAAA,CAAW,IAAA,CAAMC,GAAMA,CAAAA,CAAE,EAAA,GAAOJ,CAAAA,CAAI,UAAU,CAAA,EACnD,MAAA,CAAO,KAAKG,CAAAA,CAAK,KAAK,CAAA,CAAE,IAAA,CACrBE,CAAAA,EAAO,CAACF,EAAK,UAAA,CAAW,IAAA,CAAMC,CAAAA,EAAMA,CAAAA,CAAE,OAAA,CAAQ,QAAA,CAASC,CAAE,CAAC,CAC7D,GACA,CAACF,CAAAA,CAAK,OAAO,IAAA,CACVG,CAAAA,EAAMA,CAAAA,CAAE,EAAA,GAAON,CAAAA,CAAI,MAAA,EAAUM,EAAE,WAAA,CAAY,QAAA,CAASN,CAAAA,CAAI,UAAU,CACrE,CAAA,CAEA,MAAME,CAAAA,EAAQ,CAEhB,OAAO,CACL,IAAA,CAAM,CAAE,GAAGC,CAAAA,CAAM,YAAA,CAAc,SAAU,CAAA,CACzC,MAAA,CAAQH,EAAI,MAAA,CACZ,UAAA,CAAYA,CAAAA,CAAI,UAAA,CAChB,GAAI,OAAOD,EAAI,WAAA,EAAgB,QAAA,EAAYA,CAAAA,CAAI,WAAA,CAC3C,CAAE,UAAA,CAAYA,EAAI,WAAY,CAAA,CAC9B,EACN,CACF","file":"category-page.js","sourcesContent":["import type { CategoryPage, Menu } from \"../models\";\n\n/**\n * Validates and maps one category page. Only progressive catalogues read\n * pages, so this loads on the first `menu.page()` call and stays out of the\n * core bundle, like the quote client (PRD 03 §4). The mapper and error come\n * in as arguments: importing them would split the core's shared code into a\n * separate chunk, which costs the core more than this module saves.\n */\nexport function categoryPage(\n raw: Record<string, unknown>,\n ctx: {\n branchId: string;\n menuId: string;\n categoryId: string;\n cursor?: string;\n },\n mapMenu: (value: unknown, branchId: string) => Menu,\n invalid: () => Error,\n): CategoryPage {\n const menu = mapMenu(raw, ctx.branchId);\n if (\n (raw.next_cursor != null &&\n (typeof raw.next_cursor !== \"string\" ||\n !raw.next_cursor ||\n raw.next_cursor === ctx.cursor)) ||\n menu.categories.some((c) => c.id !== ctx.categoryId) ||\n Object.keys(menu.items).some(\n (id) => !menu.categories.some((c) => c.itemIds.includes(id)),\n ) ||\n !menu.menus?.some(\n (m) => m.id === ctx.menuId && m.categoryIds.includes(ctx.categoryId),\n )\n ) {\n throw invalid();\n }\n return {\n menu: { ...menu, completeness: \"partial\" },\n menuId: ctx.menuId,\n categoryId: ctx.categoryId,\n ...(typeof raw.next_cursor === \"string\" && raw.next_cursor\n ? { nextCursor: raw.next_cursor }\n : {}),\n };\n}\n"]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/transport/category-page.ts"],
4
+ "sourcesContent": ["import type { CategoryPage, Menu } from \"../models\";\n\n/**\n * Validates and maps one category page. Only progressive catalogues read\n * pages, so this loads on the first `menu.page()` call and stays out of the\n * core bundle, like the quote client (PRD 03 \u00A74). The mapper and error come\n * in as arguments: importing them would split the core's shared code into a\n * separate chunk, which costs the core more than this module saves.\n */\nexport function categoryPage(\n raw: Record<string, unknown>,\n ctx: {\n branchId: string;\n menuId: string;\n categoryId: string;\n cursor?: string;\n },\n mapMenu: (value: unknown, branchId: string) => Menu,\n invalid: () => Error,\n): CategoryPage {\n const menu = mapMenu(raw, ctx.branchId);\n if (\n (raw.next_cursor != null &&\n (typeof raw.next_cursor !== \"string\" ||\n !raw.next_cursor ||\n raw.next_cursor === ctx.cursor)) ||\n menu.categories.some((c) => c.id !== ctx.categoryId) ||\n Object.keys(menu.items).some(\n (id) => !menu.categories.some((c) => c.itemIds.includes(id)),\n ) ||\n !menu.menus?.some(\n (m) => m.id === ctx.menuId && m.categoryIds.includes(ctx.categoryId),\n )\n ) {\n throw invalid();\n }\n return {\n menu: { ...menu, completeness: \"partial\" },\n menuId: ctx.menuId,\n categoryId: ctx.categoryId,\n ...(typeof raw.next_cursor === \"string\" && raw.next_cursor\n ? { nextCursor: raw.next_cursor }\n : {}),\n };\n}\n"],
5
+ "mappings": ";AASO,SAAS,aACd,KACA,KAMA,SACA,SACc;AACd,QAAM,OAAO,QAAQ,KAAK,IAAI,QAAQ;AACtC,MACG,IAAI,eAAe,SACjB,OAAO,IAAI,gBAAgB,YAC1B,CAAC,IAAI,eACL,IAAI,gBAAgB,IAAI,WAC5B,KAAK,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,UAAU,KACnD,OAAO,KAAK,KAAK,KAAK,EAAE;AAAA,IACtB,CAAC,OAAO,CAAC,KAAK,WAAW,KAAK,CAAC,MAAM,EAAE,QAAQ,SAAS,EAAE,CAAC;AAAA,EAC7D,KACA,CAAC,KAAK,OAAO;AAAA,IACX,CAAC,MAAM,EAAE,OAAO,IAAI,UAAU,EAAE,YAAY,SAAS,IAAI,UAAU;AAAA,EACrE,GACA;AACA,UAAM,QAAQ;AAAA,EAChB;AACA,SAAO;AAAA,IACL,MAAM,EAAE,GAAG,MAAM,cAAc,UAAU;AAAA,IACzC,QAAQ,IAAI;AAAA,IACZ,YAAY,IAAI;AAAA,IAChB,GAAI,OAAO,IAAI,gBAAgB,YAAY,IAAI,cAC3C,EAAE,YAAY,IAAI,YAAY,IAC9B,CAAC;AAAA,EACP;AACF;",
6
+ "names": []
7
+ }