@zappie/sdk 0.1.0 → 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.
- package/CHANGELOG.md +25 -0
- package/README.md +55 -313
- package/dist/cart/errors.js +13 -0
- package/dist/cart/errors.js.map +7 -0
- package/dist/cart/index.js +768 -0
- package/dist/cart/index.js.map +7 -0
- package/dist/cart/item.js +12 -1
- package/dist/cart/item.js.map +7 -1
- package/dist/cart/preview.js +32 -0
- package/dist/cart/preview.js.map +7 -0
- package/dist/cart/price.js +25 -0
- package/dist/cart/price.js.map +7 -0
- package/dist/cart/quote-client.js +76 -0
- package/dist/cart/quote-client.js.map +7 -0
- package/dist/cart/quote-response.js +178 -0
- package/dist/cart/quote-response.js.map +7 -0
- package/dist/cart/reconcile.js +108 -0
- package/dist/cart/reconcile.js.map +7 -0
- package/dist/cart/source-menu.js +21 -0
- package/dist/cart/source-menu.js.map +7 -0
- package/dist/cart/storage.js +174 -0
- package/dist/cart/storage.js.map +7 -0
- package/dist/cart/types.js +1 -0
- package/dist/cart/types.js.map +7 -0
- package/dist/cart/validate.js +265 -0
- package/dist/cart/validate.js.map +7 -0
- package/dist/cart/wire.js +42 -0
- package/dist/cart/wire.js.map +7 -0
- package/dist/cart/working-set.js +80 -0
- package/dist/cart/working-set.js.map +7 -0
- package/dist/checkout/client.js +102 -0
- package/dist/checkout/client.js.map +7 -0
- package/dist/checkout/error.js +21 -0
- package/dist/checkout/error.js.map +7 -0
- package/dist/checkout/index.js +13 -1
- package/dist/checkout/index.js.map +7 -1
- package/dist/checkout/readiness.js +36 -0
- package/dist/checkout/readiness.js.map +7 -0
- package/dist/checkout/sdk.js +9 -0
- package/dist/checkout/sdk.js.map +7 -0
- package/dist/checkout/session.js +58 -0
- package/dist/checkout/session.js.map +7 -0
- package/dist/checkout/types.js +1 -0
- package/dist/checkout/types.js.map +7 -0
- package/dist/client.js +253 -0
- package/dist/client.js.map +7 -0
- package/dist/config/index.js +13 -1
- package/dist/config/index.js.map +7 -0
- package/dist/config.js +28 -0
- package/dist/config.js.map +7 -0
- package/dist/customer/client.js +149 -0
- package/dist/customer/client.js.map +7 -0
- package/dist/customer/error.js +20 -0
- package/dist/customer/error.js.map +7 -0
- package/dist/customer/index.js +8 -3
- package/dist/customer/index.js.map +7 -1
- package/dist/customer/navigation.js +45 -0
- package/dist/customer/navigation.js.map +7 -0
- package/dist/customer/react.js +67 -2
- package/dist/customer/react.js.map +7 -1
- package/dist/customer/request.js +37 -0
- package/dist/customer/request.js.map +7 -0
- package/dist/customer/sdk.js +6 -0
- package/dist/customer/sdk.js.map +7 -0
- package/dist/customer/types.js +1 -0
- package/dist/customer/types.js.map +7 -0
- package/dist/customer/watch-order.js +80 -0
- package/dist/customer/watch-order.js.map +7 -0
- package/dist/debug.js +78 -1
- package/dist/debug.js.map +7 -1
- package/dist/errors.js +69 -0
- package/dist/errors.js.map +7 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +29 -1
- package/dist/index.js.map +7 -1
- package/dist/internal/abort.js +29 -0
- package/dist/internal/abort.js.map +7 -0
- package/dist/internal/cache.js +142 -0
- package/dist/internal/cache.js.map +7 -0
- package/dist/internal/customer-http.js +74 -0
- package/dist/internal/customer-http.js.map +7 -0
- package/dist/internal/digest.js +15 -0
- package/dist/internal/digest.js.map +7 -0
- package/dist/internal/emitter.js +27 -0
- package/dist/internal/emitter.js.map +7 -0
- package/dist/internal/money-math.js +30 -0
- package/dist/internal/money-math.js.map +7 -0
- package/dist/internal.js +9 -1
- package/dist/internal.js.map +7 -1
- package/dist/models.js +1 -0
- package/dist/models.js.map +7 -0
- package/dist/money.js +58 -0
- package/dist/money.js.map +7 -0
- package/dist/persist/catalogue.js +206 -2
- package/dist/persist/catalogue.js.map +7 -1
- package/dist/places/client.js +97 -0
- package/dist/places/client.js.map +7 -0
- package/dist/places/error.js +20 -0
- package/dist/places/error.js.map +7 -0
- package/dist/places/index.js +8 -1
- package/dist/places/index.js.map +7 -1
- package/dist/places/request.js +40 -0
- package/dist/places/request.js.map +7 -0
- package/dist/places/sdk.js +10 -0
- package/dist/places/sdk.js.map +7 -0
- package/dist/places/search.js +80 -0
- package/dist/places/search.js.map +7 -0
- package/dist/places/types.js +1 -0
- package/dist/places/types.js.map +7 -0
- package/dist/react/cart.js +30 -0
- package/dist/react/cart.js.map +7 -0
- package/dist/react/hooks.js +91 -0
- package/dist/react/hooks.js.map +7 -0
- package/dist/react/index.js +18 -1
- package/dist/react/index.js.map +7 -1
- package/dist/react/provider.js +34 -0
- package/dist/react/provider.js.map +7 -0
- package/dist/server/index.js +32 -2
- package/dist/server/index.js.map +7 -1
- package/dist/server/storefront-url/build-v1.js +75 -0
- package/dist/server/storefront-url/build-v1.js.map +7 -0
- package/dist/server/storefront-url/build-v2.js +79 -0
- package/dist/server/storefront-url/build-v2.js.map +7 -0
- package/dist/server/storefront-url/build.js +19 -0
- package/dist/server/storefront-url/build.js.map +7 -0
- package/dist/server/storefront-url/contract.js +25 -0
- package/dist/server/storefront-url/contract.js.map +7 -0
- package/dist/server/storefront-url/index.js +16 -0
- package/dist/server/storefront-url/index.js.map +7 -0
- package/dist/server/storefront-url/installation.js +58 -0
- package/dist/server/storefront-url/installation.js.map +7 -0
- package/dist/server/storefront-url/params.js +72 -0
- package/dist/server/storefront-url/params.js.map +7 -0
- package/dist/server/storefront-url/parse-v1.js +135 -0
- package/dist/server/storefront-url/parse-v1.js.map +7 -0
- package/dist/server/storefront-url/parse-v2.js +139 -0
- package/dist/server/storefront-url/parse-v2.js.map +7 -0
- package/dist/server/storefront-url/parse.js +9 -0
- package/dist/server/storefront-url/parse.js.map +7 -0
- package/dist/server/storefront-url/redirect.js +30 -0
- package/dist/server/storefront-url/redirect.js.map +7 -0
- package/dist/server/storefront-url/sign-in.js +17 -0
- package/dist/server/storefront-url/sign-in.js.map +7 -0
- package/dist/server/storefront-url/types.js +55 -0
- package/dist/server/storefront-url/types.js.map +7 -0
- package/dist/server/storefront-url/url.js +61 -0
- package/dist/server/storefront-url/url.js.map +7 -0
- package/dist/server/webhook.js +96 -0
- package/dist/server/webhook.js.map +7 -0
- package/dist/site-config/helpers.js +59 -0
- package/dist/site-config/helpers.js.map +7 -0
- package/dist/site-config/sections.js +105 -0
- package/dist/site-config/sections.js.map +7 -0
- package/dist/site-config/types.js +31 -0
- package/dist/site-config/types.js.map +7 -0
- package/dist/site-config/validate.js +165 -0
- package/dist/site-config/validate.js.map +7 -0
- package/dist/template/index.js +46 -3
- package/dist/template/index.js.map +7 -1
- package/dist/template/react.js +81 -2
- package/dist/template/react.js.map +7 -1
- package/dist/testing/index.js +451 -2
- package/dist/testing/index.js.map +7 -1
- package/dist/transport/category-page.js +21 -2
- package/dist/transport/category-page.js.map +7 -1
- package/dist/transport/mappers.js +326 -0
- package/dist/transport/mappers.js.map +7 -0
- package/dist/transport/rest.js +313 -0
- package/dist/transport/rest.js.map +7 -0
- package/dist/transport/search.js +32 -2
- package/dist/transport/search.js.map +7 -1
- package/dist/transport/selected-menu.js +79 -2
- package/dist/transport/selected-menu.js.map +7 -1
- package/dist/transport/store.js +120 -2
- package/dist/transport/store.js.map +7 -1
- package/dist/transport/types.js +1 -0
- package/dist/transport/types.js.map +7 -0
- package/dist/url/index.js +16 -2
- package/dist/url/index.js.map +7 -1
- package/dist/visits/index.js +62 -1
- package/dist/visits/index.js.map +7 -1
- package/dist/visits/page-views.js +103 -0
- package/dist/visits/page-views.js.map +7 -0
- package/package.json +5 -4
- package/dist/cart/quote.js +0 -1
- package/dist/cart/quote.js.map +0 -1
- package/dist/chunk-I55A5QXJ.js +0 -2
- package/dist/chunk-I55A5QXJ.js.map +0 -1
- package/dist/chunk-VG7NKIKR.js +0 -2
- package/dist/chunk-VG7NKIKR.js.map +0 -1
package/dist/chunk-VG7NKIKR.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import {a,h,g,d,i,j,k,l,q,p,e,o,m,n,s,r,f,c}from'./chunk-I55A5QXJ.js';var B=class extends a{constructor(o){super("cart_invalid",o[0]?.message??"The cart needs attention");this.issues=o;this.name="ZappieCartError";}};function K(t,e){let o=e.variantId?t.variants.find(i=>i.id===e.variantId):void 0;if(e.variantId&&!o)throw new a("invalid_request","The selected variant is missing");let n=e.choices.flatMap(i=>{let p=t.optionGroups.find(a=>a.id===i.groupId),r=p?.choices.find(a=>a.id===i.choiceId);if(!p||!r)throw new a("invalid_request","The selected option is missing");return p.isAttribute?[]:[h(r.price,Math.max(i.quantity,1))]});return g(n,o?.price??t.price)}function we(t,e,o){let n=t.categories.filter(a=>a.itemIds.includes(e)),i=t.menus??[{id:t.id,categoryIds:t.categories.map(a=>a.id)}],p=t.items[e]?.placements,r=i.filter(a=>(!p||p.some(s=>s.menuId===a.id&&a.categoryIds.includes(s.categoryId)))&&a.categoryIds.some(s=>n.some(c=>c.id===s)));return o!==void 0?typeof o=="string"&&o.trim().length>0&&o.length<=256&&r.some(a=>a.id===o)?o:void 0:r.length===1?r[0].id:void 0}function x(t,e,o=[],n){return {code:t,severity:"blocking",message:e,fixes:o,source:"local",...n?{groupId:n}:{}}}function be(t,e){let o=new Map;for(let n of e.choices??[]){let i=o.get(n.groupId)??new Set;i.add(n.choiceId),o.set(n.groupId,i);}return t.optionGroups.map(n=>{let i=n.required,{min:p,max:r}=n.selection;for(let a of n.conditions??[]){let s=o.get(a.groupId)??new Set;(a.count?a.count.op==="eq"?s.size===a.count.value:a.count.op==="gte"?s.size>=a.count.value:s.size<=a.count.value:s.size>0&&a.choiceIds.length>0&&(a.match==="all"?a.choiceIds.every(g=>s.has(g)):a.choiceIds.some(g=>s.has(g))))&&(i=a.setRequired??i,p=a.setMin??p,a.setMax!=null&&(r=a.setMax>0?a.setMax:void 0));}return {...n,required:i,selection:{min:p,...r!==void 0?{max:r}:{}}}})}function Y(t,e){let o=new Set(t.optionGroups.filter(n=>n.isAvailable===false).map(n=>n.id));return {...e,quantity:e.quantity??t.quantity.min,choices:(e.choices??[]).filter(n=>!o.has(n.groupId)).map(n=>({...n,quantity:n.quantity??1})),inputs:Object.fromEntries(Object.entries(e.inputs??{}).filter(([n])=>!o.has(n)))}}function X(t,e){let o=t.optionGroups.filter(i=>i.isAttribute),n=t.variants.filter(i=>(!e.variantId||i.id===e.variantId)&&o.every(p=>{let r=e.choices?.filter(a=>a.groupId===p.id)??[];return r.length===1&&i.attributeChoices[p.id]===r[0].choiceId}));return n.length===1?n[0]:void 0}function Je(t,e){switch(t){case "number":return Number.isFinite(Number(e));case "date":return /^\d{4}-\d{2}-\d{2}$/.test(e)&&Number.isFinite(Date.parse(e))&&new Date(e).toISOString().slice(0,10)===e;case "time":return /^([01]\d|2[0-3]):[0-5]\d(:[0-5]\d)?$/.test(e);case "toggle":return ["true","false"].includes(e.toLowerCase());default:return true}}function ee(t,e,o){if(!t||t.id!==e.itemId||!Object.hasOwn(o.menu.items,e.itemId))return [x("item_unavailable","This item is no longer on the menu",[{action:"remove_line"}])];let n=[];we(o.menu,e.itemId,e.menuId)||n.push(x("item_unavailable",e.menuId===void 0?`${t.name} is on more than one menu. Remove it and add it again from the menu you want.`:`${t.name} is no longer on the menu it was added from.`,[{action:"remove_line"}])),t.isAvailable||n.push(x("item_unavailable",`${t.name} is unavailable`,[{action:"remove_line"}]));let i=Y(t,e),p=i.quantity,{min:r,step:a}=t.quantity,s=Math.min(t.quantity.max??99,99);if(!Number.isInteger(p)||p<r||p>s||p%a!==0){let d=Math.ceil(r/a)*a,b=Math.floor(s/a)*a,S=Math.max(d,Math.min(b,Math.round((Number.isFinite(p)?p:r)/a)*a));n.push(x("quantity_limit",`Choose a valid quantity of ${t.name} (${r}\u2013${s}, step ${a})`,d<=b?[{action:"set_quantity",quantity:S}]:[]));}(i.note?.length??0)>280&&n.push(x("option_limit","Notes must be at most 280 characters"));for(let d of i.choices??[])t.optionGroups.some(b=>b.id===d.groupId)||n.push(x("option_unavailable","This option group no longer exists",[{action:"remove_line"}],d.groupId));for(let d of Object.keys(i.inputs??{}))t.optionGroups.some(b=>b.id===d)||n.push(x("option_unavailable","This input group no longer exists",[{action:"remove_line"}],d));let c=be(t,i),g=c.filter(d=>d.isAvailable!==false&&d.required&&!(i.choices??[]).some(b=>b.groupId===d.id)&&!(i.inputs?.[d.id]??"").trim());if(g.length)return [...n,...g.map(d=>x("option_required",`Choose ${d.name}`,[{action:"choose_option",groupId:d.id}],d.id))];for(let d of c){if(d.isAvailable===false)continue;let b=i.choices?.filter(L=>L.groupId===d.id)??[],S=i.inputs?.[d.id]??"",M=S.trim(),F=d.isInformational&&d.kind==="select",P=d.kind!=="select"||F&&!d.choices.length,N=[{action:"choose_option",groupId:d.id}];d.required&&!b.length&&!M&&n.push(x("option_required",`Choose ${d.name}`,N,d.id)),M&&(!P&&!F||b.length>0)&&n.push(x("option_limit",`Choose either an option or a response for ${d.name}`,N,d.id)),(P||F)&&(S.length>(d.input?.maxLength??500)||M&&!Je(d.kind,M))&&n.push(x("option_limit",`Enter a valid response for ${d.name}`,N,d.id));let U=b.reduce((L,f)=>L+(f.quantity??1),0);b.length&&(P||U<d.selection.min||U>(d.selection.max??1/0)||new Set(b.map(L=>L.choiceId)).size!==b.length)&&n.push(x("option_limit",`Check the number of options for ${d.name}`,N,d.id));for(let L of b){let f=d.choices.find(q=>q.id===L.choiceId);f?.isAvailable||n.push(x("option_unavailable",`An option in ${d.name} is unavailable`,[{action:"choose_other_option",groupId:d.id},{action:"remove_line"}],d.id));let w=L.quantity??1;(!Number.isInteger(w)||w<(f?.quantity?.min??1)||w>(f?.quantity?.max??99))&&n.push(x("option_limit",`Check the option quantity for ${d.name}`,N,d.id));}}if(!X(t,i)?.isAvailable){let d=t.optionGroups.find(b=>b.isAttribute)?.id;n.push(x("option_limit","Choose an available variant",d?[{action:"choose_option",groupId:d}]:[{action:"remove_line"}],d));}return n}function V(t){return {itemId:t.itemId,...t.menuId!==void 0?{menuId:t.menuId}:{},quantity:t.quantity,choices:t.choices.map(e=>({...e})),inputs:{...t.inputs},...t.variantId?{variantId:t.variantId}:{},...t.note!==void 0?{note:t.note}:{}}}function Ce(t){return Object.freeze({...t,choices:Object.freeze(t.choices.map(e=>Object.freeze({...e}))),inputs:Object.freeze({...t.inputs})})}function _e(t,e$1,o,n,i=[]){let p=[],r=true,a=t.map(s=>{let c=Object.hasOwn(e$1.items,s.itemId)?e$1.items[s.itemId]:void 0,g={...s,choices:s.choices?.map(M=>({...M})),inputs:{...s.inputs}},I=c?Y(c,g):g;p.push(...ee(c,I,{menu:e$1}).map(M=>({...M,lineId:s.id})));let d=I.variantId??(c?X(c,I)?.id:void 0),b=e(0,n),S=true;try{if(!c)throw new Error("Missing item");b=K(c,{choices:(I.choices??[]).map(M=>({...M,quantity:M.quantity??1})),...d?{variantId:d}:{}});}catch{r=false,S=false;}return s.unitPrice&&s.unitPrice.amountMinor!==b.amountMinor&&c&&S&&p.push({...x("price_changed",`${c.name} is now ${f.money(b)}`,[{action:"accept_price"},{action:"remove_line"}]),severity:"warning",lineId:s.id,data:{previous:s.unitPrice,current:b}}),Ce({id:s.id,itemId:s.itemId,...I.menuId!==void 0?{menuId:I.menuId}:{},name:c?.name??s.name,quantity:I.quantity??1,choices:(I.choices??[]).map(M=>({...M,quantity:M.quantity??1})),inputs:I.inputs??{},...d?{variantId:d}:{},...I.note!==void 0?{note:I.note}:{},unitPrice:b,lineSubtotal:h(b,I.quantity??1),addedAt:s.addedAt})});for(let s of i)s.code==="price_changed"&&a.some(c=>c.id===s.lineId)&&!p.some(c=>c.code===s.code&&c.lineId===s.lineId)&&p.push(s);return {lines:Object.freeze(a),issues:p,priced:r}}function Ke(t){try{return t&&e(t.amountMinor,t.currency)}catch{return}}function de(t){let e=JSON.parse(t);if(!e||e.v!==1||!Array.isArray(e.lines)||e.lines.length>100||!Number.isFinite(e.updatedAt)||typeof e.menuVersion!="string"||e.promoCode!==null&&typeof e.promoCode!="string")throw new Error("Invalid saved cart");let o=new Set;for(let n of e.lines){if(!n||typeof n.id!="string"||o.has(n.id)||typeof n.itemId!="string"||typeof n.name!="string"||!Number.isFinite(Date.parse(n.addedAt))||!Number.isInteger(n.quantity)||n.quantity<1||n.quantity>99||n.note!==void 0&&(typeof n.note!="string"||n.note.length>280)||n.menuId!==void 0&&(typeof n.menuId!="string"||!n.menuId.trim()||n.menuId.length>256)||n.variantId!==void 0&&typeof n.variantId!="string")throw new Error("Invalid saved cart line");if(o.add(n.id),!Array.isArray(n.choices)||n.choices.length>1e3||n.choices.some(i=>!i||typeof i.groupId!="string"||typeof i.choiceId!="string"||!Number.isInteger(i.quantity)||i.quantity<1||i.quantity>99))throw new Error("Invalid saved choices");if(!n.inputs||typeof n.inputs!="object"||Array.isArray(n.inputs)||Object.values(n.inputs).some(i=>typeof i!="string"))throw new Error("Invalid saved inputs")}if(e.fulfilment!==null&&!qe(e.fulfilment))throw new Error("Invalid saved fulfilment");return {v:1,lines:e.lines.map(n=>{let i=Ke(n.unitPrice);return {id:n.id,itemId:n.itemId,...n.menuId!==void 0?{menuId:n.menuId}:{},name:n.name,addedAt:n.addedAt,...i?{unitPrice:i}:{},quantity:n.quantity,choices:n.choices,inputs:n.inputs,...n.variantId?{variantId:n.variantId}:{},...n.note!==void 0?{note:n.note}:{}}}),fulfilment:e.fulfilment,promoCode:e.promoCode,menuVersion:e.menuVersion,updatedAt:e.updatedAt}}function qe(t){if(!t||!["pickup","delivery","dine_in"].includes(t.type)||typeof t.branchId!="string"||"scheduledFor"in t&&t.scheduledFor!==void 0&&!Number.isFinite(Date.parse(t.scheduledFor)))return false;if(t.type==="delivery"){let e=t.address;if(!e||typeof e.line1!="string"||!e.line1.trim()||[e.line2,e.city,e.placeId,e.instructions].some(o=>o!==void 0&&typeof o!="string")||e.coordinates&&(!Number.isFinite(e.coordinates.lat)||!Number.isFinite(e.coordinates.lng)||Math.abs(e.coordinates.lat)>90||Math.abs(e.coordinates.lng)>180))return false}return t.type!=="dine_in"||t.table===void 0||typeof t.table=="string"}function Ze(t,e){let o,n=false,i=false,p=false,r=new Map,a=c=>{p||(p=true,e(c));},s=(c,g)=>{try{if(n||(n=!0,o=t??(typeof window>"u"?void 0:window.localStorage)),o&&!i)return c(o)}catch{i=true,a("Cart storage unavailable; using memory for this client");}return g()};return {warning:a,read(c){return s(g=>{let I=g.getItem(c);return I!==null?r.set(c,I):r.delete(c),I},()=>r.get(c)??null)},write(c,g){r.set(c,g),s(I=>I.setItem(c,g),()=>{});},remove(c){r.delete(c),s(g=>g.removeItem(c),()=>{});},accepts(c){return !i&&(!c||c===o)},sweep(c,g,I){s(d=>{let b=Array.from({length:d.length??0},(S,M)=>d.key?.(M));for(let S of b)if(!(!S||S===g||!S.startsWith(c)))try{let M=d.getItem(S);M&&Date.now()-de(M).updatedAt>I&&d.removeItem(S);}catch{d.removeItem(S);}},()=>{});}}}function Se(t){return {line_id:t.id,item_id:t.itemId,...t.menuId!==void 0?{menu_id:t.menuId}:{},quantity:t.quantity,...t.variantId?{variant_id:t.variantId}:{},options:t.choices.map(e=>({group_id:e.groupId,choice_id:e.choiceId,quantity:e.quantity})),inputs:{...t.inputs},...t.note!==void 0?{note:t.note}:{}}}function ze(t){return {type:t.type,..."scheduledFor"in t&&t.scheduledFor?{scheduled_for:t.scheduledFor}:{},...t.type==="dine_in"&&t.table?{table:t.table}:{},...t.type==="delivery"?{address:{line1:t.address.line1,...t.address.line2?{line2:t.address.line2}:{},...t.address.city?{city:t.address.city}:{},...t.address.placeId?{place_id:t.address.placeId}:{},...t.address.instructions?{instructions:t.address.instructions}:{},...t.address.coordinates?{lat:t.address.coordinates.lat,lng:t.address.coordinates.lng}:{}}}:{}}}var Ye=Object.freeze({lines:Object.freeze([]),count:0,subtotal:null,fulfilment:null,promoCode:null,state:{status:"ready"},issues:Object.freeze([]),isHydrated:false});function Ue(t){if(t&&typeof t=="object"&&!Object.isFrozen(t)){Object.freeze(t);for(let e of Object.values(t))Ue(e);}return t}function ye(t){return JSON.stringify([t.itemId,t.menuId,t.variantId,t.note??"",[...t.choices??[]].sort((e,o)=>e.groupId.localeCompare(o.groupId)||e.choiceId.localeCompare(o.choiceId)),Object.entries(t.inputs??{}).sort(([e],[o])=>e.localeCompare(o))])}function Ve(t){let{config:e$1,menu:o,store:n,events:i}=t,p=e$1.cart?.ttl??10080*60*1e3;if(!Number.isFinite(p)||p<=0)throw new a("invalid_request","Cart ttl must be positive milliseconds");let r=Ye,a$1,s,c$1=e$1.branch,g$1=0,I,d=0,b=0,S=0,M=0,F=0,P,N,U=0,L,f=new Set,w=`zappie:cart:v1:${e$1.store}:`,q=e$1.cart?.storageScope,R=u=>`${w}${u}${q?`:${q}`:""}`,k=()=>R(s.id),A=Ze(e$1.storage,u=>i.emit("warning",{message:u})),j=u=>{let l=A.read(R(u));return l===null&&q&&(l=A.read(w+u),l!==null&&(A.remove(w+u),A.write(R(u),l))),l},ie,xe,Qe=()=>xe??(xe=import('./cart/quote.js').then(({createQuoteClient:u})=>ie=u(t.transport,t.context),u=>{throw xe=void 0,u})),G=u=>{r=Ue({...r,...u,branchId:s?.id});for(let l of [...f])try{l();}catch(m){i.emit("error",{error:c(m)});}},ne=(u,l)=>u.some(m=>m.severity!=="info")?{status:"needs_attention",issues:u,...l?{quote:l}:{}}:l?{status:"quoted",quote:l}:{status:"ready"},Q=()=>{d++,b++,clearTimeout(I),ie?.cancel();},oe=()=>{let u={v:1,lines:r.lines.map(l=>({...V(l),id:l.id,name:l.name,addedAt:l.addedAt,unitPrice:l.unitPrice})),fulfilment:r.fulfilment,promoCode:r.promoCode,menuVersion:a$1.version,updatedAt:g$1};A.write(k(),JSON.stringify(u));},se=()=>{clearTimeout(I),r.lines.length&&(I=setTimeout(()=>{J.quote().catch(()=>{});},300));},me=(u,l=r.issues.filter(v=>v.source==="local"),m={})=>{let v=n.peek().currency,h=_e(u,a$1,s,v,l),y=h.priced?g(h.lines.map(_=>_.lineSubtotal),e(0,v)):null;G({...m,lines:h.lines,count:h.lines.reduce((_,T)=>_+T.quantity,0),subtotal:y,issues:h.issues,state:ne(h.issues)});for(let _ of h.issues)i.emit("cart_issue",{code:_.code});},H=(u=r.lines,l={})=>{Q(),me(u,void 0,l),g$1=Date.now(),oe(),se();},Ie=u=>{let l=n.peek()?.branches.find(m=>m.id===u.branchId);if(!l)throw new a("branch_not_found","Load the storefront branch before using its cart");a$1=u,s=l,c$1=l.id;},pe=(u,l=true)=>{Q();let m;try{m=u?de(u):void 0,m&&Date.now()-m.updatedAt>p&&(m=void 0,A.remove(k()),i.emit("cart_expired",{branchId:s.id}));}catch{A.remove(k()),A.warning("Invalid saved cart discarded");}g$1=m?.updatedAt??Date.now();let v=Date.now()-g$1,h=m?.fulfilment??null;(h?.branchId!==s.id||v>864e5&&h.type==="delivery")&&(h=null),h&&"scheduledFor"in h&&h.scheduledFor&&Date.parse(h.scheduledFor)<Date.now()&&(h={...h},delete h.scheduledFor);let y=(m?.lines??[]).map(T=>({...T,...v>864e5?{inputs:{}}:{}})),_=_e(y,a$1,s,n.peek().currency);me(_.lines,_.issues,{fulfilment:h,promoCode:m?.promoCode??null,isHydrated:true}),u!==null&&l&&oe(),A.sweep(w,k(),p);},Z=()=>{let u=s?.id??n.peek()?.branches.find(h=>h.id===c$1||h.slug===c$1||!c$1&&h.isDefault)?.id??(c$1?void 0:n.peek()?.branches[0]?.id);if(r.isHydrated)return;let l=a$1??(u?t.workingSet.peek(u,[]):void 0);if(!l||!n.peek())throw new a("invalid_request","Load the store and menu before editing the cart");Ie(l);let m=j(s.id),v=[];if(m===null&&L)try{v=L(A.read);}catch{A.warning("Invalid legacy cart discarded");}pe(m),m===null&&L&&oe();for(let h of v.slice(0,100))try{J.add(h.itemId,h);}catch{i.emit("cart_issue",{code:"item_unavailable"});}},fe=async()=>{let u=s?.id,l=S,m=++M,v=d;if(!u||!a$1||!r.lines.length||a$1.completeness!=="partial"&&(await t.transport.getMenuVersion({...t.context(),branchId:u})).version===a$1.version)return;let h=await t.workingSet.read(u,r.lines.map(y=>y.itemId),true);l!==S||m!==M||v!==d||JSON.stringify(h)===JSON.stringify(a$1)||(a$1=h,Q(),me(r.lines),oe(),se());},Re=u=>{let l=t.workingSet.peek(s.id,[...r.lines.map(m=>m.itemId),u]);l.items[u]&&(a$1=l);},he=(u,l,m)=>{Re(u.itemId);let v=Object.hasOwn(a$1.items,u.itemId)?a$1.items[u.itemId]:void 0,h$1=ee(v,u,{menu:a$1});if(h$1.length||!v)throw new B(h$1);let y=Y(v,u),_=X(v,y),T=(y.choices??[]).map(E=>({...E,quantity:E.quantity??1})),O=K(v,{choices:T,variantId:_.id});return Ce({id:l??`line_${Array.from(globalThis.crypto.getRandomValues(new Uint8Array(10)),E=>"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz-"[E&63]).join("")}`,itemId:v.id,...y.menuId!==void 0?{menuId:y.menuId}:{},name:v.name,quantity:y.quantity,choices:T,inputs:y.inputs??{},variantId:_.id,...y.note!==void 0?{note:y.note}:{},unitPrice:O,lineSubtotal:h(O,y.quantity),addedAt:m??new Date().toISOString()})},He=i.on("menu:updated",({branchId:u,version:l})=>{if(s?.id===u){let m=o.peek(u);m&&m.completeness!=="partial"&&m.version===l&&m.version!==a$1?.version&&(M++,a$1=m,Q(),me(r.lines),oe(),se());}}),J={get branchId(){return r.branchId},get lines(){return r.lines},get count(){return r.count},get subtotal(){return r.subtotal},get fulfilment(){return r.fulfilment},get promoCode(){return r.promoCode},get state(){return r.state},get issues(){return r.issues},get isHydrated(){return r.isHydrated},getSnapshot:()=>r,subscribe(u){return f.add(u),()=>{f.delete(u);}},async hydrate(){if(r.isHydrated)return fe();let u=U;return N??(N=(async()=>{let l=await n.get(),m=l.branches.find(y=>y.id===c$1||y.slug===c$1)??(c$1?void 0:l.branches.find(y=>y.isDefault)??l.branches[0]);if(!m)throw new a("branch_not_found","Cart branch is unavailable");let v=r.lines;if(!r.isHydrated){let y=j(m.id);try{let _=y?de(y):void 0;v=_&&Date.now()-_.updatedAt<=p?_.lines:y===null?L?.(A.read)??[]:[];}catch{v=[];}}let h=await t.workingSet.read(m.id,v.map(y=>y.itemId));u===U&&(Ie(h),Z(),h.completeness!=="partial"&&await fe());})().finally(()=>{N=void 0;})),N},mount(){if(F++,!P&&typeof window<"u"){let l=v=>{if(s&&v.key===k()&&A.accepts(v.storageArea)){let h=v.newValue,y;try{y=h?de(h).lines.map(z=>z.itemId):[];}catch{pe(h,false);return}let _=t.workingSet.peek(s.id,y);if(_.completeness!=="partial"||y.every(z=>_.items[z])){a$1=_,pe(h,false),se();return}let T=d,O=++M,E=U;t.workingSet.read(s.id,y).then(z=>{E===U&&T===d&&O===M&&(a$1=z,pe(h,false),se());}).catch(z=>i.emit("error",{error:c(z)}));}},m=()=>{fe().catch(v=>i.emit("error",{error:c(v)}));};window.addEventListener("storage",l),window.addEventListener("focus",m),P=()=>{window.removeEventListener("storage",l),window.removeEventListener("focus",m);};}F===1&&J.hydrate().catch(l=>i.emit("error",{error:c(l)}));let u=true;return ()=>{u&&(u=false,F--,F===0&&(P?.(),P=void 0,Q()));}},dispose(){U++,S++,He(),Q(),P?.(),P=void 0,f.clear();},validate(u){Z(),Re(u.itemId);let l=ee(Object.hasOwn(a$1.items,u.itemId)?a$1.items[u.itemId]:void 0,u,{menu:a$1});return l.length?{ok:false,issues:l}:{ok:true}},add(u,l={}){Z();let m=he({...l,itemId:typeof u=="string"?u:u.id}),v=r.lines.find(h=>ye(V(h))===ye(V(m)));if(v)m=he({...V(m),quantity:v.quantity+m.quantity},v.id,v.addedAt);else if(r.lines.length>=100)throw new B([x("quantity_limit","A cart can contain at most 100 lines")]);return H(v?r.lines.map(h=>h.id===v.id?m:h):[...r.lines,m]),i.emit("add_to_cart",{itemId:m.itemId,quantity:m.quantity-(v?.quantity??0),value:h(m.unitPrice,m.quantity-(v?.quantity??0))}),m},update(u,l){Z();let m=r.lines.find(_=>_.id===u);if(!m)throw new B([x("item_not_found","Cart line not found")]);let v={...V(m),...l};l.choices&&!l.variantId&&delete v.variantId;let h=he(v,m.id,m.addedAt),y=r.lines.find(_=>_.id!==u&&ye(V(_))===ye(V(h)));return y&&(h=he({...V(h),quantity:h.quantity+y.quantity},m.id,m.addedAt)),H(r.lines.filter(_=>_.id!==y?.id).map(_=>_.id===u?h:_)),i.emit("update_cart_line",{lineId:u,itemId:h.itemId,quantity:h.quantity}),h},remove(u){Z();let l=r.lines.find(m=>m.id===u);H(r.lines.filter(m=>m.id!==u)),l&&i.emit("remove_from_cart",{itemId:l.itemId,quantity:l.quantity,value:l.lineSubtotal});},clear(){Z(),H([],{fulfilment:null,promoCode:null});},setFulfilment(u){if(Z(),!qe(u)||u.branchId!==s.id)throw new B([x("fulfilment_unavailable","Select fulfilment for the cart's branch")]);H(r.lines,{fulfilment:structuredClone(u)});},setPromoCode(u){Z(),H(r.lines,{promoCode:u?.trim()||null});},async moveTo(u){Z();let l=++S;Q(),G({state:ne(r.issues)});let m=await t.workingSet.read(u,r.lines.map(O=>O.itemId));if(l!==S)return;let v=k(),h=r.lines;Ie(m);let y=h.filter(O=>!ee(m.items[O.itemId],V(O),{menu:m}).length);H(y,{fulfilment:null,promoCode:null});let _=h.filter(O=>!y.includes(O)).map(O=>({...x("item_unavailable",`${O.name} is unavailable at this branch`),severity:"warning",lineId:O.id})),T=[...r.issues,..._];G({issues:T,state:ne(T)}),v!==k()&&A.remove(v);},async quote(u={}){Z(),clearTimeout(I),u.force&&i.emit("view_cart",{});let l={branch_id:s.id,lines:r.lines.map(Se),...r.fulfilment?{fulfilment:ze(r.fulfilment)}:{},...r.promoCode?{promo_code:r.promoCode}:{},menu_version:a$1.version},m=d,v=++b;G({state:{status:"quoting"}});try{return await(await Qe()).get(l,u.force??!1,y=>{if(m!==d)return;let _=r.issues.filter(E=>E.source==="local"),T=y.issues.filter(E=>!_.some(z=>z.code===E.code&&z.lineId===E.lineId&&z.groupId===E.groupId)),O=[..._,...T];G({issues:O,state:ne(O,y)});for(let E of T)i.emit("cart_issue",{code:E.code});(y.menuVersion!==a$1.version||y.issues.some(E=>E.code==="menu_version_stale"))&&fe().catch(E=>i.emit("error",{error:c(E)}));})}catch(h){if(m===d&&v===b){let y=r.issues.filter(_=>_.source==="local");G({issues:y,state:ne(y)}),i.emit("quote_failed",{code:c(h).code});}throw h instanceof Error&&h.name==="AbortError"?h:c(h)}},applyFix(u,l=u.fixes[0]){if(!r.issues.includes(u)||!l||!u.fixes.some(m=>JSON.stringify(m)===JSON.stringify(l)))throw new a("invalid_request","Choose a current cart issue and one of its fixes");switch(l.action){case "remove_line":{u.lineId&&J.remove(u.lineId);return}case "remove_promo":J.setPromoCode(null);return;case "set_quantity":{u.lineId&&J.update(u.lineId,{quantity:l.quantity});return}case "accept_price":{ie?.accept(u);let m=r.issues.filter(y=>y!==u),v="quote"in r.state?r.state.quote:void 0,h=v?{...v,issues:v.issues.filter(y=>!(y.code===u.code&&y.lineId===u.lineId))}:void 0;G({issues:m,state:ne(m,h)});return}default:throw new a("invalid_request",`${l.action} needs the shopper's selection; use update or setFulfilment`)}},toCheckoutPayload(){Z();let u=r.issues.filter(l=>l.severity==="blocking");if((!r.lines.length||!r.fulfilment)&&u.push(x("fulfilment_unavailable","Add items and select fulfilment before checkout")),u.length)throw new B(u);return {lines:r.lines.map(Se),fulfilment:structuredClone(r.fulfilment),...r.promoCode?{promo_code:r.promoCode}:{},menu_version:a$1.version}}};return {cart:Object.freeze(J),cartCatalogue:()=>a$1,setLegacyReader(u){L=u;}}}function De(t){let e=(n,i,p)=>{let r=p??t.menu.peek(n),a=Object.fromEntries([...new Set(i)].flatMap(s=>{let c=t.peekItem(s,n)??r?.items[s];return c?[[s,c]]:[]}));return {id:`branch:${n}`,name:"Cart working set",branchId:n,version:"",...r,kind:"working-set",completeness:"partial",items:a,categories:(r?.categories??[]).map(s=>({...s,itemIds:Object.values(a).filter(c=>c.placements?c.placements.some(g=>g.categoryId===s.id&&(r?.menus??[{id:r?.id,categoryIds:[s.id]}]).some(I=>I.id===g.menuId&&I.categoryIds.includes(s.id))):s.itemIds.includes(c.id)).map(c=>c.id)}))}},o=(n,i)=>{let p=t.menu.peek(n);return p&&p.completeness!=="partial"?p:e(n,i)};return {peek:o,async read(n,i,p=false){let r=o(n,i);if(!i.length||!p&&r.completeness!=="partial")return r;let a$1=p?await t.transport.getMenu({...t.context(),branchId:n,metadataOnly:true}):void 0,s=a$1&&"menu"in a$1?a$1.menu:await t.menu.get({branch:n,metadataOnly:true});if(s.branchId!==n)throw new a("server_error","Cart metadata belongs to another branch");return t.menu.hydrate(s),s.completeness!=="partial"?s:(await Promise.all([...new Set(i)].map(async c=>{try{await t.readItem(c,n,p);}catch(g){if(g.code!=="item_not_found")throw g}})),e(n,i,s))}}}var Me="2026-10-01";function We(t,e=false){if(!t.store?.trim())throw new a("invalid_request","A storefront slug is required");if(e&&typeof window<"u")throw new a("invalid_request","Secret keys cannot be used in a browser");let n=(e?/^sk_(test|live)_.+$/:/^pk_(test|live)_.+$/).exec(t.key);if(!n)throw new a("invalid_request",e?"A secret sk_test_ or sk_live_ key is required":"Use a publishable pk_test_ or pk_live_ key; secret keys are never accepted by createZappie");return n[1]}function re(t){return t?.reason??new DOMException("The request was aborted","AbortError")}function te(t){if(t?.aborted)throw re(t)}function ke(t,e){return new Promise((o,n)=>{te(e);let i=()=>{clearTimeout(p),n(re(e));},p=setTimeout(()=>{e?.removeEventListener("abort",i),o();},t);e?.addEventListener("abort",i,{once:true});})}var Xe=1e4,et=Object.freeze({fetchedAt:0,loading:false}),ve=class{constructor(e){this.onError=e;this.entries=new Map;this.listeners=new Set;this.flights=new Map;this.subscribe=e=>(this.listeners.add(e),()=>{this.listeners.delete(e);});}snapshot(e){return this.entries.get(e)??et}notify(){for(let e of [...this.listeners])e();}set(e,o,n){this.entries.set(e,{value:o,fetchedAt:Date.now(),loading:false,...n!==void 0?{etag:n}:{}}),this.notify();}stale(e){let o=this.snapshot(e);return o.value!==void 0&&Date.now()-o.fetchedAt>=6e4}async get(e,o,n){te(n);let i=this.snapshot(e),p=Date.now()-i.fetchedAt;if(i.value!==void 0&&p<6e4)return i.value;let r=i.value!==void 0&&p<6e5;if(r&&i.failedAt!==void 0&&Date.now()-i.failedAt<Xe)return i.value;let a=this.flights.get(e);if(!a){let c$1=new AbortController;a={controller:c$1,users:0,keepAlive:r,promise:Promise.resolve()};let g=a;this.flights.set(e,g);let I={...i,loading:true};this.entries.set(e,I),this.notify(),g.promise=Promise.resolve().then(()=>(te(c$1.signal),o(c$1.signal,i))).then(d=>(this.entries.get(e)===I&&!c$1.signal.aborted&&(this.set(e,d.value,d.etag),d.onStored?.()),d.value)).catch(d=>{throw this.entries.get(e)===I&&(this.entries.set(e,c$1.signal.aborted?{...i,loading:false}:{...i,loading:false,error:c(d),failedAt:Date.now()}),this.notify(),c$1.signal.aborted||this.onError(c(d))),c$1.signal.aborted?re(c$1.signal):c(d)}).finally(()=>{this.flights.get(e)===g&&this.flights.delete(e);});}if(r)return a.keepAlive=true,a.promise.catch(()=>{}),i.value;let s=a;return s.users++,new Promise((c,g)=>{let I=false,d=S=>{I||(I=true,n?.removeEventListener("abort",b),s.users--,S());},b=()=>{d(()=>g(re(n))),s.users===0&&!s.keepAlive&&(s.controller.abort(re(n)),this.flights.get(e)===s&&this.flights.delete(e));};n?.addEventListener("abort",b,{once:true}),s.promise.then(S=>d(()=>c(S)),S=>d(()=>g(S))),n?.aborted&&b();})}};function Be(){let t=new Map;return {on(e,o){let n=t.get(e)??new Set;return t.set(e,n),n.add(o),()=>{n.delete(o);}},emit(e,o){for(let n of [...t.get(e)??[]])try{n(o);}catch(i){console.error("Zappie event listener failed",i);}}}}var tt=5e3,le=class{constructor(e={}){let o=new URL(e.baseUrl??"https://api.zappie.ai/storefront/v1");if(o.username||o.password||o.search||o.hash||o.protocol!=="https:"&&!(o.protocol==="http:"&&["localhost","127.0.0.1","[::1]"].includes(o.hostname)))throw new a("invalid_request","REST baseUrl requires HTTPS, or HTTP on localhost");this.baseUrl=o.href.replace(/\/$/,""),this.fetcher=e.fetch??((n,i)=>globalThis.fetch(n,i));}async request(e,o,n,i){if(typeof window<"u"&&o.key.startsWith("sk_"))throw new a("invalid_request","Secret keys cannot be sent from a browser");for(let p=0;;p++){te(o.signal);let r;try{r=await this.fetcher(this.baseUrl+e,{method:i?"POST":"GET",...i?{body:JSON.stringify(i)}:{},redirect:"manual",headers:{...i?{"Content-Type":"application/json"}:{},...o.idempotencyKey?{"Idempotency-Key":o.idempotencyKey}:{},Authorization:`Bearer ${o.key}`,"Zappie-Version":o.version,...n?{"If-None-Match":n}:{}},...o.signal?{signal:o.signal}:{}});}catch(d){if(te(o.signal),p>=2)throw new a("network_error","Could not reach the storefront service",{cause:d});await ke(100*2**p+Math.random()*100,o.signal);continue}if(r.ok||r.status===304)return r;let a$1=r.headers.get("Retry-After"),s=a$1!==null?Number(a$1):NaN,c=a$1!==null?Number.isFinite(s)?Math.max(0,s*1e3):Math.max(0,Date.parse(a$1)-Date.now()):NaN,g=Number.isFinite(c)&&c>tt;if(p<2&&!g&&(r.status===429||r.status>=500)){await r.body?.cancel(),await ke(Number.isFinite(c)?c:100*2**p+Math.random()*100,o.signal);continue}let I=await r.json().catch(()=>({}));throw d(I,r.status,r.headers.get("Zappie-Request-Id")??void 0)}}async json(e){try{return await e.json()}catch(o){throw o instanceof Error&&o.name==="AbortError"?o:new a("server_error","The storefront service returned invalid JSON",{status:e.status,cause:o})}}async quote(e,o){let n={...e,idempotencyKey:e.idempotencyKey??await i(JSON.stringify(o))};return await this.json(await this.request("/quote",n,void 0,o))}async getStore(e$1){let o$1=import('./transport/store.js').catch(r=>{throw new a("server_error","Could not load the storefront store mapper",{cause:r})}),n$1=this.request("/store",e$1).then(r=>this.json(r)),[{mapStore:i},p$1]=await Promise.all([o$1,n$1]);return i(p$1,j,k,l,q,p,e,o,m,n)}async getMenu(e){let o,n=new Set,i,p;do{let r=new URLSearchParams({branch:e.branchId,...e.metadataOnly?{metadata_only:"true"}:{},...o?{cursor:o}:{}}),a$1=await this.request(`/menus?${r}`,e,o?void 0:e.ifNoneMatch);if(a$1.status===304){if(o)throw new a("server_error","Unexpected 304 on a continuation page");return {notModified:true,...a$1.headers.get("ETag")?{etag:a$1.headers.get("ETag")}:{}}}let s$1=j(await this.json(a$1)),c=s(s$1,e.branchId);if(e.metadataOnly){if(Object.keys(c.items).length||s$1.next_cursor)throw new a("server_error","Invalid metadata response");return {menu:{...c,completeness:"partial"}}}if(!i)i=c,p=a$1.headers.get("ETag")??void 0;else {if(c.version!==i.version)throw new a("server_error","Menu changed while fetching pages; retry the read");Object.assign(i.items,c.items);for(let g of c.categories){let I=i.categories.find(d=>d.id===g.id);I?I.itemIds=[...new Set([...I.itemIds,...g.itemIds])]:i.categories.push(g);}for(let g of c.menus??[]){let I=i.menus?.find(d=>d.id===g.id);I?I.categoryIds=[...new Set([...I.categoryIds,...g.categoryIds])]:i.menus?.push(g);}}if(o=typeof s$1.next_cursor=="string"&&s$1.next_cursor?s$1.next_cursor:void 0,o){if(n.has(o))throw new a("server_error","Repeated menu pagination cursor");n.add(o);}}while(o);i.menus&&i.menus.length>1&&(i.id=`branch:${e.branchId}`,i.name="Catalogue",delete i.schedule);for(let r of i.categories)for(let a$1 of r.itemIds)if(!Object.prototype.hasOwnProperty.call(i.items,a$1))throw new a("server_error","Category refers to a missing item");return Object.keys(i.items).length>2e3&&console.warn("Zappie menu contains more than 2,000 items"),{menu:i,...p?{etag:p}:{}}}async getSelectedMenu(e){return (await import('./transport/selected-menu.js')).selectedMenu(e,o=>this.request(o,e,e.ifNoneMatch),o=>this.json(o),s,()=>new a("server_error","Invalid selected menu"))}async search(e){return (await import('./transport/search.js')).searchPage(e,async o=>this.json(await this.request(o,e)),s,()=>new a("server_error","Invalid search page"))}async getCategoryPage(e){let o=new URLSearchParams({branch:e.branchId,...e.cursor?{cursor:e.cursor}:{}}),n=await this.json(await this.request(`/menus/${encodeURIComponent(e.menuId)}/categories/${encodeURIComponent(e.categoryId)}/items?${o}`,e));return (await import('./transport/category-page.js')).categoryPage(j(n),e,s,()=>new a("server_error","Invalid category page"))}async getMenuVersion(e){let o=j(await this.json(await this.request(`/menus/version?${new URLSearchParams({branch:e.branchId})}`,e)));if(typeof o.menu_version!="string"||typeof o.availability_hash!="string")throw new a("server_error","Invalid menu version response");return {version:o.menu_version,availabilityHash:o.availability_hash}}async getItem(e){let o=r(await this.json(await this.request(`/items/${encodeURIComponent(e.itemId)}?${new URLSearchParams({branch:e.branchId})}`,e)));if(o.id!==e.itemId)throw new a("server_error","Item response identity does not match the request");return o}};function nt(t,e=false){let o=We(t,e),n=Object.freeze({...t,version:t.version??Me,telemetry:t.telemetry??true}),i=t.transport??new le({...t.baseUrl?{baseUrl:t.baseUrl}:{},...t.fetch?{fetch:t.fetch}:{}}),p=Be(),r=new ve(f=>p.emit("error",{error:f})),a$1=f=>({key:n.key,version:n.version,...f?{signal:f}:{}}),s={get:(f={})=>r.get("store",async w=>({value:await i.getStore(a$1(w))}),f.signal),peek:()=>r.snapshot("store").value},c=(f,w)=>{let q=w??n.branch,R=q?f.branches.find(k=>k.id===q||k.slug===q):f.branches.find(k=>k.isDefault)??f.branches[0];if(!R)throw new a("branch_not_found","No matching storefront branch",{param:"branch"});return R},g,I=f=>{let w=s.peek();if(w)return c(w,f).id;let q=f??n.branch;return g&&(q===void 0||q===n.branch||q===g)?g:q??"default"},d=f=>`menu:${I(f)}`,b={async search(f,w={}){if(!i.search)throw new a("invalid_request","Transport does not support search");let q=c(await s.get(w),w.branch);return i.search({...a$1(w.signal),branchId:q.id,query:f,...w.cursor?{cursor:w.cursor}:{}})},async get(f={}){let w=c(await s.get(f),f.branch);return r.get(`menu:${w.id}${f.metadataOnly?":partial":""}`,async(q,R)=>{let k=await i.getMenu({...a$1(q),branchId:w.id,...f.metadataOnly?{metadataOnly:true}:{},...R.etag?{ifNoneMatch:R.etag}:{}});if("notModified"in k){if(!R.value)throw new a("server_error","Received 304 without a cached menu");return {value:R.value,...k.etag??R.etag?{etag:k.etag??R.etag}:{}}}if(!f.metadataOnly&&k.menu.completeness==="partial")throw new a("server_error","Partial catalogue cannot satisfy a complete read");if(k.menu.branchId!==w.id)throw new a("server_error","Menu belongs to a different branch");return {value:k.menu,etag:k.etag??k.menu.version,onStored:()=>{R.value&&R.value.version!==k.menu.version&&p.emit("menu:updated",{branchId:w.id,version:k.menu.version});}}},f.signal)},peek:f=>r.snapshot(d(f)).value??r.snapshot(`${d(f)}:partial`).value,async page(f,w,q={}){if(!i.getCategoryPage)throw new a("invalid_request","Transport does not support category pages");let R=c(await s.get(q),q.branch);return i.getCategoryPage({...a$1(q.signal),branchId:R.id,menuId:f,categoryId:w,...q.cursor?{cursor:q.cursor}:{}})},async version(f={}){let w=c(await s.get(f),f.branch);return i.getMenuVersion({...a$1(f.signal),branchId:w.id})},async item(f,w={}){let q=c(await s.get(w),w.branch);return (!b.peek(q.id)||b.peek(q.id)?.completeness==="partial")&&await b.get({...w,metadataOnly:true}),F(f,q.id,false,w.signal)},hydrate(f){g??(g=f.branchId);let w=r.snapshot(`menu:${f.branchId}`).value;r.set(`menu:${f.branchId}${f.completeness==="partial"?":partial":""}`,f,f.version),w&&w.version!==f.version&&p.emit("menu:updated",{branchId:f.branchId,version:f.version});}},S=new Map,M=(f,w)=>S.get(`${w}:${f}`),F=async(f,w,q=false,R)=>{let k=r.snapshot(`menu:${w}`).value;if(!q&&k&&Object.hasOwn(k.items,f))return k.items[f];let A=(j=R)=>i.getItem({...a$1(j),branchId:w,itemId:f});try{let j=q?await A():await r.get(`item:${w}:${f}`,async ie=>({value:await A(ie)}),R);return q&&r.set(`item:${w}:${f}`,j),S.set(`${w}:${f}`,j),j}catch(j){throw j.code==="item_not_found"&&(S.delete(`${w}:${f}`),r.set(`item:${w}:${f}`,void 0)),j}},P=De({menu:b,store:s,transport:i,context:a$1,peekItem:M,readItem:F}),{cart:N,setLegacyReader:U,cartCatalogue:L}=Ve({workingSet:P,config:n,menu:b,store:s,transport:i,context:a$1,events:p});return Object.freeze({cart:N,config:n,mode:o,store:s,menu:b,format:f,on:p.on,_internal:{cartCatalogue:L,setLegacyReader:U,transport:i,cache:r,emit:p.emit,menuKey:d,hydrateStore:f=>r.set("store",f)}})}function rt(t){let e=nt(t);return e.mode==="test"&&typeof window<"u"&&import('./debug.js').then(({installDebug:o})=>o(e)),e}function Ge(t){return Number.isInteger(t)&&t>=0&&t<=99?t:0}function it(t,e){let o=Y(t,e),n=be(t,o).filter(s=>s.isAvailable!==false),i=X(t,o)?.id,p=(o.choices??[]).filter(({groupId:s,choiceId:c})=>n.some(g=>g.id===s&&g.choices.some(I=>I.id===c))).map(s=>({...s,quantity:Ge(s.quantity)})),r=K(t,{choices:p,...i?{variantId:i}:{}}),a=h(r,Ge(o.quantity));return {groups:n,unitPrice:r,total:a}}var an="0.0.0";
|
|
2
|
-
export{B as a,K as b,we as c,ee as d,ze as e,Ye as f,Me as g,We as h,te as i,ke as j,le as k,nt as l,rt as m,it as n,an as o};//# sourceMappingURL=chunk-VG7NKIKR.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cart/errors.ts","../src/cart/price.ts","../src/cart/source-menu.ts","../src/cart/validate.ts","../src/cart/reconcile.ts","../src/cart/storage.ts","../src/cart/wire.ts","../src/cart/index.ts","../src/cart/working-set.ts","../src/config.ts","../src/internal/abort.ts","../src/internal/cache.ts","../src/internal/emitter.ts","../src/transport/rest.ts","../src/client.ts","../src/cart/preview.ts","../src/index.ts"],"names":["ZappieCartError","ZappieError","issues","estimateUnitPrice","item","line","variant","v","extras","selected","group","g","choice","c","multiplyMoney","sumMoney","resolveSourceMenu","menu","itemId","menuId","categories","sources","placements","candidates","source","p","id","issue","code","message","fixes","groupId","effectiveGroups","input","ids","required","min","max","rule","chosen","normalizeInput","inactive","resolveVariant","attrs","matches","validInput","kind","value","validateLine","raw","ctx","quantity","step","lower","upper","nearest","groups","missing","choices","text","hybrid","isInput","fix","count","sum","n","lineInput","freezeLine","reconcile","lines","branch","currency","previous","priced","result","old","i","variantId","unitPrice","money","linePriced","format","pending","l","storedMoney","parseCart","t","validFulfilment","f","a","s","createCartStorage","provided","warn","storage","initialized","failed","warned","memory","warning","access","fn","fallback","key","area","prefix","current","ttl","keys","_","index","wireLine","wireFulfilment","EMPTY_CART","deepFreeze","child","identity","b","createCart","deps","config","menus","store","events","snapshot","updatedAt","timer","revision","quoteRevision","moveSequence","refreshSequence","mounted","detach","hydration","lifecycle","legacy","listeners","scope","keyFor","readSaved","quotes","loadingQuotes","quoteClient","createQuoteClient","error","publish","patch","asError","attention","quote","cancel","persist","schedule","cart","recompute","subtotal","changed","choose","found","load","writeBack","saved","idle","fulfilment","ensure","loaded","migrated","refresh","seq","request","rev","candidate","validated","addedAt","problems","byte","offMenu","branchId","version","life","target","inputs","onStorage","event","cached","onFocus","active","existing","lineId","duplicate","oldKey","oldLines","kept","dropped","opts","body","attempt","local","remote","q","problem","accepted","blocking","reader","createWorkingSet","compose","metadata","items","category","m","peek","fresh","response","API_VERSION","validateConfig","secret","match","abortReason","signal","throwIfAborted","delay","ms","resolve","reject","abort","REFRESH_BACKOFF_MS","EMPTY","Cache","onError","etag","entry","loader","age","background","flight","controller","loading","done","finish","callback","createEmitter","set","payload","MAX_RETRY_WAIT_MS","RestTransport","url","init","path","retry","seconds","wait","tooLong","errorBody","wireError","cause","payloadKey","mapper","mapStore","record","list","hours","mapMoney","opt","isString","isBoolean","cursor","seen","output","query","page","mapMenu","section","mapItem","buildClient","mode","transport","cache","resolveBranch","requested","hydratedBranch","branchKey","menuKey","categoryId","readItem","itemValues","peekItem","complete","requestSignal","workingSet","setLegacyReader","cartCatalogue","createZappie","client","installDebug","previewQuantity","previewItem","choiceId","selection","total","VERSION"],"mappings":"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","file":"chunk-VG7NKIKR.js","sourcesContent":["import { ZappieError } from \"../errors\";\nimport type { CartIssue } from \"./types\";\nexport class ZappieCartError extends ZappieError {\n constructor(readonly issues: CartIssue[]) {\n super(\"cart_invalid\", issues[0]?.message ?? \"The cart needs attention\");\n this.name = \"ZappieCartError\";\n }\n}\n","import { ZappieError } from \"../errors\";\nimport { multiplyMoney, sumMoney } from \"../internal/money-math\";\nimport type { Item } from \"../models\";\nimport type { CartLine } from \"./types\";\n/**\n * Estimate one item's price from its selected variant and non-attribute option quantities.\n * Uses the item price when no variant is selected and throws if a selected variant or option is missing.\n *\n * @param item - The catalogue item containing prices and options.\n * @param line - The variant and choices to price. Each option quantity is treated as at least one.\n * @returns A local unit-price estimate. Use a server quote for checkout totals.\n */\nexport function estimateUnitPrice(\n item: Item,\n line: Pick<CartLine, \"choices\" | \"variantId\">,\n) {\n const variant = line.variantId\n ? item.variants.find((v) => v.id === line.variantId)\n : undefined;\n if (line.variantId && !variant) {\n throw new ZappieError(\"invalid_request\", \"The selected variant is missing\");\n }\n const extras = line.choices.flatMap((selected) => {\n const group = item.optionGroups.find((g) => g.id === selected.groupId);\n const choice = group?.choices.find((c) => c.id === selected.choiceId);\n if (!group || !choice) {\n throw new ZappieError(\n \"invalid_request\",\n \"The selected option is missing\",\n );\n }\n return group.isAttribute\n ? []\n : [multiplyMoney(choice.price, Math.max(selected.quantity, 1))];\n });\n return sumMoney(extras, variant?.price ?? item.price);\n}\n","import type { Menu } from \"../models\";\n/** Never guess the first of several menus: their schedules may differ. */\nexport function resolveSourceMenu(\n menu: Menu,\n itemId: string,\n menuId?: string,\n): string | undefined {\n const categories = menu.categories.filter((c) => c.itemIds.includes(itemId));\n const sources = menu.menus ?? [\n { id: menu.id, categoryIds: menu.categories.map((c) => c.id) },\n ];\n const placements = menu.items[itemId]?.placements;\n const candidates = sources.filter(\n (source) =>\n (!placements ||\n placements.some(\n (p) =>\n p.menuId === source.id && source.categoryIds.includes(p.categoryId),\n )) &&\n source.categoryIds.some((id) => categories.some((c) => c.id === id)),\n );\n if (menuId !== undefined) {\n return typeof menuId === \"string\" &&\n menuId.trim().length > 0 &&\n menuId.length <= 256 &&\n candidates.some((source) => source.id === menuId)\n ? menuId\n : undefined;\n }\n return candidates.length === 1 ? candidates[0]!.id : undefined;\n}\n","import type { Branch, Item, Menu, OptionGroup } from \"../models\";\nimport { resolveSourceMenu } from \"./source-menu\";\nimport type { CartFix, CartIssue, CartIssueCode, CartLineInput } from \"./types\";\nexport function issue(\n code: CartIssueCode,\n message: string,\n fixes: CartFix[] = [],\n groupId?: string,\n): CartIssue {\n return {\n code,\n severity: \"blocking\",\n message,\n fixes,\n source: \"local\",\n ...(groupId ? { groupId } : {}),\n };\n}\n/** Conditions override base rules in declaration order, exactly like resolveEffectiveAddons. */\nexport function effectiveGroups(\n item: Item,\n input: CartLineInput,\n): OptionGroup[] {\n const selected = new Map<string, Set<string>>();\n for (const choice of input.choices ?? []) {\n const ids = selected.get(choice.groupId) ?? new Set<string>();\n ids.add(choice.choiceId);\n selected.set(choice.groupId, ids);\n }\n return item.optionGroups.map((group) => {\n let required = group.required;\n let { min, max } = group.selection;\n for (const rule of group.conditions ?? []) {\n const chosen = selected.get(rule.groupId) ?? new Set<string>();\n const matches = rule.count\n ? rule.count.op === \"eq\"\n ? chosen.size === rule.count.value\n : rule.count.op === \"gte\"\n ? chosen.size >= rule.count.value\n : chosen.size <= rule.count.value\n : chosen.size > 0 &&\n rule.choiceIds.length > 0 &&\n (rule.match === \"all\"\n ? rule.choiceIds.every((id) => chosen.has(id))\n : rule.choiceIds.some((id) => chosen.has(id)));\n if (!matches) {\n continue;\n }\n required = rule.setRequired ?? required;\n min = rule.setMin ?? min;\n if (rule.setMax != null) {\n max = rule.setMax > 0 ? rule.setMax : undefined;\n }\n }\n return {\n ...group,\n required,\n selection: { min, ...(max !== undefined ? { max } : {}) },\n };\n });\n}\nexport function normalizeInput(\n item: Item,\n input: CartLineInput,\n): CartLineInput {\n const inactive = new Set(\n item.optionGroups.filter((g) => g.isAvailable === false).map((g) => g.id),\n );\n return {\n ...input,\n quantity: input.quantity ?? item.quantity.min,\n choices: (input.choices ?? [])\n .filter((c) => !inactive.has(c.groupId))\n .map((c) => ({ ...c, quantity: c.quantity ?? 1 })),\n inputs: Object.fromEntries(\n Object.entries(input.inputs ?? {}).filter(([id]) => !inactive.has(id)),\n ),\n };\n}\nexport function resolveVariant(item: Item, input: CartLineInput) {\n const attrs = item.optionGroups.filter((g) => g.isAttribute);\n const matches = item.variants.filter(\n (variant) =>\n (!input.variantId || variant.id === input.variantId) &&\n attrs.every((group) => {\n const selected =\n input.choices?.filter((c) => c.groupId === group.id) ?? [];\n return (\n selected.length === 1 &&\n variant.attributeChoices[group.id] === selected[0]!.choiceId\n );\n }),\n );\n return matches.length === 1 ? matches[0] : undefined;\n}\nfunction validInput(kind: OptionGroup[\"kind\"], value: string): boolean {\n switch (kind) {\n case \"number\":\n return Number.isFinite(Number(value));\n case \"date\":\n return (\n /^\\d{4}-\\d{2}-\\d{2}$/.test(value) &&\n Number.isFinite(Date.parse(value)) &&\n new Date(value).toISOString().slice(0, 10) === value\n );\n case \"time\":\n return /^([01]\\d|2[0-3]):[0-5]\\d(:[0-5]\\d)?$/.test(value);\n case \"toggle\":\n return [\"true\", \"false\"].includes(value.toLowerCase());\n default:\n return true;\n }\n}\n/**\n * Check a cart line against catalogue membership, availability, quantities and option rules.\n * Applies conditional group rules and checks that the selection resolves to an available variant.\n *\n * @param item - The current item, or undefined if it is no longer available.\n * @param raw - The shopper's proposed line.\n * @param ctx - The menu and branch context for validation.\n * @returns Local blocking issues with suggested fixes, or an empty array for a valid line.\n */\nexport function validateLine(\n item: Item | undefined,\n raw: CartLineInput,\n ctx: { menu: Menu; branch: Branch },\n): CartIssue[] {\n if (\n !item ||\n item.id !== raw.itemId ||\n !Object.hasOwn(ctx.menu.items, raw.itemId)\n ) {\n return [\n issue(\"item_unavailable\", \"This item is no longer on the menu\", [\n { action: \"remove_line\" },\n ]),\n ];\n }\n const issues: CartIssue[] = [];\n if (!resolveSourceMenu(ctx.menu, raw.itemId, raw.menuId)) {\n // Shoppers can't pick a menu from the cart, so the message names the fix.\n issues.push(\n issue(\n \"item_unavailable\",\n raw.menuId === undefined\n ? `${item.name} is on more than one menu. Remove it and add it again from the menu you want.`\n : `${item.name} is no longer on the menu it was added from.`,\n [{ action: \"remove_line\" }],\n ),\n );\n }\n if (!item.isAvailable) {\n issues.push(\n issue(\"item_unavailable\", `${item.name} is unavailable`, [\n { action: \"remove_line\" },\n ]),\n );\n }\n const input = normalizeInput(item, raw);\n const quantity = input.quantity!;\n const { min, step } = item.quantity;\n const max = Math.min(item.quantity.max ?? 99, 99);\n if (\n !Number.isInteger(quantity) ||\n quantity < min ||\n quantity > max ||\n quantity % step !== 0\n ) {\n const lower = Math.ceil(min / step) * step;\n const upper = Math.floor(max / step) * step;\n const nearest = Math.max(\n lower,\n Math.min(\n upper,\n Math.round((Number.isFinite(quantity) ? quantity : min) / step) * step,\n ),\n );\n issues.push(\n issue(\n \"quantity_limit\",\n `Choose a valid quantity of ${item.name} (${min}–${max}, step ${step})`,\n lower <= upper ? [{ action: \"set_quantity\", quantity: nearest }] : [],\n ),\n );\n }\n if ((input.note?.length ?? 0) > 280) {\n issues.push(issue(\"option_limit\", \"Notes must be at most 280 characters\"));\n }\n for (const choice of input.choices ?? []) {\n if (!item.optionGroups.some((g) => g.id === choice.groupId)) {\n issues.push(\n issue(\n \"option_unavailable\",\n \"This option group no longer exists\",\n [{ action: \"remove_line\" }],\n choice.groupId,\n ),\n );\n }\n }\n for (const id of Object.keys(input.inputs ?? {})) {\n if (!item.optionGroups.some((g) => g.id === id)) {\n issues.push(\n issue(\n \"option_unavailable\",\n \"This input group no longer exists\",\n [{ action: \"remove_line\" }],\n id,\n ),\n );\n }\n }\n const groups = effectiveGroups(item, input);\n const missing = groups.filter(\n (g) =>\n g.isAvailable !== false &&\n g.required &&\n !(input.choices ?? []).some((c) => c.groupId === g.id) &&\n !(input.inputs?.[g.id] ?? \"\").trim(),\n );\n // The host reports missing required groups before checking counts of selected options.\n if (missing.length) {\n return [\n ...issues,\n ...missing.map((g) =>\n issue(\n \"option_required\",\n `Choose ${g.name}`,\n [{ action: \"choose_option\", groupId: g.id }],\n g.id,\n ),\n ),\n ];\n }\n for (const group of groups) {\n if (group.isAvailable === false) {\n continue;\n }\n const choices = input.choices?.filter((c) => c.groupId === group.id) ?? [];\n const text = input.inputs?.[group.id] ?? \"\";\n const value = text.trim();\n const hybrid = group.isInformational && group.kind === \"select\";\n const isInput =\n group.kind !== \"select\" || (hybrid && !group.choices.length);\n const fix: CartFix[] = [{ action: \"choose_option\", groupId: group.id }];\n if (group.required && !choices.length && !value) {\n issues.push(\n issue(\"option_required\", `Choose ${group.name}`, fix, group.id),\n );\n }\n if (value && ((!isInput && !hybrid) || choices.length > 0)) {\n issues.push(\n issue(\n \"option_limit\",\n `Choose either an option or a response for ${group.name}`,\n fix,\n group.id,\n ),\n );\n }\n if (\n (isInput || hybrid) &&\n (text.length > (group.input?.maxLength ?? 500) ||\n (value && !validInput(group.kind, value)))\n ) {\n issues.push(\n issue(\n \"option_limit\",\n `Enter a valid response for ${group.name}`,\n fix,\n group.id,\n ),\n );\n }\n const count = choices.reduce((sum, c) => sum + (c.quantity ?? 1), 0);\n if (\n choices.length &&\n (isInput ||\n count < group.selection.min ||\n count > (group.selection.max ?? Infinity) ||\n new Set(choices.map((c) => c.choiceId)).size !== choices.length)\n ) {\n issues.push(\n issue(\n \"option_limit\",\n `Check the number of options for ${group.name}`,\n fix,\n group.id,\n ),\n );\n }\n for (const selected of choices) {\n const choice = group.choices.find((c) => c.id === selected.choiceId);\n if (!choice?.isAvailable) {\n issues.push(\n issue(\n \"option_unavailable\",\n `An option in ${group.name} is unavailable`,\n [\n { action: \"choose_other_option\", groupId: group.id },\n { action: \"remove_line\" },\n ],\n group.id,\n ),\n );\n }\n const n = selected.quantity ?? 1;\n if (\n !Number.isInteger(n) ||\n n < (choice?.quantity?.min ?? 1) ||\n n > (choice?.quantity?.max ?? 99)\n ) {\n issues.push(\n issue(\n \"option_limit\",\n `Check the option quantity for ${group.name}`,\n fix,\n group.id,\n ),\n );\n }\n }\n }\n const variant = resolveVariant(item, input);\n if (!variant?.isAvailable) {\n const groupId = item.optionGroups.find((g) => g.isAttribute)?.id;\n issues.push(\n issue(\n \"option_limit\",\n \"Choose an available variant\",\n groupId\n ? [{ action: \"choose_option\", groupId }]\n : [{ action: \"remove_line\" }],\n groupId,\n ),\n );\n }\n return issues;\n}\n","import { multiplyMoney } from \"../internal/money-math\";\nimport type { Branch, Menu } from \"../models\";\nimport type { Currency } from \"../money\";\nimport { format, money } from \"../money\";\nimport { estimateUnitPrice } from \"./price\";\nimport type { StoredLine } from \"./storage\";\nimport type { CartIssue, CartLine, CartLineInput } from \"./types\";\nimport {\n issue,\n normalizeInput,\n resolveVariant,\n validateLine,\n} from \"./validate\";\nexport function lineInput(line: CartLine): CartLineInput {\n return {\n itemId: line.itemId,\n ...(line.menuId !== undefined ? { menuId: line.menuId } : {}),\n quantity: line.quantity,\n choices: line.choices.map((c) => ({ ...c })),\n inputs: { ...line.inputs },\n ...(line.variantId ? { variantId: line.variantId } : {}),\n ...(line.note !== undefined ? { note: line.note } : {}),\n };\n}\nexport function freezeLine(line: CartLine): CartLine {\n return Object.freeze({\n ...line,\n choices: Object.freeze(line.choices.map((c) => Object.freeze({ ...c }))),\n inputs: Object.freeze({ ...line.inputs }),\n });\n}\nexport function reconcile(\n lines: readonly (CartLine | StoredLine)[],\n menu: Menu,\n branch: Branch,\n currency: Currency,\n previous: readonly CartIssue[] = [],\n) {\n const issues: CartIssue[] = [];\n let priced = true;\n const result = lines.map((old): CartLine => {\n const item = Object.hasOwn(menu.items, old.itemId)\n ? menu.items[old.itemId]\n : undefined;\n const raw = {\n ...old,\n choices: old.choices?.map((c) => ({ ...c })),\n inputs: { ...old.inputs },\n } as CartLineInput;\n const input = item ? normalizeInput(item, raw) : raw;\n issues.push(\n ...validateLine(item, input, { menu, branch }).map((i) => ({\n ...i,\n lineId: old.id,\n })),\n );\n const variantId =\n input.variantId ?? (item ? resolveVariant(item, input)?.id : undefined);\n let unitPrice = money(0, currency);\n let linePriced = true;\n try {\n if (!item) {\n throw new Error(\"Missing item\");\n }\n unitPrice = estimateUnitPrice(item, {\n choices: (input.choices ?? []).map((c) => ({\n ...c,\n quantity: c.quantity ?? 1,\n })),\n ...(variantId ? { variantId } : {}),\n });\n } catch {\n priced = false;\n linePriced = false;\n }\n if (\n old.unitPrice &&\n old.unitPrice.amountMinor !== unitPrice.amountMinor &&\n item &&\n linePriced\n ) {\n issues.push({\n ...issue(\n \"price_changed\",\n `${item.name} is now ${format.money(unitPrice)}`,\n [{ action: \"accept_price\" }, { action: \"remove_line\" }],\n ),\n severity: \"warning\",\n lineId: old.id,\n data: { previous: old.unitPrice, current: unitPrice },\n });\n }\n return freezeLine({\n id: old.id,\n itemId: old.itemId,\n ...(input.menuId !== undefined ? { menuId: input.menuId } : {}),\n name: item?.name ?? old.name,\n quantity: input.quantity ?? 1,\n choices: (input.choices ?? []).map((c) => ({\n ...c,\n quantity: c.quantity ?? 1,\n })),\n inputs: input.inputs ?? {},\n ...(variantId ? { variantId } : {}),\n ...(input.note !== undefined ? { note: input.note } : {}),\n unitPrice,\n lineSubtotal: multiplyMoney(unitPrice, input.quantity ?? 1),\n addedAt: old.addedAt,\n });\n });\n for (const pending of previous) {\n if (\n pending.code === \"price_changed\" &&\n result.some((l) => l.id === pending.lineId) &&\n !issues.some(\n (i) => i.code === pending.code && i.lineId === pending.lineId,\n )\n ) {\n issues.push(pending);\n }\n }\n return { lines: Object.freeze(result), issues, priced };\n}\n","import type { StorageLike } from \"../config\";\nimport type { Money } from \"../money\";\nimport { money } from \"../money\";\nimport type { CartFulfilment, CartLineInput } from \"./types\";\nexport type StoredLine = CartLineInput & {\n id: string;\n name: string;\n addedAt: string;\n unitPrice?: Money;\n};\nexport type StoredCart = {\n v: 1;\n lines: StoredLine[];\n fulfilment: CartFulfilment | null;\n promoCode: string | null;\n menuVersion: string;\n updatedAt: number;\n};\nfunction storedMoney(value: Money | undefined): Money | undefined {\n try {\n return value && money(value.amountMinor, value.currency);\n } catch {\n return undefined;\n }\n}\nexport function parseCart(raw: string): StoredCart {\n const v = JSON.parse(raw) as StoredCart;\n if (\n !v ||\n v.v !== 1 ||\n !Array.isArray(v.lines) ||\n v.lines.length > 100 ||\n !Number.isFinite(v.updatedAt) ||\n typeof v.menuVersion !== \"string\" ||\n (v.promoCode !== null && typeof v.promoCode !== \"string\")\n ) {\n throw new Error(\"Invalid saved cart\");\n }\n const ids = new Set<string>();\n for (const line of v.lines) {\n if (\n !line ||\n typeof line.id !== \"string\" ||\n ids.has(line.id) ||\n typeof line.itemId !== \"string\" ||\n typeof line.name !== \"string\" ||\n !Number.isFinite(Date.parse(line.addedAt)) ||\n !Number.isInteger(line.quantity) ||\n line.quantity! < 1 ||\n line.quantity! > 99 ||\n (line.note !== undefined &&\n (typeof line.note !== \"string\" || line.note.length > 280)) ||\n (line.menuId !== undefined &&\n (typeof line.menuId !== \"string\" ||\n !line.menuId.trim() ||\n line.menuId.length > 256)) ||\n (line.variantId !== undefined && typeof line.variantId !== \"string\")\n ) {\n throw new Error(\"Invalid saved cart line\");\n }\n ids.add(line.id);\n if (\n !Array.isArray(line.choices) ||\n line.choices.length > 1000 ||\n line.choices.some(\n (c) =>\n !c ||\n typeof c.groupId !== \"string\" ||\n typeof c.choiceId !== \"string\" ||\n !Number.isInteger(c.quantity) ||\n c.quantity! < 1 ||\n c.quantity! > 99,\n )\n ) {\n throw new Error(\"Invalid saved choices\");\n }\n if (\n !line.inputs ||\n typeof line.inputs !== \"object\" ||\n Array.isArray(line.inputs) ||\n Object.values(line.inputs).some((t) => typeof t !== \"string\")\n ) {\n throw new Error(\"Invalid saved inputs\");\n }\n }\n if (v.fulfilment !== null && !validFulfilment(v.fulfilment)) {\n throw new Error(\"Invalid saved fulfilment\");\n }\n return {\n v: 1,\n lines: v.lines.map((l) => {\n const unitPrice = storedMoney(l.unitPrice);\n return {\n id: l.id,\n itemId: l.itemId,\n ...(l.menuId !== undefined ? { menuId: l.menuId } : {}),\n name: l.name,\n addedAt: l.addedAt,\n ...(unitPrice ? { unitPrice } : {}),\n quantity: l.quantity!,\n choices: l.choices!,\n inputs: l.inputs!,\n ...(l.variantId ? { variantId: l.variantId } : {}),\n ...(l.note !== undefined ? { note: l.note } : {}),\n };\n }),\n fulfilment: v.fulfilment,\n promoCode: v.promoCode,\n menuVersion: v.menuVersion,\n updatedAt: v.updatedAt,\n };\n}\nexport function validFulfilment(f: CartFulfilment): boolean {\n if (\n !f ||\n ![\"pickup\", \"delivery\", \"dine_in\"].includes(f.type) ||\n typeof f.branchId !== \"string\"\n ) {\n return false;\n }\n if (\n \"scheduledFor\" in f &&\n f.scheduledFor !== undefined &&\n !Number.isFinite(Date.parse(f.scheduledFor))\n ) {\n return false;\n }\n if (f.type === \"delivery\") {\n const a = f.address;\n if (!a || typeof a.line1 !== \"string\" || !a.line1.trim()) {\n return false;\n }\n if (\n [a.line2, a.city, a.placeId, a.instructions].some(\n (s) => s !== undefined && typeof s !== \"string\",\n )\n ) {\n return false;\n }\n if (\n a.coordinates &&\n (!Number.isFinite(a.coordinates.lat) ||\n !Number.isFinite(a.coordinates.lng) ||\n Math.abs(a.coordinates.lat) > 90 ||\n Math.abs(a.coordinates.lng) > 180)\n ) {\n return false;\n }\n }\n return (\n f.type !== \"dine_in\" || f.table === undefined || typeof f.table === \"string\"\n );\n}\n/** Lazy access: constructing a client or rendering it never reads browser storage. */\nexport function createCartStorage(\n provided: StorageLike | undefined,\n warn: (message: string) => void,\n) {\n let storage: StorageLike | undefined;\n let initialized = false;\n let failed = false;\n let warned = false;\n const memory = new Map<string, string>();\n const warning = (message: string) => {\n if (!warned) {\n warned = true;\n warn(message);\n }\n };\n const access = <T>(fn: (storage: StorageLike) => T, fallback: () => T): T => {\n try {\n if (!initialized) {\n initialized = true;\n storage =\n provided ??\n (typeof window === \"undefined\" ? undefined : window.localStorage);\n }\n if (storage && !failed) {\n return fn(storage);\n }\n } catch {\n failed = true;\n warning(\"Cart storage unavailable; using memory for this client\");\n }\n return fallback();\n };\n return {\n warning,\n read(key: string): string | null {\n return access(\n (s) => {\n const value = s.getItem(key);\n if (value !== null) {\n memory.set(key, value);\n } else {\n memory.delete(key);\n }\n return value;\n },\n () => memory.get(key) ?? null,\n );\n },\n write(key: string, value: string) {\n memory.set(key, value);\n access(\n (s) => s.setItem(key, value),\n () => {},\n );\n },\n remove(key: string) {\n memory.delete(key);\n access(\n (s) => s.removeItem(key),\n () => {},\n );\n },\n accepts(area: Storage | null) {\n return !failed && (!area || area === storage);\n },\n sweep(prefix: string, current: string, ttl: number) {\n access(\n (s) => {\n const keys = Array.from({ length: s.length ?? 0 }, (_, index) =>\n s.key?.(index),\n );\n for (const key of keys) {\n if (!key || key === current || !key.startsWith(prefix)) {\n continue;\n }\n try {\n const raw = s.getItem(key);\n if (raw && Date.now() - parseCart(raw).updatedAt > ttl) {\n s.removeItem(key);\n }\n } catch {\n // A malformed sibling belongs to this cart namespace and cannot be restored.\n s.removeItem(key);\n }\n }\n },\n () => {},\n );\n },\n };\n}\n","import type {\n CartFulfilment,\n CartLine,\n WireFulfilment,\n WireLine,\n} from \"./types\";\nexport function wireLine(line: CartLine): WireLine {\n return {\n line_id: line.id,\n item_id: line.itemId,\n ...(line.menuId !== undefined ? { menu_id: line.menuId } : {}),\n quantity: line.quantity,\n ...(line.variantId ? { variant_id: line.variantId } : {}),\n options: line.choices.map((c) => ({\n group_id: c.groupId,\n choice_id: c.choiceId,\n quantity: c.quantity,\n })),\n inputs: { ...line.inputs },\n ...(line.note !== undefined ? { note: line.note } : {}),\n };\n}\n/**\n * Convert a cart fulfilment selection to the API field names used by quotes and checkout.\n * Includes delivery address details, a schedule or a dine-in table when present.\n *\n * @param f - The shopper's selected fulfilment.\n * @returns Fulfilment fields without the branch ID. Checkout sessions accept pickup or delivery only.\n */\nexport function wireFulfilment(f: CartFulfilment): WireFulfilment {\n return {\n type: f.type,\n ...(\"scheduledFor\" in f && f.scheduledFor\n ? { scheduled_for: f.scheduledFor }\n : {}),\n ...(f.type === \"dine_in\" && f.table ? { table: f.table } : {}),\n ...(f.type === \"delivery\"\n ? {\n address: {\n line1: f.address.line1,\n ...(f.address.line2 ? { line2: f.address.line2 } : {}),\n ...(f.address.city ? { city: f.address.city } : {}),\n ...(f.address.placeId ? { place_id: f.address.placeId } : {}),\n ...(f.address.instructions\n ? { instructions: f.address.instructions }\n : {}),\n ...(f.address.coordinates\n ? {\n lat: f.address.coordinates.lat,\n lng: f.address.coordinates.lng,\n }\n : {}),\n },\n }\n : {}),\n };\n}\n","import type { MenuResource, StoreResource } from \"../client\";\nimport type { ZappieConfig } from \"../config\";\nimport { asError, ZappieError } from \"../errors\";\nimport type { createEmitter } from \"../internal/emitter\";\nimport { multiplyMoney, sumMoney } from \"../internal/money-math\";\nimport type { Branch, Menu } from \"../models\";\nimport { money } from \"../money\";\nimport type { RequestCtx, Transport } from \"../transport/types\";\nimport { ZappieCartError } from \"./errors\";\nimport { estimateUnitPrice } from \"./price\";\nimport type { QuoteClient } from \"./quote-client\";\nimport { freezeLine, lineInput, reconcile } from \"./reconcile\";\nimport type { StoredCart, StoredLine } from \"./storage\";\nimport { createCartStorage, parseCart, validFulfilment } from \"./storage\";\nimport type {\n CartIssue,\n CartLine,\n CartLineInput,\n CartModule,\n CartSnapshot,\n Quote,\n} from \"./types\";\nimport {\n issue,\n normalizeInput,\n resolveVariant,\n validateLine,\n} from \"./validate\";\nimport { wireFulfilment, wireLine } from \"./wire\";\nimport type { createWorkingSet } from \"./working-set\";\nexport const EMPTY_CART: CartSnapshot = Object.freeze({\n lines: Object.freeze([]),\n count: 0,\n subtotal: null,\n fulfilment: null,\n promoCode: null,\n state: { status: \"ready\" as const },\n issues: Object.freeze([]),\n isHydrated: false,\n});\nfunction deepFreeze<T>(value: T): T {\n if (value && typeof value === \"object\" && !Object.isFrozen(value)) {\n Object.freeze(value);\n for (const child of Object.values(value)) {\n deepFreeze(child);\n }\n }\n return value;\n}\nfunction identity(input: CartLineInput) {\n return JSON.stringify([\n input.itemId,\n input.menuId,\n input.variantId,\n input.note ?? \"\",\n [...(input.choices ?? [])].sort(\n (a, b) =>\n a.groupId.localeCompare(b.groupId) ||\n a.choiceId.localeCompare(b.choiceId),\n ),\n Object.entries(input.inputs ?? {}).sort(([a], [b]) => a.localeCompare(b)),\n ]);\n}\nexport function createCart(deps: {\n workingSet: ReturnType<typeof createWorkingSet>;\n config: ZappieConfig;\n menu: MenuResource;\n store: StoreResource;\n transport: Transport;\n context: () => RequestCtx;\n events: ReturnType<typeof createEmitter>;\n}) {\n const { config, menu: menus, store, events } = deps;\n const ttl = config.cart?.ttl ?? 7 * 24 * 60 * 60 * 1000;\n if (!Number.isFinite(ttl) || ttl <= 0) {\n throw new ZappieError(\n \"invalid_request\",\n \"Cart ttl must be positive milliseconds\",\n );\n }\n let snapshot = EMPTY_CART;\n let menu: Menu | undefined;\n let branch: Branch | undefined;\n let selected = config.branch;\n let updatedAt = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let revision = 0;\n let quoteRevision = 0;\n let moveSequence = 0;\n let refreshSequence = 0;\n let mounted = 0;\n let detach: (() => void) | undefined;\n let hydration: Promise<void> | undefined;\n let lifecycle = 0;\n let legacy:\n ((read: (key: string) => string | null) => CartLineInput[]) | undefined;\n const listeners = new Set<() => void>();\n const prefix = `zappie:cart:v1:${config.store}:`;\n const scope = config.cart?.storageScope;\n const keyFor = (id: string) => `${prefix}${id}${scope ? `:${scope}` : \"\"}`;\n const key = () => keyFor(branch!.id);\n const storage = createCartStorage(config.storage, (message) =>\n events.emit(\"warning\", { message }),\n );\n // A scoped cart adopts the branch's unscoped cart once, so only one scope inherits it.\n const readSaved = (id: string) => {\n let raw = storage.read(keyFor(id));\n if (raw === null && scope) {\n raw = storage.read(prefix + id);\n if (raw !== null) {\n storage.remove(prefix + id);\n storage.write(keyFor(id), raw);\n }\n }\n return raw;\n };\n // The quote client and response mapping load on the first quote; add/validate stay synchronous.\n let quotes: QuoteClient | undefined;\n let loadingQuotes: Promise<QuoteClient> | undefined;\n const quoteClient = () =>\n (loadingQuotes ??= import(\"./quote-client\").then(\n ({ createQuoteClient }) =>\n (quotes = createQuoteClient(deps.transport, deps.context)),\n (error: unknown) => {\n // A failed chunk load (e.g. offline) must not poison every later quote.\n loadingQuotes = undefined;\n throw error;\n },\n ));\n const publish = (patch: Partial<CartSnapshot>) => {\n snapshot = deepFreeze({\n ...snapshot,\n ...patch,\n branchId: branch?.id,\n });\n for (const fn of [...listeners]) {\n try {\n fn();\n } catch (error) {\n events.emit(\"error\", { error: asError(error) });\n }\n }\n };\n const attention = (\n issues: readonly CartIssue[],\n quote?: Quote,\n ): CartSnapshot[\"state\"] =>\n issues.some((i) => i.severity !== \"info\")\n ? { status: \"needs_attention\", issues, ...(quote ? { quote } : {}) }\n : quote\n ? { status: \"quoted\", quote }\n : { status: \"ready\" };\n const cancel = () => {\n revision++;\n quoteRevision++;\n clearTimeout(timer);\n quotes?.cancel();\n };\n const persist = () => {\n const value: StoredCart = {\n v: 1,\n lines: snapshot.lines.map((line) => ({\n ...lineInput(line),\n id: line.id,\n name: line.name,\n addedAt: line.addedAt,\n unitPrice: line.unitPrice,\n })),\n fulfilment: snapshot.fulfilment,\n promoCode: snapshot.promoCode,\n menuVersion: menu!.version,\n updatedAt,\n };\n storage.write(key(), JSON.stringify(value));\n };\n const schedule = () => {\n clearTimeout(timer);\n if (snapshot.lines.length) {\n timer = setTimeout(() => {\n void cart.quote().catch(() => {});\n }, 300);\n }\n };\n const recompute = (\n lines: readonly (CartLine | StoredLine)[],\n pending = snapshot.issues.filter((i) => i.source === \"local\"),\n patch: Partial<CartSnapshot> = {},\n ) => {\n const currency = store.peek()!.currency;\n const result = reconcile(lines, menu!, branch!, currency, pending);\n const subtotal = result.priced\n ? sumMoney(\n result.lines.map((l) => l.lineSubtotal),\n money(0, currency),\n )\n : null;\n publish({\n ...patch,\n lines: result.lines,\n count: result.lines.reduce((n, l) => n + l.quantity, 0),\n subtotal,\n issues: result.issues,\n state: attention(result.issues),\n });\n for (const i of result.issues) {\n events.emit(\"cart_issue\", { code: i.code });\n }\n };\n const changed = (\n lines: readonly (CartLine | StoredLine)[] = snapshot.lines,\n patch: Partial<CartSnapshot> = {},\n ) => {\n cancel();\n recompute(lines, undefined, patch);\n updatedAt = Date.now();\n persist();\n schedule();\n };\n const choose = (value: Menu) => {\n const found = store.peek()?.branches.find((b) => b.id === value.branchId);\n if (!found) {\n throw new ZappieError(\n \"branch_not_found\",\n \"Load the storefront branch before using its cart\",\n );\n }\n menu = value;\n branch = found;\n selected = found.id;\n };\n const load = (raw: string | null, writeBack = true) => {\n cancel();\n let saved: StoredCart | undefined;\n try {\n saved = raw ? parseCart(raw) : undefined;\n if (saved && Date.now() - saved.updatedAt > ttl) {\n saved = undefined;\n storage.remove(key());\n events.emit(\"cart_expired\", { branchId: branch!.id });\n }\n } catch {\n storage.remove(key());\n storage.warning(\"Invalid saved cart discarded\");\n }\n updatedAt = saved?.updatedAt ?? Date.now();\n const idle = Date.now() - updatedAt;\n let fulfilment = saved?.fulfilment ?? null;\n if (\n fulfilment?.branchId !== branch!.id ||\n (idle > 86_400_000 && fulfilment.type === \"delivery\")\n ) {\n fulfilment = null;\n }\n if (\n fulfilment &&\n \"scheduledFor\" in fulfilment &&\n fulfilment.scheduledFor &&\n Date.parse(fulfilment.scheduledFor) < Date.now()\n ) {\n fulfilment = { ...fulfilment };\n delete fulfilment.scheduledFor;\n }\n const lines = (saved?.lines ?? []).map((line) => ({\n ...line,\n ...(idle > 86_400_000 ? { inputs: {} } : {}),\n }));\n const result = reconcile(lines, menu!, branch!, store.peek()!.currency);\n recompute(result.lines, result.issues, {\n fulfilment,\n promoCode: saved?.promoCode ?? null,\n isHydrated: true,\n });\n // Persist privacy scrubbing and normalized prices without extending idle expiry.\n if (raw !== null && writeBack) {\n persist();\n }\n storage.sweep(prefix, key(), ttl);\n };\n const ensure = () => {\n const id =\n branch?.id ??\n store\n .peek()\n ?.branches.find(\n (b) =>\n b.id === selected ||\n b.slug === selected ||\n (!selected && b.isDefault),\n )?.id ??\n (!selected ? store.peek()?.branches[0]?.id : undefined);\n if (snapshot.isHydrated) {\n return;\n }\n const loaded = menu ?? (id ? deps.workingSet.peek(id, []) : undefined);\n if (!loaded || !store.peek()) {\n throw new ZappieError(\n \"invalid_request\",\n \"Load the store and menu before editing the cart\",\n );\n }\n choose(loaded);\n const raw = readSaved(branch!.id);\n let migrated: CartLineInput[] = [];\n if (raw === null && legacy) {\n try {\n migrated = legacy(storage.read);\n } catch {\n storage.warning(\"Invalid legacy cart discarded\");\n }\n }\n load(raw);\n if (raw === null && legacy) {\n persist();\n }\n for (const input of migrated.slice(0, 100)) {\n try {\n cart.add(input.itemId, input);\n } catch {\n events.emit(\"cart_issue\", { code: \"item_unavailable\" });\n }\n }\n };\n const refresh = async () => {\n const id = branch?.id;\n const seq = moveSequence;\n const request = ++refreshSequence;\n const rev = revision;\n if (!id || !menu) {\n return;\n }\n if (!snapshot.lines.length) {\n return;\n }\n if (menu.completeness !== \"partial\") {\n const version = await deps.transport.getMenuVersion({\n ...deps.context(),\n branchId: id,\n });\n if (version.version === menu.version) {\n return;\n }\n }\n const value = await deps.workingSet.read(\n id,\n snapshot.lines.map((l) => l.itemId),\n true,\n );\n if (\n seq !== moveSequence ||\n request !== refreshSequence ||\n rev !== revision ||\n JSON.stringify(value) === JSON.stringify(menu)\n ) {\n return;\n }\n menu = value;\n cancel();\n recompute(snapshot.lines);\n persist();\n schedule();\n };\n // Validation follows the latest copy of an item the working set holds: a\n // refreshed item can add a required option, and an add, edit or check\n // against the earlier copy would accept a line the server then rejects.\n const current = (itemId: string) => {\n const candidate = deps.workingSet.peek(branch!.id, [\n ...snapshot.lines.map((l) => l.itemId),\n itemId,\n ]);\n if (candidate.items[itemId]) {\n menu = candidate;\n }\n };\n const validated = (\n raw: CartLineInput,\n id?: string,\n addedAt?: string,\n ): CartLine => {\n current(raw.itemId);\n const item = Object.hasOwn(menu!.items, raw.itemId)\n ? menu!.items[raw.itemId]\n : undefined;\n const problems = validateLine(item, raw, { menu: menu!, branch: branch! });\n if (problems.length || !item) {\n throw new ZappieCartError(problems);\n }\n const input = normalizeInput(item, raw);\n const variant = resolveVariant(item, input)!;\n const choices = (input.choices ?? []).map((c) => ({\n ...c,\n quantity: c.quantity ?? 1,\n }));\n const unitPrice = estimateUnitPrice(item, {\n choices,\n variantId: variant.id,\n });\n return freezeLine({\n id:\n id ??\n `line_${Array.from(globalThis.crypto.getRandomValues(new Uint8Array(10)), (byte) => \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz-\"[byte & 63]).join(\"\")}`,\n itemId: item.id,\n ...(input.menuId !== undefined ? { menuId: input.menuId } : {}),\n name: item.name,\n quantity: input.quantity!,\n choices,\n inputs: input.inputs ?? {},\n variantId: variant.id,\n ...(input.note !== undefined ? { note: input.note } : {}),\n unitPrice,\n lineSubtotal: multiplyMoney(unitPrice, input.quantity!),\n addedAt: addedAt ?? new Date().toISOString(),\n });\n };\n const offMenu = events.on(\"menu:updated\", ({ branchId, version }) => {\n if (branch?.id === branchId) {\n const value = menus.peek(branchId);\n if (\n value &&\n value.completeness !== \"partial\" &&\n value.version === version &&\n value.version !== menu?.version\n ) {\n refreshSequence++;\n menu = value;\n cancel();\n recompute(snapshot.lines);\n persist();\n schedule();\n }\n }\n });\n const cart: CartModule = {\n get branchId() {\n return snapshot.branchId;\n },\n get lines() {\n return snapshot.lines;\n },\n get count() {\n return snapshot.count;\n },\n get subtotal() {\n return snapshot.subtotal;\n },\n get fulfilment() {\n return snapshot.fulfilment;\n },\n get promoCode() {\n return snapshot.promoCode;\n },\n get state() {\n return snapshot.state;\n },\n get issues() {\n return snapshot.issues;\n },\n get isHydrated() {\n return snapshot.isHydrated;\n },\n getSnapshot: () => snapshot,\n subscribe(fn) {\n listeners.add(fn);\n return () => {\n listeners.delete(fn);\n };\n },\n async hydrate() {\n if (snapshot.isHydrated) {\n return refresh();\n }\n const life = lifecycle;\n hydration ??= (async () => {\n const value = await store.get();\n const target =\n value.branches.find(\n (b) => b.id === selected || b.slug === selected,\n ) ??\n (!selected\n ? (value.branches.find((b) => b.isDefault) ?? value.branches[0])\n : undefined);\n if (!target) {\n throw new ZappieError(\n \"branch_not_found\",\n \"Cart branch is unavailable\",\n );\n }\n let inputs: readonly { itemId: string }[] = snapshot.lines;\n if (!snapshot.isHydrated) {\n const raw = readSaved(target.id);\n try {\n const saved = raw ? parseCart(raw) : undefined;\n inputs =\n saved && Date.now() - saved.updatedAt <= ttl\n ? saved.lines\n : raw === null\n ? (legacy?.(storage.read) ?? [])\n : [];\n } catch {\n inputs = [];\n }\n }\n const loaded = await deps.workingSet.read(\n target.id,\n inputs.map((l) => l.itemId),\n );\n if (life !== lifecycle) {\n return;\n }\n choose(loaded);\n ensure();\n if (loaded.completeness !== \"partial\") {\n await refresh();\n }\n })().finally(() => {\n hydration = undefined;\n });\n return hydration;\n },\n mount() {\n mounted++;\n if (!detach && typeof window !== \"undefined\") {\n const onStorage = (event: StorageEvent) => {\n if (\n branch &&\n event.key === key() &&\n storage.accepts(event.storageArea)\n ) {\n const raw = event.newValue;\n let ids: string[];\n try {\n ids = raw ? parseCart(raw).lines.map((l) => l.itemId) : [];\n } catch {\n load(raw, false);\n return;\n }\n const cached = deps.workingSet.peek(branch.id, ids);\n if (\n cached.completeness !== \"partial\" ||\n ids.every((id) => cached.items[id])\n ) {\n menu = cached;\n load(raw, false);\n schedule();\n return;\n }\n const rev = revision;\n const request = ++refreshSequence;\n const life = lifecycle;\n void deps.workingSet\n .read(branch.id, ids)\n .then((value) => {\n if (\n life === lifecycle &&\n rev === revision &&\n request === refreshSequence\n ) {\n menu = value;\n load(raw, false);\n schedule();\n }\n })\n .catch((error: unknown) =>\n events.emit(\"error\", { error: asError(error) }),\n );\n }\n };\n const onFocus = () => {\n void refresh().catch((error: unknown) =>\n events.emit(\"error\", { error: asError(error) }),\n );\n };\n window.addEventListener(\"storage\", onStorage);\n window.addEventListener(\"focus\", onFocus);\n // Only browser listeners follow mounts; the menu:updated subscription lives until dispose().\n detach = () => {\n window.removeEventListener(\"storage\", onStorage);\n window.removeEventListener(\"focus\", onFocus);\n };\n }\n if (mounted === 1) {\n void cart\n .hydrate()\n .catch((error: unknown) =>\n events.emit(\"error\", { error: asError(error) }),\n );\n }\n let active = true;\n return () => {\n if (active) {\n active = false;\n mounted--;\n if (mounted === 0) {\n detach?.();\n detach = undefined;\n cancel();\n }\n }\n };\n },\n dispose() {\n lifecycle++;\n moveSequence++;\n offMenu();\n cancel();\n detach?.();\n detach = undefined;\n listeners.clear();\n },\n validate(input) {\n ensure();\n current(input.itemId);\n const problems = validateLine(\n Object.hasOwn(menu!.items, input.itemId)\n ? menu!.items[input.itemId]\n : undefined,\n input,\n { menu: menu!, branch: branch! },\n );\n return problems.length ? { ok: false, issues: problems } : { ok: true };\n },\n add(item, input = {}) {\n ensure();\n let line = validated({\n ...input,\n itemId: typeof item === \"string\" ? item : item.id,\n });\n const existing = snapshot.lines.find(\n (l) => identity(lineInput(l)) === identity(lineInput(line)),\n );\n if (existing) {\n line = validated(\n { ...lineInput(line), quantity: existing.quantity + line.quantity },\n existing.id,\n existing.addedAt,\n );\n } else if (snapshot.lines.length >= 100) {\n throw new ZappieCartError([\n issue(\"quantity_limit\", \"A cart can contain at most 100 lines\"),\n ]);\n }\n changed(\n existing\n ? snapshot.lines.map((l) => (l.id === existing.id ? line : l))\n : [...snapshot.lines, line],\n );\n events.emit(\"add_to_cart\", {\n itemId: line.itemId,\n quantity: line.quantity - (existing?.quantity ?? 0),\n value: multiplyMoney(\n line.unitPrice,\n line.quantity - (existing?.quantity ?? 0),\n ),\n });\n return line;\n },\n update(lineId, patch) {\n ensure();\n const old = snapshot.lines.find((l) => l.id === lineId);\n if (!old) {\n throw new ZappieCartError([\n issue(\"item_not_found\", \"Cart line not found\"),\n ]);\n }\n const input = { ...lineInput(old), ...patch };\n if (patch.choices && !patch.variantId) {\n delete input.variantId;\n }\n let line = validated(input, old.id, old.addedAt);\n const duplicate = snapshot.lines.find(\n (l) =>\n l.id !== lineId &&\n identity(lineInput(l)) === identity(lineInput(line)),\n );\n if (duplicate) {\n line = validated(\n { ...lineInput(line), quantity: line.quantity + duplicate.quantity },\n old.id,\n old.addedAt,\n );\n }\n changed(\n snapshot.lines\n .filter((l) => l.id !== duplicate?.id)\n .map((l) => (l.id === lineId ? line : l)),\n );\n events.emit(\"update_cart_line\", {\n lineId,\n itemId: line.itemId,\n quantity: line.quantity,\n });\n return line;\n },\n remove(lineId) {\n ensure();\n const line = snapshot.lines.find((l) => l.id === lineId);\n changed(snapshot.lines.filter((l) => l.id !== lineId));\n if (line) {\n events.emit(\"remove_from_cart\", {\n itemId: line.itemId,\n quantity: line.quantity,\n value: line.lineSubtotal,\n });\n }\n },\n clear() {\n ensure();\n changed([], { fulfilment: null, promoCode: null });\n },\n setFulfilment(value) {\n ensure();\n if (!validFulfilment(value) || value.branchId !== branch!.id) {\n throw new ZappieCartError([\n issue(\n \"fulfilment_unavailable\",\n \"Select fulfilment for the cart's branch\",\n ),\n ]);\n }\n changed(snapshot.lines, { fulfilment: structuredClone(value) });\n },\n setPromoCode(code) {\n ensure();\n changed(snapshot.lines, { promoCode: code?.trim() || null });\n },\n async moveTo(branchId) {\n ensure();\n const seq = ++moveSequence;\n cancel();\n publish({ state: attention(snapshot.issues) });\n const value = await deps.workingSet.read(\n branchId,\n snapshot.lines.map((l) => l.itemId),\n );\n if (seq !== moveSequence) {\n return;\n }\n const oldKey = key();\n const oldLines = snapshot.lines;\n choose(value);\n const kept = oldLines.filter(\n (line) =>\n !validateLine(value.items[line.itemId], lineInput(line), {\n menu: value,\n branch: branch!,\n }).length,\n );\n changed(kept, { fulfilment: null, promoCode: null });\n const dropped = oldLines\n .filter((line) => !kept.includes(line))\n .map((line) => ({\n ...issue(\n \"item_unavailable\",\n `${line.name} is unavailable at this branch`,\n ),\n severity: \"warning\" as const,\n lineId: line.id,\n }));\n const issues = [...snapshot.issues, ...dropped];\n publish({ issues, state: attention(issues) });\n if (oldKey !== key()) {\n storage.remove(oldKey);\n }\n },\n async quote(opts = {}) {\n ensure();\n clearTimeout(timer);\n if (opts.force) {\n events.emit(\"view_cart\", {});\n }\n const body = {\n branch_id: branch!.id,\n lines: snapshot.lines.map(wireLine),\n ...(snapshot.fulfilment\n ? { fulfilment: wireFulfilment(snapshot.fulfilment) }\n : {}),\n ...(snapshot.promoCode ? { promo_code: snapshot.promoCode } : {}),\n menu_version: menu!.version,\n };\n const seq = revision;\n const attempt = ++quoteRevision;\n publish({ state: { status: \"quoting\" } });\n try {\n const client = await quoteClient();\n return await client.get(body, opts.force ?? false, (quote) => {\n if (seq !== revision) {\n return;\n }\n const local = snapshot.issues.filter((i) => i.source === \"local\");\n // The server re-validates every line; a problem the cart already reports is shown once.\n const remote = quote.issues.filter(\n (q) =>\n !local.some(\n (l) =>\n l.code === q.code &&\n l.lineId === q.lineId &&\n l.groupId === q.groupId,\n ),\n );\n const issues = [...local, ...remote];\n publish({ issues, state: attention(issues, quote) });\n for (const i of remote) {\n events.emit(\"cart_issue\", { code: i.code });\n }\n // A newer server menu means local prices and the sent version are stale. Refreshing\n // reconciles them and re-quotes, so the server stops re-raising the same change.\n if (\n quote.menuVersion !== menu!.version ||\n quote.issues.some((i) => i.code === \"menu_version_stale\")\n ) {\n void refresh().catch((error: unknown) =>\n events.emit(\"error\", { error: asError(error) }),\n );\n }\n });\n } catch (error) {\n if (seq === revision && attempt === quoteRevision) {\n const local = snapshot.issues.filter((i) => i.source === \"local\");\n publish({ issues: local, state: attention(local) });\n events.emit(\"quote_failed\", { code: asError(error).code });\n }\n throw error instanceof Error && error.name === \"AbortError\"\n ? error\n : asError(error);\n }\n },\n applyFix(problem, fix = problem.fixes[0]) {\n if (\n !snapshot.issues.includes(problem) ||\n !fix ||\n !problem.fixes.some((f) => JSON.stringify(f) === JSON.stringify(fix))\n ) {\n throw new ZappieError(\n \"invalid_request\",\n \"Choose a current cart issue and one of its fixes\",\n );\n }\n switch (fix.action) {\n case \"remove_line\": {\n if (problem.lineId) {\n cart.remove(problem.lineId);\n }\n return;\n }\n case \"remove_promo\":\n cart.setPromoCode(null);\n return;\n case \"set_quantity\": {\n if (problem.lineId) {\n cart.update(problem.lineId, { quantity: fix.quantity });\n }\n return;\n }\n case \"accept_price\": {\n quotes?.accept(problem);\n const issues = snapshot.issues.filter((i) => i !== problem);\n const quote =\n \"quote\" in snapshot.state ? snapshot.state.quote : undefined;\n const accepted = quote\n ? {\n ...quote,\n issues: quote.issues.filter(\n (i) =>\n !(i.code === problem.code && i.lineId === problem.lineId),\n ),\n }\n : undefined;\n publish({ issues, state: attention(issues, accepted) });\n return;\n }\n default:\n throw new ZappieError(\n \"invalid_request\",\n `${fix.action} needs the shopper's selection; use update or setFulfilment`,\n );\n }\n },\n toCheckoutPayload() {\n ensure();\n const blocking = snapshot.issues.filter((i) => i.severity === \"blocking\");\n if (!snapshot.lines.length || !snapshot.fulfilment) {\n blocking.push(\n issue(\n \"fulfilment_unavailable\",\n \"Add items and select fulfilment before checkout\",\n ),\n );\n }\n if (blocking.length) {\n throw new ZappieCartError(blocking);\n }\n return {\n lines: snapshot.lines.map(wireLine),\n fulfilment: structuredClone(snapshot.fulfilment!),\n ...(snapshot.promoCode ? { promo_code: snapshot.promoCode } : {}),\n menu_version: menu!.version,\n };\n },\n };\n return {\n cart: Object.freeze(cart),\n cartCatalogue: () => menu,\n setLegacyReader(reader: NonNullable<typeof legacy>) {\n legacy = reader;\n },\n };\n}\n","import type { MenuResource, StoreResource } from \"../client\";\nimport { ZappieError } from \"../errors\";\nimport type { Item, Menu } from \"../models\";\nimport type { RequestCtx, Transport } from \"../transport/types\";\n\n/** Cart-only catalogue projection. Never installed in the complete-menu cache. */\nexport type CartWorkingSet = Menu & {\n kind: \"working-set\";\n completeness: \"partial\";\n};\nexport function createWorkingSet(deps: {\n menu: MenuResource;\n store: StoreResource;\n transport: Transport;\n context: () => RequestCtx;\n peekItem: (id: string, branch: string) => Item | undefined;\n readItem: (id: string, branch: string, fresh?: boolean) => Promise<Item>;\n}) {\n const compose = (\n branchId: string,\n ids: readonly string[],\n metadata?: Menu,\n ): CartWorkingSet => {\n const source = metadata ?? deps.menu.peek(branchId);\n const items = Object.fromEntries(\n [...new Set(ids)].flatMap((id) => {\n const item = deps.peekItem(id, branchId) ?? source?.items[id];\n return item ? [[id, item]] : [];\n }),\n );\n return {\n id: `branch:${branchId}`,\n name: \"Cart working set\",\n branchId,\n version: \"\",\n ...source,\n kind: \"working-set\",\n completeness: \"partial\",\n items,\n categories: (source?.categories ?? []).map((category) => ({\n ...category,\n itemIds: Object.values(items)\n .filter((item) =>\n item.placements\n ? item.placements.some(\n (p) =>\n p.categoryId === category.id &&\n (\n source?.menus ?? [\n { id: source?.id, categoryIds: [category.id] },\n ]\n ).some(\n (m) =>\n m.id === p.menuId &&\n m.categoryIds.includes(category.id),\n ),\n )\n : category.itemIds.includes(item.id),\n )\n .map((item) => item.id),\n })),\n };\n };\n const peek = (branchId: string, ids: readonly string[]) => {\n const value = deps.menu.peek(branchId);\n return value && value.completeness !== \"partial\"\n ? value\n : compose(branchId, ids);\n };\n return {\n peek,\n async read(\n branchId: string,\n ids: readonly string[],\n fresh = false,\n ): Promise<Menu> {\n const cached = peek(branchId, ids);\n if (!ids.length || (!fresh && cached.completeness !== \"partial\")) {\n return cached;\n }\n const response = fresh\n ? await deps.transport.getMenu({\n ...deps.context(),\n branchId,\n metadataOnly: true,\n })\n : undefined;\n const metadata =\n response && \"menu\" in response\n ? response.menu\n : await deps.menu.get({ branch: branchId, metadataOnly: true });\n if (metadata.branchId !== branchId) {\n throw new ZappieError(\n \"server_error\",\n \"Cart metadata belongs to another branch\",\n );\n }\n deps.menu.hydrate(metadata);\n if (metadata.completeness !== \"partial\") {\n return metadata;\n }\n await Promise.all(\n [...new Set(ids)].map(async (id) => {\n try {\n await deps.readItem(id, branchId, fresh);\n } catch (error) {\n if ((error as { code?: string }).code !== \"item_not_found\") {\n throw error;\n }\n }\n }),\n );\n return compose(branchId, ids, metadata);\n },\n };\n}\n","import { ZappieError } from \"./errors\";\nimport type { Transport } from \"./transport/types\";\n/** Release-pinned REST contract version, independent of the package version. */\nexport const API_VERSION = \"2026-10-01\";\n/** A storage adapter you can supply to save carts. */\nexport interface StorageLike {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n /** Provide length and key to let the SDK remove expired carts for this store. */\n readonly length?: number;\n key?(index: number): string | null;\n}\n/** Settings for your storefront client. Each client keeps its own credentials and caches. */\nexport type ZappieConfig = {\n store: string;\n key: string;\n branch?: string;\n transport?: Transport;\n baseUrl?: string;\n version?: string;\n fetch?: typeof fetch;\n storage?: StorageLike;\n telemetry?: boolean;\n cart?: { ttl?: number; storageScope?: string };\n};\nexport function validateConfig(config: ZappieConfig, secret = false) {\n if (!config.store?.trim()) {\n throw new ZappieError(\"invalid_request\", \"A storefront slug is required\");\n }\n if (secret && typeof window !== \"undefined\") {\n throw new ZappieError(\n \"invalid_request\",\n \"Secret keys cannot be used in a browser\",\n );\n }\n const pattern = secret ? /^sk_(test|live)_.+$/ : /^pk_(test|live)_.+$/;\n const match = pattern.exec(config.key);\n if (!match) {\n throw new ZappieError(\n \"invalid_request\",\n secret\n ? \"A secret sk_test_ or sk_live_ key is required\"\n : \"Use a publishable pk_test_ or pk_live_ key; secret keys are never accepted by createZappie\",\n );\n }\n return match[1] as \"test\" | \"live\";\n}\n","export function abortReason(signal?: AbortSignal): unknown {\n return (\n signal?.reason ?? new DOMException(\"The request was aborted\", \"AbortError\")\n );\n}\nexport function throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted) {\n throw abortReason(signal);\n }\n}\nexport function delay(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n throwIfAborted(signal);\n const abort = () => {\n clearTimeout(timer);\n reject(abortReason(signal));\n };\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", abort);\n resolve();\n }, ms);\n signal?.addEventListener(\"abort\", abort, { once: true });\n });\n}\n","import { asError } from \"../errors\";\nimport type { ZappieError } from \"../errors\";\nimport { abortReason, throwIfAborted } from \"./abort\";\nexport type CacheEntry<T> = {\n value?: T;\n fetchedAt: number;\n etag?: string;\n error?: ZappieError;\n failedAt?: number;\n loading: boolean;\n};\n/** After a failed background refresh, stale data is served without retrying for this long. */\nconst REFRESH_BACKOFF_MS = 10_000;\ntype Loaded<T> = { value: T; etag?: string; onStored?: () => void };\ntype Flight = {\n promise: Promise<unknown>;\n controller: AbortController;\n users: number;\n keepAlive: boolean;\n};\nconst EMPTY: CacheEntry<never> = Object.freeze({\n fetchedAt: 0,\n loading: false,\n});\n/** Client-local SWR storage. Subscribers receive stable snapshots until an entry changes. */\nexport class Cache {\n private entries = new Map<string, CacheEntry<unknown>>();\n private listeners = new Set<() => void>();\n private flights = new Map<string, Flight>();\n constructor(private onError: (error: ZappieError) => void) {}\n snapshot<T>(key: string): CacheEntry<T> {\n return (this.entries.get(key) ?? EMPTY) as CacheEntry<T>;\n }\n subscribe = (fn: () => void) => {\n this.listeners.add(fn);\n return () => {\n this.listeners.delete(fn);\n };\n };\n private notify() {\n for (const fn of [...this.listeners]) {\n fn();\n }\n }\n set<T>(key: string, value: T, etag?: string) {\n this.entries.set(key, {\n value,\n fetchedAt: Date.now(),\n loading: false,\n ...(etag !== undefined ? { etag } : {}),\n });\n this.notify();\n }\n stale(key: string) {\n const entry = this.snapshot(key);\n return entry.value !== undefined && Date.now() - entry.fetchedAt >= 60_000;\n }\n async get<T>(\n key: string,\n loader: (signal: AbortSignal, entry: CacheEntry<T>) => Promise<Loaded<T>>,\n signal?: AbortSignal,\n ): Promise<T> {\n throwIfAborted(signal);\n const entry = this.snapshot<T>(key);\n const age = Date.now() - entry.fetchedAt;\n if (entry.value !== undefined && age < 60_000) {\n return entry.value;\n }\n const background = entry.value !== undefined && age < 600_000;\n if (\n background &&\n entry.failedAt !== undefined &&\n Date.now() - entry.failedAt < REFRESH_BACKOFF_MS\n ) {\n return entry.value!;\n }\n let flight = this.flights.get(key);\n if (!flight) {\n const controller = new AbortController();\n flight = {\n controller,\n users: 0,\n keepAlive: background,\n promise: Promise.resolve(),\n };\n const current = flight;\n this.flights.set(key, current);\n const loading = { ...entry, loading: true };\n this.entries.set(key, loading);\n this.notify();\n current.promise = Promise.resolve()\n .then(() => {\n throwIfAborted(controller.signal);\n return loader(controller.signal, entry);\n })\n .then((result) => {\n if (this.entries.get(key) === loading && !controller.signal.aborted) {\n this.set(key, result.value, result.etag);\n result.onStored?.();\n }\n return result.value;\n })\n .catch((error) => {\n if (this.entries.get(key) === loading) {\n this.entries.set(\n key,\n controller.signal.aborted\n ? { ...entry, loading: false }\n : {\n ...entry,\n loading: false,\n error: asError(error),\n failedAt: Date.now(),\n },\n );\n this.notify();\n if (!controller.signal.aborted) {\n this.onError(asError(error));\n }\n }\n throw controller.signal.aborted\n ? abortReason(controller.signal)\n : asError(error);\n })\n .finally(() => {\n if (this.flights.get(key) === current) {\n this.flights.delete(key);\n }\n });\n }\n if (background) {\n flight.keepAlive = true;\n void flight.promise.catch(() => {});\n return entry.value!;\n }\n const current = flight;\n current.users++;\n return new Promise<T>((resolve, reject) => {\n let done = false;\n const finish = (callback: () => void) => {\n if (done) {\n return;\n }\n done = true;\n signal?.removeEventListener(\"abort\", abort);\n current.users--;\n callback();\n };\n const abort = () => {\n finish(() => reject(abortReason(signal)));\n if (current.users === 0 && !current.keepAlive) {\n current.controller.abort(abortReason(signal));\n if (this.flights.get(key) === current) {\n this.flights.delete(key);\n }\n }\n };\n signal?.addEventListener(\"abort\", abort, { once: true });\n current.promise.then(\n (value) => finish(() => resolve(value as T)),\n (error) => finish(() => reject(error)),\n );\n if (signal?.aborted) {\n abort();\n }\n });\n }\n}\n","import type { CartIssueCode } from \"../cart/types\";\nimport type { ZappieError } from \"../errors\";\nimport type { Money } from \"../money\";\n/** Events currently emitted by the read-only SDK. */\nexport type ZappieEvents = {\n search: { query: string; resultCount: number };\n warning: { message: string };\n cart_expired: { branchId: string };\n add_to_cart: { itemId: string; quantity: number; value: Money };\n remove_from_cart: { itemId: string; quantity: number; value: Money };\n update_cart_line: { lineId: string; itemId: string; quantity: number };\n view_cart: Record<string, never>;\n cart_issue: { code: CartIssueCode };\n quote_failed: { code: string };\n \"menu:updated\": { branchId: string; version: string };\n error: { error: ZappieError };\n};\nexport function createEmitter() {\n const listeners = new Map<\n keyof ZappieEvents,\n Set<(payload: never) => void>\n >();\n return {\n on<E extends keyof ZappieEvents>(\n event: E,\n fn: (payload: ZappieEvents[E]) => void,\n ) {\n const set = listeners.get(event) ?? new Set();\n listeners.set(event, set);\n set.add(fn as (payload: never) => void);\n return () => {\n set.delete(fn as (payload: never) => void);\n };\n },\n emit<E extends keyof ZappieEvents>(event: E, payload: ZappieEvents[E]) {\n for (const fn of [...(listeners.get(event) ?? [])]) {\n try {\n fn(payload as never);\n } catch (error) {\n console.error(\"Zappie event listener failed\", error);\n }\n }\n },\n };\n}\n","import type { QuoteRequest, WireQuote } from \"../cart/types\";\nimport { ZappieError, wireError } from \"../errors\";\nimport { delay, throwIfAborted } from \"../internal/abort\";\nimport { payloadKey } from \"../internal/digest\";\nimport { money } from \"../money\";\nimport {\n hours,\n isBoolean,\n isString,\n list,\n mapItem,\n mapMenu,\n mapMoney,\n opt,\n record,\n text,\n} from \"./mappers\";\nimport type { SelectedMenuRequest } from \"./selected-menu\";\nimport type {\n MenuResponse,\n MenuVersion,\n RequestCtx,\n SearchRequest,\n Transport,\n} from \"./types\";\n/** The longest Retry-After the SDK waits out before surfacing the error instead. */\nconst MAX_RETRY_WAIT_MS = 5_000;\n/** REST connection options. A custom fetch can provide tracing or mock responses. */\nexport type RestTransportOptions = { baseUrl?: string; fetch?: typeof fetch };\n/** REST read adapter for the versioned storefront API. */\nexport class RestTransport implements Transport {\n readonly baseUrl: string;\n private fetcher: typeof fetch;\n constructor(opts: RestTransportOptions = {}) {\n const url = new URL(opts.baseUrl ?? \"https://api.zappie.ai/storefront/v1\");\n if (\n url.username ||\n url.password ||\n url.search ||\n url.hash ||\n (url.protocol !== \"https:\" &&\n !(\n url.protocol === \"http:\" &&\n [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(url.hostname)\n ))\n ) {\n throw new ZappieError(\n \"invalid_request\",\n \"REST baseUrl requires HTTPS, or HTTP on localhost\",\n );\n }\n this.baseUrl = url.href.replace(/\\/$/, \"\");\n // Called as this.fetcher(), a stored global fetch would run with the\n // transport as `this`, which Workers refuses (\"Illegal invocation\").\n this.fetcher =\n opts.fetch ?? ((input, init) => globalThis.fetch(input, init));\n }\n private async request(\n path: string,\n ctx: RequestCtx,\n etag?: string,\n body?: QuoteRequest,\n ): Promise<Response> {\n if (typeof window !== \"undefined\" && ctx.key.startsWith(\"sk_\")) {\n throw new ZappieError(\n \"invalid_request\",\n \"Secret keys cannot be sent from a browser\",\n );\n }\n for (let attempt = 0; ; attempt++) {\n throwIfAborted(ctx.signal);\n let response: Response;\n try {\n response = await this.fetcher(this.baseUrl + path, {\n method: body ? \"POST\" : \"GET\",\n ...(body ? { body: JSON.stringify(body) } : {}),\n // Workers reject redirect: \"error\"; a redirect is still refused below\n // as a non-OK response (a 3xx, or opaqueredirect in browsers).\n redirect: \"manual\",\n headers: {\n ...(body ? { \"Content-Type\": \"application/json\" } : {}),\n ...(ctx.idempotencyKey\n ? { \"Idempotency-Key\": ctx.idempotencyKey }\n : {}),\n Authorization: `Bearer ${ctx.key}`,\n \"Zappie-Version\": ctx.version,\n ...(etag ? { \"If-None-Match\": etag } : {}),\n },\n ...(ctx.signal ? { signal: ctx.signal } : {}),\n });\n } catch (error) {\n throwIfAborted(ctx.signal);\n if (attempt >= 2) {\n throw new ZappieError(\n \"network_error\",\n \"Could not reach the storefront service\",\n { cause: error },\n );\n }\n await delay(100 * 2 ** attempt + Math.random() * 100, ctx.signal);\n continue;\n }\n if (response.ok || response.status === 304) {\n return response;\n }\n const retry = response.headers.get(\"Retry-After\");\n const seconds = retry !== null ? Number(retry) : NaN;\n const wait =\n retry !== null\n ? Number.isFinite(seconds)\n ? Math.max(0, seconds * 1000)\n : Math.max(0, Date.parse(retry) - Date.now())\n : NaN;\n // A longer wait than this is the caller's decision, not a silently stalled read.\n const tooLong = Number.isFinite(wait) && wait > MAX_RETRY_WAIT_MS;\n if (\n attempt < 2 &&\n !tooLong &&\n (response.status === 429 || response.status >= 500)\n ) {\n await response.body?.cancel();\n await delay(\n Number.isFinite(wait)\n ? wait\n : 100 * 2 ** attempt + Math.random() * 100,\n ctx.signal,\n );\n continue;\n }\n const errorBody = await response.json().catch(() => ({}));\n throw wireError(\n errorBody,\n response.status,\n response.headers.get(\"Zappie-Request-Id\") ?? undefined,\n );\n }\n }\n private async json(response: Response): Promise<unknown> {\n try {\n return await response.json();\n } catch (cause) {\n if (cause instanceof Error && cause.name === \"AbortError\") {\n throw cause;\n }\n throw new ZappieError(\n \"server_error\",\n \"The storefront service returned invalid JSON\",\n { status: response.status, cause },\n );\n }\n }\n async quote(ctx: RequestCtx, body: QuoteRequest): Promise<WireQuote> {\n const request = {\n ...ctx,\n idempotencyKey:\n ctx.idempotencyKey ?? (await payloadKey(JSON.stringify(body))),\n };\n const raw = await this.json(\n await this.request(\"/quote\", request, undefined, body),\n );\n // The cart's quote client validates and maps the response.\n return raw as WireQuote;\n }\n async getStore(ctx: RequestCtx) {\n const mapper = import(\"./store\").catch((cause) => {\n throw new ZappieError(\n \"server_error\",\n \"Could not load the storefront store mapper\",\n { cause },\n );\n });\n const response = this.request(\"/store\", ctx).then((value) =>\n this.json(value),\n );\n const [{ mapStore }, raw] = await Promise.all([mapper, response]);\n return mapStore(\n raw,\n record,\n text,\n list,\n hours,\n mapMoney,\n money,\n opt,\n isString,\n isBoolean,\n );\n }\n async getMenu(\n ctx: RequestCtx & {\n branchId: string;\n ifNoneMatch?: string;\n metadataOnly?: boolean;\n },\n ): Promise<MenuResponse> {\n let cursor: string | undefined;\n const seen = new Set<string>();\n let output: ReturnType<typeof mapMenu> | undefined;\n let etag: string | undefined;\n do {\n const query = new URLSearchParams({\n branch: ctx.branchId,\n ...(ctx.metadataOnly ? { metadata_only: \"true\" } : {}),\n ...(cursor ? { cursor } : {}),\n });\n const response = await this.request(\n `/menus?${query}`,\n ctx,\n cursor ? undefined : ctx.ifNoneMatch,\n );\n if (response.status === 304) {\n if (cursor) {\n throw new ZappieError(\n \"server_error\",\n \"Unexpected 304 on a continuation page\",\n );\n }\n return {\n notModified: true,\n ...(response.headers.get(\"ETag\")\n ? { etag: response.headers.get(\"ETag\")! }\n : {}),\n };\n }\n const raw = record(await this.json(response));\n const page = mapMenu(raw, ctx.branchId);\n if (ctx.metadataOnly) {\n if (Object.keys(page.items).length || raw.next_cursor) {\n throw new ZappieError(\"server_error\", \"Invalid metadata response\");\n }\n return { menu: { ...page, completeness: \"partial\" } };\n }\n if (!output) {\n output = page;\n etag = response.headers.get(\"ETag\") ?? undefined;\n } else {\n if (page.version !== output.version) {\n throw new ZappieError(\n \"server_error\",\n \"Menu changed while fetching pages; retry the read\",\n );\n }\n Object.assign(output.items, page.items);\n for (const category of page.categories) {\n const existing = output.categories.find((c) => c.id === category.id);\n if (existing) {\n existing.itemIds = [\n ...new Set([...existing.itemIds, ...category.itemIds]),\n ];\n } else {\n output.categories.push(category);\n }\n }\n for (const section of page.menus ?? []) {\n const existing = output.menus?.find((m) => m.id === section.id);\n if (existing) {\n existing.categoryIds = [\n ...new Set([...existing.categoryIds, ...section.categoryIds]),\n ];\n } else {\n output.menus?.push(section);\n }\n }\n }\n cursor =\n typeof raw.next_cursor === \"string\" && raw.next_cursor\n ? raw.next_cursor\n : undefined;\n if (cursor) {\n if (seen.has(cursor)) {\n throw new ZappieError(\n \"server_error\",\n \"Repeated menu pagination cursor\",\n );\n }\n seen.add(cursor);\n }\n } while (cursor);\n if (output.menus && output.menus.length > 1) {\n output.id = `branch:${ctx.branchId}`;\n output.name = \"Catalogue\";\n delete output.schedule;\n }\n for (const category of output.categories) {\n for (const id of category.itemIds) {\n if (!Object.prototype.hasOwnProperty.call(output.items, id)) {\n throw new ZappieError(\n \"server_error\",\n \"Category refers to a missing item\",\n );\n }\n }\n }\n if (Object.keys(output.items).length > 2000) {\n console.warn(\"Zappie menu contains more than 2,000 items\");\n }\n return { menu: output, ...(etag ? { etag } : {}) };\n }\n async getSelectedMenu(ctx: SelectedMenuRequest) {\n return (await import(\"./selected-menu\")).selectedMenu(\n ctx,\n (path) => this.request(path, ctx, ctx.ifNoneMatch),\n (response) => this.json(response),\n mapMenu,\n () => new ZappieError(\"server_error\", \"Invalid selected menu\"),\n );\n }\n async search(ctx: SearchRequest) {\n return (await import(\"./search\")).searchPage(\n ctx,\n async (path) => this.json(await this.request(path, ctx)),\n mapMenu,\n () => new ZappieError(\"server_error\", \"Invalid search page\"),\n );\n }\n async getCategoryPage(\n ctx: RequestCtx & {\n branchId: string;\n menuId: string;\n categoryId: string;\n cursor?: string;\n },\n ) {\n const query = new URLSearchParams({\n branch: ctx.branchId,\n ...(ctx.cursor ? { cursor: ctx.cursor } : {}),\n });\n const raw = await this.json(\n await this.request(\n `/menus/${encodeURIComponent(ctx.menuId)}/categories/${encodeURIComponent(ctx.categoryId)}/items?${query}`,\n ctx,\n ),\n );\n // Loaded on first use: only progressive catalogues read pages.\n return (await import(\"./category-page\")).categoryPage(\n record(raw),\n ctx,\n mapMenu,\n () => new ZappieError(\"server_error\", \"Invalid category page\"),\n );\n }\n async getMenuVersion(\n ctx: RequestCtx & { branchId: string },\n ): Promise<MenuVersion> {\n const value = record(\n await this.json(\n await this.request(\n `/menus/version?${new URLSearchParams({ branch: ctx.branchId })}`,\n ctx,\n ),\n ),\n );\n if (\n typeof value.menu_version !== \"string\" ||\n typeof value.availability_hash !== \"string\"\n ) {\n throw new ZappieError(\"server_error\", \"Invalid menu version response\");\n }\n return {\n version: value.menu_version,\n availabilityHash: value.availability_hash,\n };\n }\n async getItem(ctx: RequestCtx & { branchId: string; itemId: string }) {\n const item = mapItem(\n await this.json(\n await this.request(\n `/items/${encodeURIComponent(ctx.itemId)}?${new URLSearchParams({ branch: ctx.branchId })}`,\n ctx,\n ),\n ),\n );\n if (item.id !== ctx.itemId) {\n throw new ZappieError(\n \"server_error\",\n \"Item response identity does not match the request\",\n );\n }\n return item;\n }\n}\n","import { createCart } from \"./cart\";\nimport { createWorkingSet } from \"./cart/working-set\";\nimport type { ZappieConfig } from \"./config\";\nimport { API_VERSION, validateConfig } from \"./config\";\nimport { ZappieError } from \"./errors\";\nimport { Cache } from \"./internal/cache\";\nimport type { ZappieEvents } from \"./internal/emitter\";\nimport { createEmitter } from \"./internal/emitter\";\nimport type { Branch, CategoryPage, Item, Menu, Store } from \"./models\";\nimport { format } from \"./money\";\nimport { RestTransport } from \"./transport/rest\";\nimport type { MenuVersion, SearchPage } from \"./transport/types\";\n/** Optional branch selection and cancellation for resource reads. */\nexport type ReadOptions = { branch?: string; signal?: AbortSignal };\n/** Read-only store resource. */\nexport interface StoreResource {\n get(opts?: { signal?: AbortSignal }): Promise<Store>;\n peek(): Store | undefined;\n}\n/** Read-only branch catalogue and item resources. */\nexport interface MenuResource {\n search(\n query: string,\n opts?: ReadOptions & { cursor?: string },\n ): Promise<SearchPage>;\n get(opts?: ReadOptions & { metadataOnly?: boolean }): Promise<Menu>;\n page(\n menuId: string,\n categoryId: string,\n opts?: ReadOptions & { cursor?: string },\n ): Promise<CategoryPage>;\n peek(branch?: string): Menu | undefined;\n version(opts?: ReadOptions): Promise<MenuVersion>;\n item(id: string, opts?: ReadOptions): Promise<Item>;\n hydrate(menu: Menu): void;\n}\n/** A storefront client and its isolated resource state. */\nexport type Zappie = ReturnType<typeof buildClient>;\nexport function buildClient(input: ZappieConfig, secret = false) {\n const mode = validateConfig(input, secret);\n const config = Object.freeze({\n ...input,\n version: input.version ?? API_VERSION,\n telemetry: input.telemetry ?? true,\n });\n const transport =\n input.transport ??\n new RestTransport({\n ...(input.baseUrl ? { baseUrl: input.baseUrl } : {}),\n ...(input.fetch ? { fetch: input.fetch } : {}),\n });\n const events = createEmitter();\n const cache = new Cache((error) => events.emit(\"error\", { error }));\n const ctx = (signal?: AbortSignal) => ({\n key: config.key,\n version: config.version,\n ...(signal ? { signal } : {}),\n });\n const store: StoreResource = {\n get: (opts = {}) =>\n cache.get(\n \"store\",\n async (signal) => ({ value: await transport.getStore(ctx(signal)) }),\n opts.signal,\n ),\n peek: () => cache.snapshot<Store>(\"store\").value,\n };\n const resolveBranch = (value: Store, requested?: string): Branch => {\n const selected = requested ?? config.branch;\n const branch = selected\n ? value.branches.find((b) => b.id === selected || b.slug === selected)\n : (value.branches.find((b) => b.isDefault) ?? value.branches[0]);\n if (!branch) {\n throw new ZappieError(\n \"branch_not_found\",\n \"No matching storefront branch\",\n { param: \"branch\" },\n );\n }\n return branch;\n };\n let hydratedBranch: string | undefined;\n const branchKey = (requested?: string) => {\n const value = store.peek();\n if (value) {\n return resolveBranch(value, requested).id;\n }\n // A slug can't be resolved without the store. A hydrated menu is the configured\n // branch's, so a read for that branch (by slug or id) uses it rather than missing.\n const selected = requested ?? config.branch;\n if (\n hydratedBranch &&\n (selected === undefined ||\n selected === config.branch ||\n selected === hydratedBranch)\n ) {\n return hydratedBranch;\n }\n return selected ?? \"default\";\n };\n const menuKey = (requested?: string) => `menu:${branchKey(requested)}`;\n const menu: MenuResource = {\n async search(query, opts = {}) {\n if (!transport.search) {\n throw new ZappieError(\n \"invalid_request\",\n \"Transport does not support search\",\n );\n }\n const branch = resolveBranch(await store.get(opts), opts.branch);\n return transport.search({\n ...ctx(opts.signal),\n branchId: branch.id,\n query,\n ...(opts.cursor ? { cursor: opts.cursor } : {}),\n });\n },\n async get(opts = {}) {\n const branch = resolveBranch(await store.get(opts), opts.branch);\n return cache.get<Menu>(\n `menu:${branch.id}${opts.metadataOnly ? \":partial\" : \"\"}`,\n async (signal, entry) => {\n const response = await transport.getMenu({\n ...ctx(signal),\n branchId: branch.id,\n ...(opts.metadataOnly ? { metadataOnly: true } : {}),\n ...(entry.etag ? { ifNoneMatch: entry.etag } : {}),\n });\n if (\"notModified\" in response) {\n if (!entry.value) {\n throw new ZappieError(\n \"server_error\",\n \"Received 304 without a cached menu\",\n );\n }\n return {\n value: entry.value,\n ...((response.etag ?? entry.etag)\n ? { etag: response.etag ?? entry.etag }\n : {}),\n };\n }\n if (!opts.metadataOnly && response.menu.completeness === \"partial\") {\n throw new ZappieError(\n \"server_error\",\n \"Partial catalogue cannot satisfy a complete read\",\n );\n }\n if (response.menu.branchId !== branch.id) {\n throw new ZappieError(\n \"server_error\",\n \"Menu belongs to a different branch\",\n );\n }\n return {\n value: response.menu,\n etag: response.etag ?? response.menu.version,\n onStored: () => {\n if (\n entry.value &&\n entry.value.version !== response.menu.version\n ) {\n events.emit(\"menu:updated\", {\n branchId: branch.id,\n version: response.menu.version,\n });\n }\n },\n };\n },\n opts.signal,\n );\n },\n peek: (branch) =>\n cache.snapshot<Menu>(menuKey(branch)).value ??\n cache.snapshot<Menu>(`${menuKey(branch)}:partial`).value,\n async page(menuId, categoryId, opts = {}) {\n if (!transport.getCategoryPage) {\n throw new ZappieError(\n \"invalid_request\",\n \"Transport does not support category pages\",\n );\n }\n const branch = resolveBranch(await store.get(opts), opts.branch);\n return transport.getCategoryPage({\n ...ctx(opts.signal),\n branchId: branch.id,\n menuId,\n categoryId,\n ...(opts.cursor ? { cursor: opts.cursor } : {}),\n });\n },\n async version(opts = {}) {\n const branch = resolveBranch(await store.get(opts), opts.branch);\n return transport.getMenuVersion({\n ...ctx(opts.signal),\n branchId: branch.id,\n });\n },\n async item(id, opts = {}) {\n const branch = resolveBranch(await store.get(opts), opts.branch);\n if (\n !menu.peek(branch.id) ||\n menu.peek(branch.id)?.completeness === \"partial\"\n ) {\n await menu.get({ ...opts, metadataOnly: true });\n }\n return readItem(id, branch.id, false, opts.signal);\n },\n hydrate(value) {\n hydratedBranch ??= value.branchId;\n const previous = cache.snapshot<Menu>(`menu:${value.branchId}`).value;\n cache.set(\n `menu:${value.branchId}${value.completeness === \"partial\" ? \":partial\" : \"\"}`,\n value,\n value.version,\n );\n if (previous && previous.version !== value.version) {\n events.emit(\"menu:updated\", {\n branchId: value.branchId,\n version: value.version,\n });\n }\n },\n };\n const itemValues = new Map<string, Item>();\n const peekItem = (id: string, branch: string) =>\n itemValues.get(`${branch}:${id}`);\n const readItem = async (\n id: string,\n branch: string,\n fresh = false,\n signal?: AbortSignal,\n ) => {\n const complete = cache.snapshot<Menu>(`menu:${branch}`).value;\n if (!fresh && complete && Object.hasOwn(complete.items, id)) {\n return complete.items[id]!;\n }\n const load = (requestSignal = signal) =>\n transport.getItem({\n ...ctx(requestSignal),\n branchId: branch,\n itemId: id,\n });\n try {\n const value = fresh\n ? await load()\n : await cache.get(\n `item:${branch}:${id}`,\n async (requestSignal) => ({ value: await load(requestSignal) }),\n signal,\n );\n if (fresh) {\n cache.set(`item:${branch}:${id}`, value);\n }\n itemValues.set(`${branch}:${id}`, value);\n return value;\n } catch (error) {\n if ((error as { code?: string }).code === \"item_not_found\") {\n itemValues.delete(`${branch}:${id}`);\n cache.set(`item:${branch}:${id}`, undefined);\n }\n throw error;\n }\n };\n const workingSet = createWorkingSet({\n menu,\n store,\n transport,\n context: ctx,\n peekItem,\n readItem,\n });\n const { cart, setLegacyReader, cartCatalogue } = createCart({\n workingSet,\n config,\n menu,\n store,\n transport,\n context: ctx,\n events,\n });\n return Object.freeze({\n cart,\n config,\n mode,\n store,\n menu,\n format,\n on: events.on,\n _internal: {\n cartCatalogue,\n setLegacyReader,\n transport,\n cache,\n emit: events.emit,\n menuKey,\n hydrateStore: (value: Store) => cache.set(\"store\", value),\n },\n });\n}\n/** Create a client with your publishable key. Requests start when you read a resource. */\nexport function createZappie(config: ZappieConfig) {\n const client = buildClient(config);\n if (client.mode === \"test\" && typeof window !== \"undefined\") {\n void import(\"./debug\").then(({ installDebug }) => installDebug(client));\n }\n return client;\n}\nexport type { ZappieEvents };\n","import type { Item } from \"../models\";\nimport { multiplyMoney } from \"../internal/money-math\";\nimport { estimateUnitPrice } from \"./price\";\nimport { effectiveGroups, normalizeInput, resolveVariant } from \"./validate\";\nimport type { CartLineInput } from \"./types\";\nfunction previewQuantity(value: number | undefined) {\n return Number.isInteger(value) && value! >= 0 && value! <= 99 ? value! : 0;\n}\n/** Presentation preview shares the cart's conditions, exact-variant resolution and pricing. */\nexport function previewItem(item: Item, raw: CartLineInput) {\n const input = normalizeInput(item, raw);\n const groups = effectiveGroups(item, input).filter(\n (group) => group.isAvailable !== false,\n );\n const variantId = resolveVariant(item, input)?.id;\n const choices = (input.choices ?? [])\n .filter(({ groupId, choiceId }) =>\n groups.some(\n (group) =>\n group.id === groupId &&\n group.choices.some((choice) => choice.id === choiceId),\n ),\n )\n .map((selection) => ({\n ...selection,\n quantity: previewQuantity(selection.quantity),\n }));\n const unitPrice = estimateUnitPrice(item, {\n choices,\n ...(variantId ? { variantId } : {}),\n });\n const total = multiplyMoney(unitPrice, previewQuantity(input.quantity));\n return { groups, unitPrice, total };\n}\n","/** Public package release version. */\nexport const VERSION = \"0.0.0\";\nexport { createZappie } from \"./client\";\nexport type {\n MenuResource,\n ReadOptions,\n StoreResource,\n Zappie,\n ZappieEvents,\n} from \"./client\";\nexport { API_VERSION } from \"./config\";\nexport type {\n StorageLike,\n ZappieConfig as ZappieClientOptions,\n ZappieConfig,\n} from \"./config\";\nexport { ZappieError, isZappieError } from \"./errors\";\nexport type { ErrorDetails, ZappieErrorCode } from \"./errors\";\nexport * from \"./models\";\nexport { format, money } from \"./money\";\nexport type { Currency, Formatters, Money, MoneyFormatOptions } from \"./money\";\nexport { RestTransport } from \"./transport/rest\";\nexport type { RestTransportOptions } from \"./transport/rest\";\nexport type {\n MenuResponse,\n MenuVersion,\n RequestCtx,\n SearchPage,\n SearchRequest,\n Transport,\n} from \"./transport/types\";\n\nexport { ZappieCartError } from \"./cart/errors\";\nexport { previewItem } from \"./cart/preview\";\nexport { estimateUnitPrice } from \"./cart/price\";\nexport { resolveSourceMenu } from \"./cart/source-menu\";\nexport type * from \"./cart/types\";\nexport { validateLine } from \"./cart/validate\";\n"]}
|