@zappie/sdk 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +337 -2
- package/dist/cart/item.d.ts +10 -0
- package/dist/cart/item.js +1 -0
- package/dist/cart/item.js.map +1 -0
- package/dist/cart/quote.d.ts +15 -0
- package/dist/cart/quote.js +1 -0
- package/dist/cart/quote.js.map +1 -0
- package/dist/checkout/index.d.ts +141 -0
- package/dist/checkout/index.js +1 -0
- package/dist/checkout/index.js.map +1 -0
- package/dist/chunk-I55A5QXJ.js +2 -0
- package/dist/chunk-I55A5QXJ.js.map +1 -0
- package/dist/chunk-VG7NKIKR.js +2 -0
- package/dist/chunk-VG7NKIKR.js.map +1 -0
- package/dist/client-BctSrEhO.d.ts +725 -0
- package/dist/config/index.d.ts +83 -0
- package/dist/config/index.js +1 -0
- package/dist/customer/index.d.ts +175 -0
- package/dist/customer/index.js +3 -0
- package/dist/customer/index.js.map +1 -0
- package/dist/customer/react.d.ts +31 -0
- package/dist/customer/react.js +3 -0
- package/dist/customer/react.js.map +1 -0
- package/dist/debug.d.ts +45 -0
- package/dist/debug.js +1 -0
- package/dist/debug.js.map +1 -0
- package/dist/index.d.ts +84 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +14 -0
- package/dist/internal.js +1 -0
- package/dist/internal.js.map +1 -0
- package/dist/models-Dj-VkdU1.d.ts +230 -0
- package/dist/persist/catalogue.d.ts +2 -0
- package/dist/persist/catalogue.js +2 -0
- package/dist/persist/catalogue.js.map +1 -0
- package/dist/places/index.d.ts +121 -0
- package/dist/places/index.js +1 -0
- package/dist/places/index.js.map +1 -0
- package/dist/react/index.d.ts +79 -0
- package/dist/react/index.js +2 -0
- package/dist/react/index.js.map +1 -0
- package/dist/server/index.d.ts +235 -0
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -0
- package/dist/template/index.d.ts +16 -0
- package/dist/template/index.js +3 -0
- package/dist/template/index.js.map +1 -0
- package/dist/template/react.d.ts +13 -0
- package/dist/template/react.js +3 -0
- package/dist/template/react.js.map +1 -0
- package/dist/testing/index.d.ts +64 -0
- package/dist/testing/index.js +2 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/transport/category-page.d.ts +17 -0
- package/dist/transport/category-page.js +2 -0
- package/dist/transport/category-page.js.map +1 -0
- package/dist/transport/search.d.ts +7 -0
- package/dist/transport/search.js +2 -0
- package/dist/transport/search.js.map +1 -0
- package/dist/transport/selected-menu.d.ts +2 -0
- package/dist/transport/selected-menu.js +2 -0
- package/dist/transport/selected-menu.js.map +1 -0
- package/dist/transport/store.d.ts +10 -0
- package/dist/transport/store.js +2 -0
- package/dist/transport/store.js.map +1 -0
- package/dist/url/index.d.ts +157 -0
- package/dist/url/index.js +2 -0
- package/dist/url/index.js.map +1 -0
- package/dist/visits/index.d.ts +89 -0
- package/dist/visits/index.js +1 -0
- package/dist/visits/index.js.map +1 -0
- package/package.json +104 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/internal/customer-http.ts","../../src/checkout/error.ts","../../src/checkout/session.ts","../../src/checkout/client.ts","../../src/checkout/readiness.ts"],"names":["stableErrorCode","status","apiError","response","fallback","body","envelope","value","wait","ms","signal","resolve","reject","timer","aborted","requestWithRetry","fetcher","input","init","message","attempt","cause","ZappieError","CheckoutError","apiCode","param","issues","object","string","currency","money","mapCheckoutSession","session","amount","expiresAt","DEFAULT_CUSTOMER_BASE","error","createCheckout","options","base","request","path","read","id","idempotencyKey","interval","failure","isContactPhoneValid","phone","payReadiness","state","contactPhoneValid","addressValid","issue"],"mappings":"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","file":"index.js","sourcesContent":["// Isolated customer-facing bundles import the installed core so error identity is shared.\n// eslint-disable-next-line no-restricted-imports\nimport { ZappieError } from \"@zappie/sdk\";\n\nexport type ApiErrorDetails = {\n apiCode: string;\n message: string;\n param?: string;\n issues?: unknown;\n};\n\nexport function stableErrorCode(status: number) {\n if (status === 400 || status === 422) {\n return \"invalid_request\" as const;\n }\n if (status === 401) {\n return \"unauthorized\" as const;\n }\n if (status === 404) {\n return \"not_found\" as const;\n }\n if (status === 429) {\n return \"rate_limited\" as const;\n }\n return \"server_error\" as const;\n}\n\nexport async function apiError(\n response: Response,\n fallback: string,\n): Promise<ApiErrorDetails> {\n const body = await response.json().catch(() => ({}));\n const envelope = body && typeof body === \"object\" ? body : {};\n const value =\n \"error\" in envelope && envelope.error && typeof envelope.error === \"object\"\n ? envelope.error\n : {};\n return {\n apiCode:\n \"code\" in value && typeof value.code === \"string\"\n ? value.code\n : \"server_error\",\n message:\n \"message\" in value && typeof value.message === \"string\"\n ? value.message\n : fallback,\n ...(\"param\" in value && typeof value.param === \"string\"\n ? { param: value.param }\n : {}),\n ...(\"issues\" in value ? { issues: value.issues } : {}),\n };\n}\n\nexport function wait(ms: number, signal?: AbortSignal): Promise<void> {\n signal?.throwIfAborted();\n return new Promise((resolve, reject) => {\n const done = () => {\n signal?.removeEventListener(\"abort\", aborted);\n resolve();\n };\n const timer = setTimeout(done, ms);\n const aborted = () => {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", aborted);\n reject(signal?.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n };\n signal?.addEventListener(\"abort\", aborted, { once: true });\n });\n}\n\nexport async function requestWithRetry(\n fetcher: typeof fetch,\n input: string,\n init: RequestInit,\n message: string,\n): Promise<Response> {\n for (let attempt = 0; attempt < 2; attempt++) {\n try {\n return await fetcher(input, {\n ...init,\n credentials: \"same-origin\",\n headers: { Accept: \"application/json\", ...init.headers },\n });\n } catch (cause) {\n if (init.signal?.aborted) {\n throw init.signal.reason ?? cause;\n }\n if (attempt === 1) {\n throw new ZappieError(\"network_error\", message, {\n cause,\n retryable: true,\n });\n }\n await wait(400, init.signal ?? undefined);\n }\n }\n throw new ZappieError(\"network_error\", message, { retryable: true });\n}\n","import { stableErrorCode } from \"../internal/customer-http\";\nimport { ZappieError } from \"./sdk\";\n\n/**\n * A checkout API failure with its HTTP status, API code and optional validation issues.\n * Statuses 409, 429 and 5xx are marked retryable.\n */\nexport class CheckoutError extends ZappieError {\n readonly issues?: unknown;\n\n constructor(\n status: number,\n readonly apiCode: string,\n message: string,\n param?: string,\n issues?: unknown,\n ) {\n super(stableErrorCode(status), message, {\n status,\n // 409 means the same idempotency key is still being processed; retrying with it is safe.\n retryable: status === 409 || status === 429 || status >= 500,\n ...(param !== undefined ? { param } : {}),\n });\n if (issues !== undefined) {\n this.issues = issues;\n }\n }\n}\n","import { type Currency, money, ZappieError } from \"./sdk\";\nimport type { CheckoutSession } from \"./types\";\n\nfunction object(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new ZappieError(\"server_error\", \"Invalid checkout session response\");\n }\n return value as Record<string, unknown>;\n}\n\nfunction string(value: unknown): string {\n if (typeof value !== \"string\") {\n throw new ZappieError(\"server_error\", \"Invalid checkout session response\");\n }\n return value;\n}\n\nfunction currency(value: unknown): Currency {\n try {\n return money(0, string(value)).currency;\n } catch {\n throw new ZappieError(\"server_error\", \"Invalid checkout session response\");\n }\n}\n\nexport function mapCheckoutSession(value: unknown): CheckoutSession {\n const session = object(value);\n const amount = object(session.amount);\n const status = string(session.status);\n if (\n !([\"open\", \"completed\", \"expired\", \"cancelled\"] as string[]).includes(\n status,\n )\n ) {\n throw new ZappieError(\"server_error\", \"Invalid checkout session response\");\n }\n const expiresAt = string(session.expires_at);\n if (!Number.isFinite(Date.parse(expiresAt))) {\n throw new ZappieError(\"server_error\", \"Invalid checkout session response\");\n }\n if (!Number.isSafeInteger(amount.amount_minor)) {\n throw new ZappieError(\"server_error\", \"Invalid checkout session response\");\n }\n if (session.order_id !== null && typeof session.order_id !== \"string\") {\n throw new ZappieError(\"server_error\", \"Invalid checkout session response\");\n }\n return {\n id: string(session.id),\n status: status as CheckoutSession[\"status\"],\n ...(typeof session.url === \"string\" ? { url: session.url } : {}),\n amount: {\n amount_minor: amount.amount_minor as number,\n currency: currency(amount.currency),\n },\n order_id: session.order_id,\n return_url: string(session.return_url),\n ...(typeof session.cancel_url === \"string\"\n ? { cancel_url: session.cancel_url }\n : {}),\n expires_at: expiresAt,\n };\n}\n","import { apiError, requestWithRetry, wait } from \"../internal/customer-http\";\nimport { CheckoutError } from \"./error\";\nimport { ZappieError } from \"./sdk\";\nimport { mapCheckoutSession } from \"./session\";\nimport type {\n AwaitCompletionOptions,\n CheckoutClientOptions,\n CheckoutCompletion,\n CheckoutRequest,\n CheckoutSession,\n OpenCheckoutSession,\n} from \"./types\";\n\nconst DEFAULT_CUSTOMER_BASE = \"/_zappie/api\";\n\nasync function error(response: Response): Promise<CheckoutError> {\n const value = await apiError(\n response,\n `The checkout service answered ${response.status}`,\n );\n return new CheckoutError(\n response.status,\n value.apiCode,\n value.message,\n value.param,\n value.issues,\n );\n}\n\n/**\n * Create a client that opens checkout sessions, reads them and polls for completion.\n *\n * @param options - Override the default `/_zappie/api` base or fetch implementation.\n * @returns A checkout client. Retain each idempotency key when retrying the same cart.\n */\nexport function createCheckout(options: CheckoutClientOptions = {}) {\n const base = (options.customerBase ?? DEFAULT_CUSTOMER_BASE).replace(\n /\\/+$/,\n \"\",\n );\n const fetcher = options.fetch ?? globalThis.fetch;\n const request = async (\n path: string,\n init: RequestInit,\n ): Promise<CheckoutSession> => {\n const response = await requestWithRetry(\n fetcher,\n base + path,\n init,\n \"Could not reach checkout\",\n );\n if (!response.ok) {\n throw await error(response);\n }\n return mapCheckoutSession(await response.json());\n };\n const read = (id: string, signal?: AbortSignal) =>\n request(`/checkout/sessions/${encodeURIComponent(id)}`, {\n method: \"GET\",\n ...(signal ? { signal } : {}),\n });\n return {\n /** The caller retains this key and reuses it when retrying the same cart. */\n async open(\n body: CheckoutRequest,\n idempotencyKey: string,\n ): Promise<OpenCheckoutSession> {\n const session = await request(\"/checkout/sessions\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Idempotency-Key\": idempotencyKey,\n },\n body: JSON.stringify(body),\n });\n if (!session.url) {\n throw new ZappieError(\n \"server_error\",\n \"Checkout session has no payment URL\",\n );\n }\n globalThis.__zappieEmit?.(\"checkout:open\", session);\n return { ...session, url: session.url };\n },\n session(id: string): Promise<CheckoutSession> {\n return read(id);\n },\n async awaitCompletion(\n id: string,\n options: AwaitCompletionOptions = {},\n ): Promise<CheckoutCompletion> {\n const interval = options.intervalMs ?? 3_000;\n if (!Number.isFinite(interval) || interval < 0) {\n throw new ZappieError(\n \"invalid_request\",\n \"intervalMs cannot be negative\",\n );\n }\n for (;;) {\n options.signal?.throwIfAborted();\n try {\n const session = await read(id, options.signal);\n if (session.status === \"completed\" && session.order_id) {\n globalThis.__zappieEmit?.(\"checkout:completed\", session);\n return {\n ...session,\n status: \"completed\",\n order_id: session.order_id,\n };\n }\n if (session.status === \"expired\" || session.status === \"cancelled\") {\n return { ...session, status: session.status };\n }\n } catch (failure) {\n options.signal?.throwIfAborted();\n if (\n failure instanceof ZappieError &&\n failure.status !== undefined &&\n failure.status >= 400 &&\n failure.status < 500\n ) {\n throw failure;\n }\n }\n await wait(interval, options.signal);\n }\n },\n };\n}\n\n/**\n * The session creation, lookup and completion methods returned by createCheckout.\n */\nexport type CheckoutClient = ReturnType<typeof createCheckout>;\n","import type { Quote } from \"./sdk\";\n\n/**\n * The next action your payment UI should present, from fixing an address to paying.\n */\nexport type PayReadiness =\n | \"address\"\n | \"quoting\"\n | \"retry\"\n | \"choose_area\"\n | \"fix_issues\"\n | \"sign_in\"\n | \"phone\"\n | \"pay\";\n\n/**\n * The quote loading state and, when ready, the quote used to decide payment readiness.\n */\nexport type PayReadinessQuoteState =\n | { status: \"idle\" | \"loading\" }\n | { status: \"error\" }\n | { status: \"ready\"; quote: Quote };\n\n/**\n * Check whether a phone is blank or contains 7 to 15 digits with an optional leading plus.\n * Whitespace within a nonblank phone is ignored. This does not verify that the number exists.\n *\n * @param phone - The contact phone entered by the shopper.\n * @returns Whether the phone passes this optional-field format check.\n */\nexport function isContactPhoneValid(phone: string): boolean {\n return (\n phone.trim() === \"\" || /^\\+?[0-9]{7,15}$/.test(phone.replace(/\\s+/g, \"\"))\n );\n}\n\n/**\n * Choose the next payment action from address validity, quote state and contact phone validity.\n * Address and quote issues take priority over sign-in and phone prompts.\n *\n * @returns The action you should display in your payment UI.\n */\nexport function payReadiness(\n state: PayReadinessQuoteState,\n contactPhoneValid: boolean,\n addressValid = true,\n): PayReadiness {\n if (!addressValid) {\n return \"address\";\n }\n switch (state.status) {\n case \"idle\":\n case \"loading\":\n return \"quoting\";\n case \"error\":\n return \"retry\";\n }\n if (\n state.quote.issues.some(\n (issue) => issue.code === \"delivery_region_required\",\n )\n ) {\n return \"choose_area\";\n }\n if (!state.quote.canCheckout || state.quote.checkout.reason === \"issues\") {\n return \"fix_issues\";\n }\n if (state.quote.checkout.reason === \"customer_required\") {\n return \"sign_in\";\n }\n if (!contactPhoneValid) {\n return \"phone\";\n }\n return \"pay\";\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var D=["network_error","timeout","rate_limited","unauthorized","forbidden_origin","not_found","store_not_found","branch_not_found","item_not_found","cart_invalid","invalid_request","version_unsupported","server_error"],u=class extends Error{constructor(r,s,t={}){super(s,{cause:t.cause});this.code=r;this.name="ZappieError",t.status!==void 0&&(this.status=t.status),t.param!==void 0&&(this.param=t.param),t.requestId!==void 0&&(this.requestId=t.requestId),this.docUrl=t.docUrl??`https://docs.zappie.ai/errors#${r}`,this.retryable=t.retryable??["network_error","timeout","rate_limited","server_error"].includes(r);}};function N(n){return n instanceof u}function j(n){return N(n)?n:new u("network_error","The storefront request failed",{cause:n})}function V(n,e,r){let s=n&&typeof n=="object"?n:{},t=s.error&&typeof s.error=="object"?s.error:{},p=e===401?"unauthorized":e===403?"forbidden_origin":e===404?"not_found":e===429?"rate_limited":e>=500?"server_error":"invalid_request",o=typeof t.code=="string"&&D.includes(t.code),m=o?t.code:t.code?"server_error":p,a=typeof t.message=="string"?t.message:"The storefront request failed";return new u(m,!o&&t.code?`${String(t.code)}: ${a}`:a,{status:e,...r?{requestId:r}:{},...typeof t.param=="string"?{param:t.param}:{},...typeof t.doc_url=="string"?{docUrl:t.doc_url}:{}})}var R=" AFN ALL BIF CLP DJF GNF IQD IRR ISK JPY KMF KPW KRW LAK LBP MGA MMK PYG RSD RWF SLL SOS SYP UGX UYI VND VUV XAF XOF XPF YER ",A=" BHD JOD KWD LYD OMR TND ",F=" CLF UYW ",T=" BOV CHE CHW CLF COU MXV USN UYI UYW VED ",k=(n,e)=>n.includes(` ${e} `),C;function U(n){return /^[A-Z]{3}$/.test(n)?typeof Intl.supportedValuesOf!="function"?true:(C??(C=new Set(Intl.supportedValuesOf("currency"))),k(T,n)||C.has(n)):false}function G(n){return k(R,n)?0:k(A,n)?3:k(F,n)?4:2}function y(n,e){let r=typeof e=="string"?e.trim().toUpperCase():"";if(!Number.isSafeInteger(n)||!U(r))throw new u("invalid_request","Money requires safe integer minor units and a valid ISO 4217 currency");return Object.freeze({amountMinor:n,currency:r})}var H={money(n,e={}){let r=y(n.amountMinor,n.currency),s=r.currency==="NGN"?"en-NG":"en",t=G(r.currency);return new Intl.NumberFormat(s,{style:"currency",currency:r.currency,currencyDisplay:"narrowSymbol",minimumFractionDigits:e.showZeroDecimals||r.amountMinor%10**t!==0?t:0,maximumFractionDigits:t,notation:e.compact?"compact":"standard",signDisplay:e.sign??"auto"}).format(r.amountMinor/10**t)}};function J(n,e){let r=e.amountMinor;for(let s of n){if(s.currency!==e.currency)throw new u("invalid_request","Cannot combine different currencies");r=y(r+s.amountMinor,e.currency).amountMinor;}return y(r,e.currency)}function Q(n,e){if(!Number.isSafeInteger(e))throw new u("invalid_request","Money requires an integer quantity");return y(n.amountMinor*e,n.currency)}async function ne(n){let e=await globalThis.crypto.subtle.digest("SHA-256",new TextEncoder().encode(n));return Array.from(new Uint8Array(e),r=>r.toString(16).padStart(2,"0")).join("")}var g=class extends Error{};function c(n){if(!n||typeof n!="object"||Array.isArray(n))throw new u("server_error","Invalid storefront response object");return n}function i(n){if(typeof n!="string")throw new u("server_error","Invalid storefront response string");return n}function l(n){if(!Array.isArray(n))throw new u("server_error","Invalid storefront response list");return n}function _(n){if(typeof n!="number"||!Number.isFinite(n))throw new u("server_error","Invalid storefront response number");return n}function h(n){let e=_(n);if(e<0)throw new u("server_error","Negative selection or quantity bound");return e}function E(n){let e=c(n),r=h(e.min);if(e.max==null)return {min:r};let s=h(e.max);if(s<r)throw new u("server_error","Maximum quantity is below its minimum");return {min:r,max:s}}var v=n=>typeof n=="string",w=n=>typeof n=="boolean";function f(n,e,r){return r(e)?{[n]:e}:{}}function b(n){let e=c(n);return y(_(e.amount_minor??e.amountMinor),i(e.currency))}function Z(n){return l(n??[]).map(e=>{let r=c(e),s=_(r.day);if(!Number.isInteger(s)||s<0||s>6)throw new u("server_error","Invalid opening day");return {day:s,opens:i(r.opens??r.open??r.start),closes:i(r.closes??r.close??r.end),...f("disabled",r.disabled,w)}})}function K(n){if(n===void 0)return;let e=c(n);return {openingTimes:Z(e.opening_times??e.openingTimes??e.hours??[]),...f("preorder",e.preorder,w),...e.preorder_notice_hours!==void 0?{preorderNoticeHours:_(e.preorder_notice_hours)}:{},...e.preorder_max_days!==void 0?{preorderMaxDays:_(e.preorder_max_days)}:{}}}function L(n){let e=c(n),r=c(e.selection??{min:e.min??0,max:e.max}),s=e.is_attribute===true,t=i(e.kind??"select");if(!["select","text","number","date","time","toggle"].includes(t))throw new g(`option input kind "${t}"`);return {id:i(e.id),name:i(e.name),kind:t,required:typeof e.required=="boolean"?e.required:_(r.min)>0,selection:E(r),isAttribute:s,choices:l(e.choices??[]).map(p=>{let o=c(p),m=b(o.price);return {id:i(o.id),name:i(o.name),price:s?y(0,m.currency):m,...s&&o.price_hint!==void 0?{priceHint:b(o.price_hint)}:{},isAvailable:(o.is_available??o.available)===true,...o.quantity?{quantity:E(o.quantity)}:{}}}),...f("helpText",e.help_text,v),...e.input?{input:{...c(e.input).max_length!==void 0?{maxLength:_(c(e.input).max_length)}:{},...typeof c(e.input).placeholder=="string"?{placeholder:i(c(e.input).placeholder)}:{}}}:{},...f("isAvailable",e.is_available,w),...f("isInformational",e.is_informational,w),...e.conditions?{conditions:l(e.conditions).map(p=>{let o=c(p),m=o.count?c(o.count):void 0;if(m&&!["eq","gte","lte"].includes(i(m.op)))throw new g(`option count operator "${i(m.op)}"`);if(o.match!==void 0&&o.match!=="any"&&o.match!=="all")throw new g(`option match operator "${String(o.match)}"`);if(o.set_required!=null&&typeof o.set_required!="boolean")throw new u("server_error","Invalid conditional required flag");return {groupId:i(o.group_id),choiceIds:l(o.choice_ids??[]).map(i),match:o.match==="all"?"all":"any",...m?{count:{op:i(m.op),value:h(m.value)}}:{},...o.set_required!==void 0?{setRequired:o.set_required}:{},...o.set_min!==void 0?{setMin:o.set_min===null?null:h(o.set_min)}:{},...o.set_max!==void 0?{setMax:o.set_max===null?null:h(o.set_max)}:{}}})}:{}}}function P(n){let e=c(n);return {name:i(e.name)}}function $(n){let e=c(n),r=i(e.id),s=[],t=false;for(let a of l(e.option_groups??[]))try{s.push(L(a));}catch(d){if(!(d instanceof g))throw d;t=true,console.warn(`Zappie item ${r} uses an ${d.message} this SDK can't validate; it is shown as unavailable`);}let p=l(e.variants).map(a=>{let d=c(a);return {id:i(d.id),attributeChoices:Object.fromEntries(Object.entries(c(d.attribute_choices??{})).map(([x,q])=>[x,i(q)])),price:b(d.price),...f("lowStock",d.low_stock,w),isAvailable:!t&&(d.is_available??d.available)===true}});if(!p.length)throw new u("server_error","An item must carry at least one exact variant");let o=c(e.quantity??{min:1,step:1,max:e.max_quantity}),m=_(o.step);if(m<=0||new Set(p.map(a=>a.id)).size!==p.length)throw new u("server_error","Invalid quantity step or duplicate variant identity");return {...e.placements!==void 0?{placements:l(e.placements).map(a=>{let d=c(a);return {menuId:i(d.menu_id),categoryId:i(d.category_id)}})}:{},id:r,name:i(e.name),images:l(e.images??[]).map(i),price:b(e.price),isAvailable:!t&&(e.is_available??e.available)===true,quantity:{...E(o),step:m},variants:p,optionGroups:s,tags:l(e.tags??[]).map(i),...f("stockLabel",e.stock_label,v),...e.promo!==void 0?{promo:P(e.promo)}:{},...f("description",e.description,v),...e.compare_at_price?{compareAtPrice:b(e.compare_at_price)}:{}}}function ie(n,e){let r=c(n),s=l(r.menus??[r]);if(r.completeness!==void 0&&r.completeness!=="partial"&&r.completeness!=="complete")throw new u("server_error","Invalid catalogue completeness");let t=new Map,p=s.map(m=>{let a=c(m);if(a.placement_count!==void 0&&(!Number.isSafeInteger(a.placement_count)||Number(a.placement_count)<0)||a.paginated!==void 0&&typeof a.paginated!="boolean")throw new u("server_error","Invalid menu loading metadata");let d=l(a.categories??[]).map(q=>{let I=c(q),M=i(I.id),S=t.get(M),O=[...new Set([...S?.itemIds??[],...l(I.item_ids??[]).map(i)])];return t.set(M,{id:M,name:i(I.name),itemIds:O,...f("description",I.description,v)}),M}),x=K(a.schedule);return {id:i(a.id),name:i(a.name),categoryIds:d,...a.placement_count!==void 0?{placementCount:a.placement_count}:{},...f("paginated",a.paginated,w),...x?{schedule:x}:{},...f("infoBanner",a.info_banner,v)}}),o=Object.fromEntries(Object.entries(c(r.items)).map(([m,a])=>{let d=$(a);if(d.id!==m)throw new u("server_error","Item map key does not match its identity");return [m,d]}));if(r.branch_id!==void 0&&r.branch_id!==e)throw new u("server_error","Menu branch mismatch");return {id:p.length===1?p[0].id:`branch:${e}`,branchId:e,...r.completeness==="partial"?{completeness:"partial"}:{},name:p.length===1?p[0].name:"Catalogue",version:i(r.menu_version??r.version),categories:[...t.values()],items:o,menus:p,...p.length===1&&p[0].schedule?{schedule:p[0].schedule}:{}}}
|
|
2
|
+
export{u as a,N as b,j as c,V as d,y as e,H as f,J as g,Q as h,ne as i,c as j,i as k,l,v as m,w as n,f as o,b as p,Z as q,$ as r,ie as s};//# sourceMappingURL=chunk-I55A5QXJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/money.ts","../src/internal/money-math.ts","../src/internal/digest.ts","../src/transport/mappers.ts"],"names":["codes","ZappieError","code","message","details","isZappieError","error","asError","wireError","value","status","requestId","envelope","e","fallback","known","ZERO_DIGIT_CURRENCIES","THREE_DIGIT_CURRENCIES","FOUR_DIGIT_CURRENCIES","API_ONLY_CURRENCIES","contains","currency","intlCurrencies","isCurrency","currencyDigits","money","amountMinor","normalized","format","opts","locale","digits","sumMoney","values","zero","amount","multiplyMoney","quantity","payloadKey","payload","digest","byte","UnsupportedValue","record","text","list","number","nonnegative","result","bounds","input","min","max","isString","isBoolean","opt","key","is","mapMoney","v","hours","slot","day","schedule","mapGroup","g","selection","isAttribute","kind","raw","c","price","count","mapPromo","p","mapItem","id","optionGroups","unsupported","variants","x","k","step","variant","placement","mapMenu","branchId","sources","categories","menus","m","categoryIds","rawCategory","previous","itemIds","s","items","item","mapped"],"mappings":"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","file":"chunk-I55A5QXJ.js","sourcesContent":["/** Stable public error codes. */\nexport type ZappieErrorCode =\n | \"network_error\"\n | \"timeout\"\n | \"rate_limited\"\n | \"unauthorized\"\n | \"forbidden_origin\"\n | \"not_found\"\n | \"store_not_found\"\n | \"branch_not_found\"\n | \"item_not_found\"\n | \"cart_invalid\"\n | \"invalid_request\"\n | \"version_unsupported\"\n | \"server_error\";\nconst codes: readonly string[] = [\n \"network_error\",\n \"timeout\",\n \"rate_limited\",\n \"unauthorized\",\n \"forbidden_origin\",\n \"not_found\",\n \"store_not_found\",\n \"branch_not_found\",\n \"item_not_found\",\n \"cart_invalid\",\n \"invalid_request\",\n \"version_unsupported\",\n \"server_error\",\n];\n/** Context attached to an SDK failure. */\nexport type ErrorDetails = {\n status?: number;\n param?: string;\n docUrl?: string;\n requestId?: string;\n retryable?: boolean;\n cause?: unknown;\n};\n/** An SDK error you can handle by its stable code. */\nexport class ZappieError extends Error {\n readonly status?: number;\n readonly param?: string;\n readonly docUrl: string;\n readonly requestId?: string;\n readonly retryable: boolean;\n constructor(\n readonly code: ZappieErrorCode,\n message: string,\n details: ErrorDetails = {},\n ) {\n super(message, { cause: details.cause });\n this.name = \"ZappieError\";\n if (details.status !== undefined) {\n this.status = details.status;\n }\n if (details.param !== undefined) {\n this.param = details.param;\n }\n if (details.requestId !== undefined) {\n this.requestId = details.requestId;\n }\n this.docUrl = details.docUrl ?? `https://docs.zappie.ai/errors#${code}`;\n this.retryable =\n details.retryable ??\n [\"network_error\", \"timeout\", \"rate_limited\", \"server_error\"].includes(\n code,\n );\n }\n}\n/** Check whether a thrown value is a ZappieError. */\nexport function isZappieError(error: unknown): error is ZappieError {\n return error instanceof ZappieError;\n}\nexport function asError(error: unknown): ZappieError {\n return isZappieError(error)\n ? error\n : new ZappieError(\"network_error\", \"The storefront request failed\", {\n cause: error,\n });\n}\nexport function wireError(\n value: unknown,\n status: number,\n requestId?: string,\n): ZappieError {\n const envelope =\n value && typeof value === \"object\"\n ? (value as Record<string, unknown>)\n : {};\n const e =\n envelope.error && typeof envelope.error === \"object\"\n ? (envelope.error as Record<string, unknown>)\n : {};\n const fallback =\n status === 401\n ? \"unauthorized\"\n : status === 403\n ? \"forbidden_origin\"\n : status === 404\n ? \"not_found\"\n : status === 429\n ? \"rate_limited\"\n : status >= 500\n ? \"server_error\"\n : \"invalid_request\";\n const known = typeof e.code === \"string\" && codes.includes(e.code);\n const code = known\n ? (e.code as ZappieErrorCode)\n : e.code\n ? \"server_error\"\n : fallback;\n const message =\n typeof e.message === \"string\" ? e.message : \"The storefront request failed\";\n return new ZappieError(\n code,\n !known && e.code ? `${String(e.code)}: ${message}` : message,\n {\n status,\n ...(requestId ? { requestId } : {}),\n ...(typeof e.param === \"string\" ? { param: e.param } : {}),\n ...(typeof e.doc_url === \"string\" ? { docUrl: e.doc_url } : {}),\n },\n );\n}\n","import { ZappieError } from \"./errors\";\ndeclare const MoneyBrand: unique symbol;\n/** A normalized ISO 4217 currency code. */\nexport type Currency = string;\n// Minor-unit digits match the API, which scales amount_minor with\n// github.com/bojanz/currency v1.2.0 (pkg/currency.Digits). Intl differs for COP,\n// HUF, IDR, PKR and RSD, so it only presents the amount. Unlisted codes use 2.\nconst ZERO_DIGIT_CURRENCIES =\n \" AFN ALL BIF CLP DJF GNF IQD IRR ISK JPY KMF KPW KRW LAK LBP MGA MMK PYG RSD RWF SLL SOS SYP UGX UYI VND VUV XAF XOF XPF YER \";\nconst THREE_DIGIT_CURRENCIES = \" BHD JOD KWD LYD OMR TND \";\nconst FOUR_DIGIT_CURRENCIES = \" CLF UYW \";\n// API codes that Intl.supportedValuesOf(\"currency\") doesn't list.\nconst API_ONLY_CURRENCIES = \" BOV CHE CHW CLF COU MXV USN UYI UYW VED \";\nconst contains = (codes: string, currency: string) =>\n codes.includes(` ${currency} `);\nlet intlCurrencies: Set<string> | undefined;\nfunction isCurrency(code: string): boolean {\n if (!/^[A-Z]{3}$/.test(code)) {\n return false;\n }\n if (typeof Intl.supportedValuesOf !== \"function\") {\n return true;\n }\n intlCurrencies ??= new Set(Intl.supportedValuesOf(\"currency\"));\n return contains(API_ONLY_CURRENCIES, code) || intlCurrencies.has(code);\n}\nfunction currencyDigits(currency: Currency): number {\n if (contains(ZERO_DIGIT_CURRENCIES, currency)) {\n return 0;\n }\n if (contains(THREE_DIGIT_CURRENCIES, currency)) {\n return 3;\n }\n return contains(FOUR_DIGIT_CURRENCIES, currency) ? 4 : 2;\n}\n/** A frozen amount in safe integer minor units. Create it with money(). */\nexport type Money = {\n readonly amountMinor: number;\n readonly currency: Currency;\n readonly [MoneyBrand]: true;\n};\n/** Validate an amount in minor units and freeze it without rounding. */\nexport function money(amountMinor: number, currency: Currency): Money {\n const normalized =\n typeof currency === \"string\" ? currency.trim().toUpperCase() : \"\";\n if (!Number.isSafeInteger(amountMinor) || !isCurrency(normalized)) {\n throw new ZappieError(\n \"invalid_request\",\n \"Money requires safe integer minor units and a valid ISO 4217 currency\",\n );\n }\n return Object.freeze({ amountMinor, currency: normalized }) as Money;\n}\n/** Currency presentation options. */\nexport type MoneyFormatOptions = {\n showZeroDecimals?: boolean;\n compact?: boolean;\n sign?: \"auto\" | \"always\";\n};\n/** Format amounts for display. Use server quotes for final prices. */\nexport interface Formatters {\n money(value: Money, opts?: MoneyFormatOptions): string;\n}\n/** Format money with currency-specific minor units and locale defaults. */\nexport const format: Formatters = {\n money(value, opts = {}) {\n const normalized = money(value.amountMinor, value.currency);\n const locale = normalized.currency === \"NGN\" ? \"en-NG\" : \"en\";\n const digits = currencyDigits(normalized.currency);\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency: normalized.currency,\n currencyDisplay: \"narrowSymbol\",\n minimumFractionDigits:\n opts.showZeroDecimals || normalized.amountMinor % 10 ** digits !== 0\n ? digits\n : 0,\n maximumFractionDigits: digits,\n notation: opts.compact ? \"compact\" : \"standard\",\n signDisplay: opts.sign ?? \"auto\",\n }).format(normalized.amountMinor / 10 ** digits);\n },\n};\n","import { ZappieError } from \"../errors\";\nimport type { Money } from \"../money\";\nimport { money } from \"../money\";\nexport function sumMoney(values: readonly Money[], zero: Money): Money {\n let amount = zero.amountMinor;\n for (const value of values) {\n if (value.currency !== zero.currency) {\n throw new ZappieError(\n \"invalid_request\",\n \"Cannot combine different currencies\",\n );\n }\n amount = money(amount + value.amountMinor, zero.currency).amountMinor;\n }\n return money(amount, zero.currency);\n}\nexport function multiplyMoney(value: Money, quantity: number): Money {\n if (!Number.isSafeInteger(quantity)) {\n throw new ZappieError(\n \"invalid_request\",\n \"Money requires an integer quantity\",\n );\n }\n return money(value.amountMinor * quantity, value.currency);\n}\n","/** Payload digests avoid putting notes, addresses or credentials in request headers. */\nexport async function payloadKey(payload: string): Promise<string> {\n const digest = await globalThis.crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(payload),\n );\n return Array.from(new Uint8Array(digest), (byte) =>\n byte.toString(16).padStart(2, \"0\"),\n ).join(\"\");\n}\n","import { ZappieError } from \"../errors\";\nimport type {\n Item,\n Menu,\n MenuSchedule,\n OpeningTime,\n OptionGroup,\n Variant,\n} from \"../models\";\nimport type { Currency, Money } from \"../money\";\nimport { money } from \"../money\";\n/** A value newer than this SDK; the item that carries it is shown as unavailable. */\nclass UnsupportedValue extends Error {}\nexport function record(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new ZappieError(\"server_error\", \"Invalid storefront response object\");\n }\n return value as Record<string, unknown>;\n}\nexport function text(value: unknown): string {\n if (typeof value !== \"string\") {\n throw new ZappieError(\"server_error\", \"Invalid storefront response string\");\n }\n return value;\n}\nexport function list(value: unknown): unknown[] {\n if (!Array.isArray(value)) {\n throw new ZappieError(\"server_error\", \"Invalid storefront response list\");\n }\n return value;\n}\nfunction number(value: unknown): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new ZappieError(\"server_error\", \"Invalid storefront response number\");\n }\n return value;\n}\nfunction nonnegative(value: unknown): number {\n const result = number(value);\n if (result < 0) {\n throw new ZappieError(\n \"server_error\",\n \"Negative selection or quantity bound\",\n );\n }\n return result;\n}\nfunction bounds(value: unknown): { min: number; max?: number } {\n const input = record(value);\n const min = nonnegative(input.min);\n if (input.max == null) {\n return { min };\n }\n const max = nonnegative(input.max);\n if (max < min) {\n throw new ZappieError(\n \"server_error\",\n \"Maximum quantity is below its minimum\",\n );\n }\n return { min, max };\n}\nexport const isString = (value: unknown): value is string =>\n typeof value === \"string\";\nexport const isBoolean = (value: unknown): value is boolean =>\n typeof value === \"boolean\";\n/** `{ [key]: value }` when the value passes the guard, otherwise `{}`, for optional wire fields. */\nexport function opt<K extends string, T>(\n key: K,\n value: unknown,\n is: (value: unknown) => value is T,\n): { [P in K]?: T } {\n return is(value) ? ({ [key]: value } as { [P in K]?: T }) : {};\n}\nexport function mapMoney(value: unknown): Money {\n const v = record(value);\n return money(\n number(v.amount_minor ?? v.amountMinor),\n text(v.currency) as Currency,\n );\n}\nexport function hours(value: unknown): OpeningTime[] {\n return list(value ?? []).map((slot) => {\n const v = record(slot);\n const day = number(v.day);\n if (!Number.isInteger(day) || day < 0 || day > 6) {\n throw new ZappieError(\"server_error\", \"Invalid opening day\");\n }\n return {\n day: day as OpeningTime[\"day\"],\n opens: text(v.opens ?? v.open ?? v.start),\n closes: text(v.closes ?? v.close ?? v.end),\n ...opt(\"disabled\", v.disabled, isBoolean),\n };\n });\n}\nfunction schedule(value: unknown): MenuSchedule | undefined {\n if (value === undefined) {\n return undefined;\n }\n const v = record(value);\n return {\n openingTimes: hours(v.opening_times ?? v.openingTimes ?? v.hours ?? []),\n ...opt(\"preorder\", v.preorder, isBoolean),\n ...(v.preorder_notice_hours !== undefined\n ? { preorderNoticeHours: number(v.preorder_notice_hours) }\n : {}),\n ...(v.preorder_max_days !== undefined\n ? { preorderMaxDays: number(v.preorder_max_days) }\n : {}),\n };\n}\nfunction mapGroup(value: unknown): OptionGroup {\n const g = record(value);\n const selection = record(g.selection ?? { min: g.min ?? 0, max: g.max });\n const isAttribute = g.is_attribute === true;\n const kind = text(g.kind ?? \"select\");\n if (![\"select\", \"text\", \"number\", \"date\", \"time\", \"toggle\"].includes(kind)) {\n throw new UnsupportedValue(`option input kind \"${kind}\"`);\n }\n return {\n id: text(g.id),\n name: text(g.name),\n kind: kind as OptionGroup[\"kind\"],\n required:\n typeof g.required === \"boolean\" ? g.required : number(selection.min) > 0,\n selection: bounds(selection),\n isAttribute,\n choices: list(g.choices ?? []).map((raw) => {\n const c = record(raw);\n const price = mapMoney(c.price);\n return {\n id: text(c.id),\n name: text(c.name),\n price: isAttribute ? money(0, price.currency) : price,\n ...(isAttribute && c.price_hint !== undefined\n ? { priceHint: mapMoney(c.price_hint) }\n : {}),\n isAvailable: (c.is_available ?? c.available) === true,\n ...(c.quantity ? { quantity: bounds(c.quantity) } : {}),\n };\n }),\n ...opt(\"helpText\", g.help_text, isString),\n ...(g.input\n ? {\n input: {\n ...(record(g.input).max_length !== undefined\n ? { maxLength: number(record(g.input).max_length) }\n : {}),\n ...(typeof record(g.input).placeholder === \"string\"\n ? { placeholder: text(record(g.input).placeholder) }\n : {}),\n },\n }\n : {}),\n ...opt(\"isAvailable\", g.is_available, isBoolean),\n ...opt(\"isInformational\", g.is_informational, isBoolean),\n ...(g.conditions\n ? {\n conditions: list(g.conditions).map((raw) => {\n const c = record(raw);\n const count = c.count ? record(c.count) : undefined;\n if (count && ![\"eq\", \"gte\", \"lte\"].includes(text(count.op))) {\n throw new UnsupportedValue(\n `option count operator \"${text(count.op)}\"`,\n );\n }\n if (\n c.match !== undefined &&\n c.match !== \"any\" &&\n c.match !== \"all\"\n ) {\n throw new UnsupportedValue(\n `option match operator \"${String(c.match)}\"`,\n );\n }\n if (c.set_required != null && typeof c.set_required !== \"boolean\") {\n throw new ZappieError(\n \"server_error\",\n \"Invalid conditional required flag\",\n );\n }\n return {\n groupId: text(c.group_id),\n choiceIds: list(c.choice_ids ?? []).map(text),\n match: c.match === \"all\" ? (\"all\" as const) : (\"any\" as const),\n ...(count\n ? {\n count: {\n op: text(count.op) as \"eq\" | \"gte\" | \"lte\",\n value: nonnegative(count.value),\n },\n }\n : {}),\n ...(c.set_required !== undefined\n ? { setRequired: c.set_required as boolean | null }\n : {}),\n ...(c.set_min !== undefined\n ? { setMin: c.set_min === null ? null : nonnegative(c.set_min) }\n : {}),\n ...(c.set_max !== undefined\n ? { setMax: c.set_max === null ? null : nonnegative(c.set_max) }\n : {}),\n };\n }),\n }\n : {}),\n };\n}\nfunction mapPromo(value: unknown): NonNullable<Item[\"promo\"]> {\n const p = record(value);\n return { name: text(p.name) };\n}\nexport function mapItem(value: unknown): Item {\n const v = record(value);\n const id = text(v.id);\n const optionGroups: OptionGroup[] = [];\n let unsupported = false;\n for (const raw of list(v.option_groups ?? [])) {\n try {\n optionGroups.push(mapGroup(raw));\n } catch (error) {\n if (!(error instanceof UnsupportedValue)) {\n throw error;\n }\n unsupported = true;\n console.warn(\n `Zappie item ${id} uses an ${error.message} this SDK can't validate; it is shown as unavailable`,\n );\n }\n }\n const variants = list(v.variants).map((raw) => {\n const x = record(raw);\n return {\n id: text(x.id),\n attributeChoices: Object.fromEntries(\n Object.entries(record(x.attribute_choices ?? {})).map(([k, v]) => [\n k,\n text(v),\n ]),\n ),\n price: mapMoney(x.price),\n ...opt(\"lowStock\", x.low_stock, isBoolean),\n isAvailable: !unsupported && (x.is_available ?? x.available) === true,\n };\n });\n if (!variants.length) {\n throw new ZappieError(\n \"server_error\",\n \"An item must carry at least one exact variant\",\n );\n }\n const quantity = record(\n v.quantity ?? { min: 1, step: 1, max: v.max_quantity },\n );\n const step = number(quantity.step);\n if (\n step <= 0 ||\n new Set(variants.map((variant) => variant.id)).size !== variants.length\n ) {\n throw new ZappieError(\n \"server_error\",\n \"Invalid quantity step or duplicate variant identity\",\n );\n }\n return {\n ...(v.placements !== undefined\n ? {\n placements: list(v.placements).map((raw) => {\n const placement = record(raw);\n return {\n menuId: text(placement.menu_id),\n categoryId: text(placement.category_id),\n };\n }),\n }\n : {}),\n id,\n name: text(v.name),\n images: list(v.images ?? []).map(text),\n price: mapMoney(v.price),\n isAvailable: !unsupported && (v.is_available ?? v.available) === true,\n quantity: { ...bounds(quantity), step },\n variants: variants as [Variant, ...Variant[]],\n optionGroups,\n tags: list(v.tags ?? []).map(text),\n ...opt(\"stockLabel\", v.stock_label, isString),\n ...(v.promo !== undefined ? { promo: mapPromo(v.promo) } : {}),\n ...opt(\"description\", v.description, isString),\n ...(v.compare_at_price\n ? { compareAtPrice: mapMoney(v.compare_at_price) }\n : {}),\n };\n}\nexport function mapMenu(value: unknown, branchId: string): Menu {\n const v = record(value);\n const sources = list(v.menus ?? [v]);\n if (\n v.completeness !== undefined &&\n v.completeness !== \"partial\" &&\n v.completeness !== \"complete\"\n ) {\n throw new ZappieError(\"server_error\", \"Invalid catalogue completeness\");\n }\n const categories = new Map<string, Menu[\"categories\"][number]>();\n const menus = sources.map((raw) => {\n const m = record(raw);\n if (\n (m.placement_count !== undefined &&\n (!Number.isSafeInteger(m.placement_count) ||\n Number(m.placement_count) < 0)) ||\n (m.paginated !== undefined && typeof m.paginated !== \"boolean\")\n ) {\n throw new ZappieError(\"server_error\", \"Invalid menu loading metadata\");\n }\n const categoryIds = list(m.categories ?? []).map((rawCategory) => {\n const c = record(rawCategory);\n const id = text(c.id);\n const previous = categories.get(id);\n const itemIds = [\n ...new Set([\n ...(previous?.itemIds ?? []),\n ...list(c.item_ids ?? []).map(text),\n ]),\n ];\n categories.set(id, {\n id,\n name: text(c.name),\n itemIds,\n ...opt(\"description\", c.description, isString),\n });\n return id;\n });\n const s = schedule(m.schedule);\n return {\n id: text(m.id),\n name: text(m.name),\n categoryIds,\n ...(m.placement_count !== undefined\n ? { placementCount: m.placement_count as number }\n : {}),\n ...opt(\"paginated\", m.paginated, isBoolean),\n ...(s ? { schedule: s } : {}),\n ...opt(\"infoBanner\", m.info_banner, isString),\n };\n });\n const items = Object.fromEntries(\n Object.entries(record(v.items)).map(([id, item]) => {\n const mapped = mapItem(item);\n if (mapped.id !== id) {\n throw new ZappieError(\n \"server_error\",\n \"Item map key does not match its identity\",\n );\n }\n return [id, mapped];\n }),\n );\n if (v.branch_id !== undefined && v.branch_id !== branchId) {\n throw new ZappieError(\"server_error\", \"Menu branch mismatch\");\n }\n return {\n id: menus.length === 1 ? menus[0]!.id : `branch:${branchId}`,\n branchId,\n ...(v.completeness === \"partial\"\n ? { completeness: \"partial\" as const }\n : {}),\n name: menus.length === 1 ? menus[0]!.name : \"Catalogue\",\n version: text(v.menu_version ?? v.version),\n categories: [...categories.values()],\n items,\n menus,\n ...(menus.length === 1 && menus[0]!.schedule\n ? { schedule: menus[0]!.schedule }\n : {}),\n };\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
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
|