@zappie/sdk 0.1.2 → 0.1.4
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 +12 -0
- package/README.md +1 -0
- package/dist/cart/index.js +5 -0
- package/dist/cart/index.js.map +2 -2
- package/dist/cart/item.d.ts +2 -2
- package/dist/cart/quote-response.js +27 -0
- package/dist/cart/quote-response.js.map +3 -3
- package/dist/cart/quote.d.ts +2 -2
- package/dist/cart/storage.js +1 -1
- package/dist/cart/storage.js.map +2 -2
- package/dist/cart/wire.js +1 -0
- package/dist/cart/wire.js.map +2 -2
- package/dist/{client-BctSrEhO.d.ts → client-RFcLoZ04.d.ts} +41 -2
- package/dist/debug.d.ts +2 -2
- package/dist/debug.js +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +1 -1
- package/dist/integrations/index.d.ts +38 -0
- package/dist/integrations/index.js +78 -0
- package/dist/integrations/index.js.map +7 -0
- package/dist/internal.d.ts +3 -3
- package/dist/{models-Dj-VkdU1.d.ts → models-Rg5kQUkv.d.ts} +26 -0
- package/dist/persist/catalogue.d.ts +2 -2
- package/dist/react/index.d.ts +2 -2
- package/dist/server/index.d.ts +2 -2
- package/dist/testing/index.d.ts +2 -2
- package/dist/transport/category-page.d.ts +1 -1
- package/dist/transport/mappers.js +80 -50
- package/dist/transport/mappers.js.map +3 -3
- package/dist/transport/quote-body.js +24 -0
- package/dist/transport/quote-body.js.map +7 -0
- package/dist/transport/rest.js +4 -1
- package/dist/transport/rest.js.map +2 -2
- package/dist/transport/search.d.ts +2 -2
- package/dist/transport/selected-menu.d.ts +2 -2
- package/dist/transport/selected-menu.js +1 -1
- package/dist/transport/selected-menu.js.map +2 -2
- package/dist/transport/store.d.ts +2 -2
- package/dist/transport/store.js +19 -8
- package/dist/transport/store.js.map +3 -3
- package/package.json +5 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @zappie/sdk
|
|
2
2
|
|
|
3
|
+
## 0.1.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 55d25c2: Read public integration IDs, branch delivery regions and storefront metadata. Keep quote fulfilment details and line prices available to your checkout, and send your selected delivery region and instructions to the API.
|
|
8
|
+
|
|
9
|
+
## 0.1.3
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 1533547: Read catalogue fields as the storefront API sends them. Items with attributes and add-ons stay available, variant choices retain their group identity, and prices, quantity bounds and menu schedules map to the existing SDK models.
|
|
14
|
+
|
|
3
15
|
## 0.1.2
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -56,6 +56,7 @@ Prices always come from Zappie. The cart shows a local estimate while it waits,
|
|
|
56
56
|
| `@zappie/sdk/react` | `ZappieProvider` and hooks such as `useStore`, `useMenu` and `useCart` |
|
|
57
57
|
| `@zappie/sdk/checkout` | Opening Zappie's hosted checkout and checking it completed |
|
|
58
58
|
| `@zappie/sdk/customer` and `/customer/react` | Signed-in customers, their orders and saved addresses |
|
|
59
|
+
| `@zappie/sdk/integrations` | Public tracking IDs for your app’s consent flow |
|
|
59
60
|
| `@zappie/sdk/places` | Address search and delivery-zone checks |
|
|
60
61
|
| `@zappie/sdk/server` | Server-side reads, storefront URLs and `verifyWebhook()` |
|
|
61
62
|
| `@zappie/sdk/template` and `/template/react` | Template settings and responsive images for template authors |
|
package/dist/cart/index.js
CHANGED
|
@@ -724,6 +724,11 @@ function createCart(deps) {
|
|
|
724
724
|
publish({ issues, state: attention(issues, accepted) });
|
|
725
725
|
return;
|
|
726
726
|
}
|
|
727
|
+
case "choose_region":
|
|
728
|
+
throw new ZappieError(
|
|
729
|
+
"invalid_request",
|
|
730
|
+
"Choose a delivery region and call setFulfilment with deliveryRegionId"
|
|
731
|
+
);
|
|
727
732
|
default:
|
|
728
733
|
throw new ZappieError(
|
|
729
734
|
"invalid_request",
|
package/dist/cart/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/cart/index.ts"],
|
|
4
|
-
"sourcesContent": ["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"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["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 case \"choose_region\":\n throw new ZappieError(\n \"invalid_request\",\n \"Choose a delivery region and call setFulfilment with deliveryRegionId\",\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"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/cart/item.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Z as Zappie } from '../client-
|
|
2
|
-
import { I as Item } from '../models-
|
|
1
|
+
import { Z as Zappie } from '../client-RFcLoZ04.js';
|
|
2
|
+
import { I as Item } from '../models-Rg5kQUkv.js';
|
|
3
3
|
|
|
4
4
|
/** Register an item already read by a partial/selected catalogue, without fetching it again. */
|
|
5
5
|
declare function prepareItem(client: Zappie, item: Item, options: {
|
|
@@ -25,6 +25,7 @@ function fix(value) {
|
|
|
25
25
|
case "accept_price":
|
|
26
26
|
case "remove_promo":
|
|
27
27
|
case "change_address":
|
|
28
|
+
case "choose_region":
|
|
28
29
|
return { action: v.action };
|
|
29
30
|
case "choose_option":
|
|
30
31
|
case "choose_other_option":
|
|
@@ -102,12 +103,29 @@ function mapQuote(value, branchId) {
|
|
|
102
103
|
return fail();
|
|
103
104
|
}
|
|
104
105
|
const deliveryCharges = charges.filter((c) => c.code === "delivery");
|
|
106
|
+
const integer = (value2) => {
|
|
107
|
+
if (!Number.isSafeInteger(value2) || Number(value2) < 0) {
|
|
108
|
+
return fail();
|
|
109
|
+
}
|
|
110
|
+
return value2;
|
|
111
|
+
};
|
|
112
|
+
const fulfilment = v.fulfilment === void 0 ? void 0 : record(v.fulfilment);
|
|
113
|
+
if (v.menu_version_stale !== void 0 && typeof v.menu_version_stale !== "boolean") {
|
|
114
|
+
return fail();
|
|
115
|
+
}
|
|
105
116
|
const lines = list(v.lines).map((raw) => {
|
|
106
117
|
const l = record(raw);
|
|
107
118
|
if ((l.unit_price == null || l.line_total == null) && v.lines_unpriced !== true) {
|
|
108
119
|
return fail();
|
|
109
120
|
}
|
|
110
121
|
return {
|
|
122
|
+
...l.item_id !== void 0 ? { itemId: text(l.item_id) } : {},
|
|
123
|
+
...l.name !== void 0 ? { name: text(l.name) } : {},
|
|
124
|
+
...l.quantity !== void 0 ? { quantity: integer(l.quantity) } : {},
|
|
125
|
+
...l.status !== void 0 ? { status: text(l.status) } : {},
|
|
126
|
+
...l.options_total !== void 0 ? {
|
|
127
|
+
optionsTotal: l.options_total === null ? null : amount(l.options_total)
|
|
128
|
+
} : {},
|
|
111
129
|
lineId: text(l.line_id),
|
|
112
130
|
unitPrice: l.unit_price == null ? null : amount(l.unit_price),
|
|
113
131
|
total: l.line_total == null ? null : amount(l.line_total)
|
|
@@ -120,6 +138,15 @@ function mapQuote(value, branchId) {
|
|
|
120
138
|
return fail();
|
|
121
139
|
}
|
|
122
140
|
return {
|
|
141
|
+
...v.menu_version_stale !== void 0 ? { menuVersionStale: v.menu_version_stale } : {},
|
|
142
|
+
...fulfilment ? {
|
|
143
|
+
fulfilment: {
|
|
144
|
+
type: text(fulfilment.type),
|
|
145
|
+
scheduledFor: fulfilment.scheduled_for === null ? null : text(fulfilment.scheduled_for),
|
|
146
|
+
...fulfilment.eta_minutes !== void 0 ? { etaMinutes: list(fulfilment.eta_minutes).map(integer) } : {},
|
|
147
|
+
...fulfilment.delivery_region_id !== void 0 ? { deliveryRegionId: text(fulfilment.delivery_region_id) } : {}
|
|
148
|
+
}
|
|
149
|
+
} : {},
|
|
123
150
|
lines,
|
|
124
151
|
...v.lines_unpriced === true ? { linesUnpriced: true } : {},
|
|
125
152
|
subtotal,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/cart/quote-response.ts"],
|
|
4
|
-
"sourcesContent": ["// Quote responses load lazily with the quote client, outside the synchronous core.\nimport { ZappieError } from \"../errors\";\nimport { sumMoney } from \"../internal/money-math\";\nimport { money } from \"../money\";\nimport { mapMoney, record } from \"../transport/mappers\";\nimport type { CartFix, CartFulfilment, CartIssue, Quote } from \"./types\";\nfunction fail(): never {\n throw new ZappieError(\"server_error\", \"Invalid quote response\");\n}\nfunction text(value: unknown): string {\n if (typeof value !== \"string\") {\n return fail();\n }\n return value;\n}\nfunction list(value: unknown): unknown[] {\n if (!Array.isArray(value)) {\n return fail();\n }\n return value;\n}\n/** A fix newer than this SDK is dropped (undefined); a malformed known fix still fails. */\nfunction fix(value: unknown): CartFix | undefined {\n const v = record(value);\n switch (v.action) {\n case \"remove_line\":\n case \"accept_price\":\n case \"remove_promo\":\n case \"change_address\":\n return { action: v.action };\n case \"choose_option\":\n case \"choose_other_option\":\n return { action: v.action, groupId: text(v.group_id) };\n case \"set_quantity\": {\n if (\n !Number.isInteger(v.quantity) ||\n Number(v.quantity) < 1 ||\n Number(v.quantity) > 99\n ) {\n return fail();\n }\n return { action: v.action, quantity: v.quantity as number };\n }\n case \"schedule\":\n return {\n action: v.action,\n ...(v.next_open_at ? { nextOpenAt: text(v.next_open_at) } : {}),\n ...(v.slots ? { slots: list(v.slots).map(text) } : {}),\n };\n case \"switch_fulfilment\": {\n const types = list(v.types)\n .map(text)\n .filter((t) => [\"pickup\", \"delivery\", \"dine_in\"].includes(t));\n return types.length\n ? { action: v.action, types: types as CartFulfilment[\"type\"][] }\n : undefined;\n }\n default:\n return undefined;\n }\n}\nconst codes = [\n \"item_unavailable\",\n \"item_not_found\",\n \"option_unavailable\",\n \"option_required\",\n \"option_limit\",\n \"quantity_limit\",\n \"price_changed\",\n \"branch_closed\",\n \"fulfilment_unavailable\",\n \"outside_delivery_zone\",\n \"delivery_region_required\",\n \"schedule_invalid\",\n \"promo_invalid\",\n \"promo_min_spend\",\n \"min_order\",\n \"menu_version_stale\",\n];\nexport function mapQuote(value: unknown, branchId: string): Quote {\n const v = record(value);\n if (\n v.branch_id !== branchId ||\n !Number.isFinite(Date.parse(text(v.expires_at)))\n ) {\n return fail();\n }\n const subtotal = mapMoney(v.subtotal);\n const checkout = record(v.checkout);\n if (\n typeof v.can_checkout !== \"boolean\" ||\n typeof checkout.ready !== \"boolean\" ||\n (checkout.reason !== undefined &&\n checkout.reason !== \"issues\" &&\n checkout.reason !== \"customer_required\")\n ) {\n return fail();\n }\n const amount = (raw: unknown) => {\n const result = mapMoney(raw);\n if (result.currency !== subtotal.currency) {\n return fail();\n }\n return result;\n };\n const charge = (raw: unknown) => {\n const c = record(raw);\n return {\n code: text(c.code),\n label: text(c.label),\n amount: amount(c.amount),\n };\n };\n const charges = list(v.charges).map(charge);\n const discounts = list(v.discounts).map(charge);\n const total = amount(v.total);\n if (\n sumMoney(\n [...charges, ...discounts].map((c) => c.amount),\n subtotal,\n ).amountMinor !== total.amountMinor\n ) {\n return fail();\n }\n const deliveryCharges = charges.filter((c) => c.code === \"delivery\");\n const lines = list(v.lines).map((raw) => {\n const l = record(raw);\n if (\n (l.unit_price == null || l.line_total == null) &&\n v.lines_unpriced !== true\n ) {\n return fail();\n }\n return {\n lineId: text(l.line_id),\n unitPrice: l.unit_price == null ? null : amount(l.unit_price),\n total: l.line_total == null ? null : amount(l.line_total),\n };\n });\n if (\n v.lines_unpriced !== true &&\n sumMoney(\n lines.map((line) => line.total!),\n money(0, subtotal.currency),\n ).amountMinor !== subtotal.amountMinor\n ) {\n return fail();\n }\n return {\n lines,\n ...(v.lines_unpriced === true ? { linesUnpriced: true } : {}),\n subtotal,\n total,\n fees: charges.filter((c) => c.code !== \"delivery\"),\n discounts,\n ...(deliveryCharges.length\n ? {\n delivery: sumMoney(\n deliveryCharges.map((c) => c.amount),\n money(0, subtotal.currency),\n ),\n }\n : {}),\n menuVersion: text(v.menu_version),\n expiresAt: text(v.expires_at),\n issues: list(v.issues).flatMap((raw): CartIssue[] => {\n const i = record(raw);\n const code = text(i.code);\n const severity = text(i.severity);\n const known =\n codes.includes(code) &&\n [\"blocking\", \"warning\", \"info\"].includes(severity);\n const fixes = list(i.fixes)\n .map(fix)\n .filter((f): f is CartFix => f !== undefined);\n const lineId = i.line_id ? text(i.line_id) : undefined;\n if (!known && (severity === \"warning\" || severity === \"info\")) {\n console.warn(\n `Zappie quote issue \"${code}\" is newer than this SDK and was skipped`,\n );\n return [];\n }\n // A blocking (or unknown-severity) issue newer than the SDK keeps checkout blocked.\n return [\n {\n code: known ? (code as CartIssue[\"code\"]) : \"item_unavailable\",\n severity: known ? (severity as CartIssue[\"severity\"]) : \"blocking\",\n message: text(i.message),\n source: \"quote\",\n ...(lineId ? { lineId } : {}),\n ...(i.group_id ? { groupId: text(i.group_id) } : {}),\n ...(i.data || !known\n ? {\n data: {\n ...(i.data ? record(i.data) : {}),\n ...(known ? {} : { code }),\n },\n }\n : {}),\n fixes:\n !known && !fixes.length && lineId\n ? [{ action: \"remove_line\" }]\n : fixes,\n },\n ];\n }),\n canCheckout: v.can_checkout,\n checkout: {\n ready: checkout.ready,\n ...(checkout.reason !== undefined ? { reason: checkout.reason } : {}),\n },\n };\n}\n"],
|
|
5
|
-
"mappings": ";AACA,SAAS,mBAAmB;AAC5B,SAAS,gBAAgB;AACzB,SAAS,aAAa;AACtB,SAAS,UAAU,cAAc;AAEjC,SAAS,OAAc;AACrB,QAAM,IAAI,YAAY,gBAAgB,wBAAwB;AAChE;AACA,SAAS,KAAK,OAAwB;AACpC,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,KAAK;AAAA,EACd;AACA,SAAO;AACT;AACA,SAAS,KAAK,OAA2B;AACvC,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO,KAAK;AAAA,EACd;AACA,SAAO;AACT;AAEA,SAAS,IAAI,OAAqC;AAChD,QAAM,IAAI,OAAO,KAAK;AACtB,UAAQ,EAAE,QAAQ;AAAA,IAChB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,QAAQ,EAAE,OAAO;AAAA,IAC5B,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,QAAQ,EAAE,QAAQ,SAAS,KAAK,EAAE,QAAQ,EAAE;AAAA,IACvD,KAAK,gBAAgB;AACnB,UACE,CAAC,OAAO,UAAU,EAAE,QAAQ,KAC5B,OAAO,EAAE,QAAQ,IAAI,KACrB,OAAO,EAAE,QAAQ,IAAI,IACrB;AACA,eAAO,KAAK;AAAA,MACd;AACA,aAAO,EAAE,QAAQ,EAAE,QAAQ,UAAU,EAAE,SAAmB;AAAA,IAC5D;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,QAAQ,EAAE;AAAA,QACV,GAAI,EAAE,eAAe,EAAE,YAAY,KAAK,EAAE,YAAY,EAAE,IAAI,CAAC;AAAA,QAC7D,GAAI,EAAE,QAAQ,EAAE,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,IAAI,CAAC;AAAA,MACtD;AAAA,IACF,KAAK,qBAAqB;AACxB,YAAM,QAAQ,KAAK,EAAE,KAAK,EACvB,IAAI,IAAI,EACR,OAAO,CAAC,MAAM,CAAC,UAAU,YAAY,SAAS,EAAE,SAAS,CAAC,CAAC;AAC9D,aAAO,MAAM,SACT,EAAE,QAAQ,EAAE,QAAQ,MAAyC,IAC7D;AAAA,IACN;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;AACA,IAAM,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACO,SAAS,SAAS,OAAgB,UAAyB;AAChE,QAAM,IAAI,OAAO,KAAK;AACtB,MACE,EAAE,cAAc,YAChB,CAAC,OAAO,SAAS,KAAK,MAAM,KAAK,EAAE,UAAU,CAAC,CAAC,GAC/C;AACA,WAAO,KAAK;AAAA,EACd;AACA,QAAM,WAAW,SAAS,EAAE,QAAQ;AACpC,QAAM,WAAW,OAAO,EAAE,QAAQ;AAClC,MACE,OAAO,EAAE,iBAAiB,aAC1B,OAAO,SAAS,UAAU,aACzB,SAAS,WAAW,UACnB,SAAS,WAAW,YACpB,SAAS,WAAW,qBACtB;AACA,WAAO,KAAK;AAAA,EACd;AACA,QAAM,SAAS,CAAC,QAAiB;AAC/B,UAAM,SAAS,SAAS,GAAG;AAC3B,QAAI,OAAO,aAAa,SAAS,UAAU;AACzC,aAAO,KAAK;AAAA,IACd;AACA,WAAO;AAAA,EACT;AACA,QAAM,SAAS,CAAC,QAAiB;AAC/B,UAAM,IAAI,OAAO,GAAG;AACpB,WAAO;AAAA,MACL,MAAM,KAAK,EAAE,IAAI;AAAA,MACjB,OAAO,KAAK,EAAE,KAAK;AAAA,MACnB,QAAQ,OAAO,EAAE,MAAM;AAAA,IACzB;AAAA,EACF;AACA,QAAM,UAAU,KAAK,EAAE,OAAO,EAAE,IAAI,MAAM;AAC1C,QAAM,YAAY,KAAK,EAAE,SAAS,EAAE,IAAI,MAAM;AAC9C,QAAM,QAAQ,OAAO,EAAE,KAAK;AAC5B,MACE;AAAA,IACE,CAAC,GAAG,SAAS,GAAG,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,IAC9C;AAAA,EACF,EAAE,gBAAgB,MAAM,aACxB;AACA,WAAO,KAAK;AAAA,EACd;AACA,QAAM,kBAAkB,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU;AACnE,QAAM,QAAQ,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ;AACvC,UAAM,IAAI,OAAO,GAAG;AACpB,SACG,EAAE,cAAc,QAAQ,EAAE,cAAc,SACzC,EAAE,mBAAmB,MACrB;AACA,aAAO,KAAK;AAAA,IACd;AACA,WAAO;AAAA,MACL,QAAQ,KAAK,EAAE,OAAO;AAAA,MACtB,WAAW,EAAE,cAAc,OAAO,OAAO,OAAO,EAAE,UAAU;AAAA,MAC5D,OAAO,EAAE,cAAc,OAAO,OAAO,OAAO,EAAE,UAAU;AAAA,IAC1D;AAAA,EACF,CAAC;AACD,MACE,EAAE,mBAAmB,QACrB;AAAA,IACE,MAAM,IAAI,CAAC,SAAS,KAAK,KAAM;AAAA,IAC/B,MAAM,GAAG,SAAS,QAAQ;AAAA,EAC5B,EAAE,gBAAgB,SAAS,aAC3B;AACA,WAAO,KAAK;AAAA,EACd;AACA,SAAO;AAAA,IACL;AAAA,IACA,GAAI,EAAE,mBAAmB,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;AAAA,IAC3D;AAAA,IACA;AAAA,IACA,MAAM,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU;AAAA,IACjD;AAAA,IACA,GAAI,gBAAgB,SAChB;AAAA,MACE,UAAU;AAAA,QACR,gBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,QACnC,MAAM,GAAG,SAAS,QAAQ;AAAA,MAC5B;AAAA,IACF,IACA,CAAC;AAAA,IACL,aAAa,KAAK,EAAE,YAAY;AAAA,IAChC,WAAW,KAAK,EAAE,UAAU;AAAA,IAC5B,QAAQ,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAqB;AACnD,YAAM,IAAI,OAAO,GAAG;AACpB,YAAM,OAAO,KAAK,EAAE,IAAI;AACxB,YAAM,WAAW,KAAK,EAAE,QAAQ;AAChC,YAAM,QACJ,MAAM,SAAS,IAAI,KACnB,CAAC,YAAY,WAAW,MAAM,EAAE,SAAS,QAAQ;AACnD,YAAM,QAAQ,KAAK,EAAE,KAAK,EACvB,IAAI,GAAG,EACP,OAAO,CAAC,MAAoB,MAAM,MAAS;AAC9C,YAAM,SAAS,EAAE,UAAU,KAAK,EAAE,OAAO,IAAI;AAC7C,UAAI,CAAC,UAAU,aAAa,aAAa,aAAa,SAAS;AAC7D,gBAAQ;AAAA,UACN,uBAAuB,IAAI;AAAA,QAC7B;AACA,eAAO,CAAC;AAAA,MACV;AAEA,aAAO;AAAA,QACL;AAAA,UACE,MAAM,QAAS,OAA6B;AAAA,UAC5C,UAAU,QAAS,WAAqC;AAAA,UACxD,SAAS,KAAK,EAAE,OAAO;AAAA,UACvB,QAAQ;AAAA,UACR,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,UAC3B,GAAI,EAAE,WAAW,EAAE,SAAS,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC;AAAA,UAClD,GAAI,EAAE,QAAQ,CAAC,QACX;AAAA,YACE,MAAM;AAAA,cACJ,GAAI,EAAE,OAAO,OAAO,EAAE,IAAI,IAAI,CAAC;AAAA,cAC/B,GAAI,QAAQ,CAAC,IAAI,EAAE,KAAK;AAAA,YAC1B;AAAA,UACF,IACA,CAAC;AAAA,UACL,OACE,CAAC,SAAS,CAAC,MAAM,UAAU,SACvB,CAAC,EAAE,QAAQ,cAAc,CAAC,IAC1B;AAAA,QACR;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IACD,aAAa,EAAE;AAAA,IACf,UAAU;AAAA,MACR,OAAO,SAAS;AAAA,MAChB,GAAI,SAAS,WAAW,SAAY,EAAE,QAAQ,SAAS,OAAO,IAAI,CAAC;AAAA,IACrE;AAAA,EACF;AACF;",
|
|
6
|
-
"names": []
|
|
4
|
+
"sourcesContent": ["// Quote responses load lazily with the quote client, outside the synchronous core.\nimport { ZappieError } from \"../errors\";\nimport { sumMoney } from \"../internal/money-math\";\nimport { money } from \"../money\";\nimport { mapMoney, record } from \"../transport/mappers\";\nimport type { CartFix, CartFulfilment, CartIssue, Quote } from \"./types\";\nfunction fail(): never {\n throw new ZappieError(\"server_error\", \"Invalid quote response\");\n}\nfunction text(value: unknown): string {\n if (typeof value !== \"string\") {\n return fail();\n }\n return value;\n}\nfunction list(value: unknown): unknown[] {\n if (!Array.isArray(value)) {\n return fail();\n }\n return value;\n}\n/** A fix newer than this SDK is dropped (undefined); a malformed known fix still fails. */\nfunction fix(value: unknown): CartFix | undefined {\n const v = record(value);\n switch (v.action) {\n case \"remove_line\":\n case \"accept_price\":\n case \"remove_promo\":\n case \"change_address\":\n case \"choose_region\":\n return { action: v.action };\n case \"choose_option\":\n case \"choose_other_option\":\n return { action: v.action, groupId: text(v.group_id) };\n case \"set_quantity\": {\n if (\n !Number.isInteger(v.quantity) ||\n Number(v.quantity) < 1 ||\n Number(v.quantity) > 99\n ) {\n return fail();\n }\n return { action: v.action, quantity: v.quantity as number };\n }\n case \"schedule\":\n return {\n action: v.action,\n ...(v.next_open_at ? { nextOpenAt: text(v.next_open_at) } : {}),\n ...(v.slots ? { slots: list(v.slots).map(text) } : {}),\n };\n case \"switch_fulfilment\": {\n const types = list(v.types)\n .map(text)\n .filter((t) => [\"pickup\", \"delivery\", \"dine_in\"].includes(t));\n return types.length\n ? { action: v.action, types: types as CartFulfilment[\"type\"][] }\n : undefined;\n }\n default:\n return undefined;\n }\n}\nconst codes = [\n \"item_unavailable\",\n \"item_not_found\",\n \"option_unavailable\",\n \"option_required\",\n \"option_limit\",\n \"quantity_limit\",\n \"price_changed\",\n \"branch_closed\",\n \"fulfilment_unavailable\",\n \"outside_delivery_zone\",\n \"delivery_region_required\",\n \"schedule_invalid\",\n \"promo_invalid\",\n \"promo_min_spend\",\n \"min_order\",\n \"menu_version_stale\",\n];\nexport function mapQuote(value: unknown, branchId: string): Quote {\n const v = record(value);\n if (\n v.branch_id !== branchId ||\n !Number.isFinite(Date.parse(text(v.expires_at)))\n ) {\n return fail();\n }\n const subtotal = mapMoney(v.subtotal);\n const checkout = record(v.checkout);\n if (\n typeof v.can_checkout !== \"boolean\" ||\n typeof checkout.ready !== \"boolean\" ||\n (checkout.reason !== undefined &&\n checkout.reason !== \"issues\" &&\n checkout.reason !== \"customer_required\")\n ) {\n return fail();\n }\n const amount = (raw: unknown) => {\n const result = mapMoney(raw);\n if (result.currency !== subtotal.currency) {\n return fail();\n }\n return result;\n };\n const charge = (raw: unknown) => {\n const c = record(raw);\n return {\n code: text(c.code),\n label: text(c.label),\n amount: amount(c.amount),\n };\n };\n const charges = list(v.charges).map(charge);\n const discounts = list(v.discounts).map(charge);\n const total = amount(v.total);\n if (\n sumMoney(\n [...charges, ...discounts].map((c) => c.amount),\n subtotal,\n ).amountMinor !== total.amountMinor\n ) {\n return fail();\n }\n const deliveryCharges = charges.filter((c) => c.code === \"delivery\");\n const integer = (value: unknown) => {\n if (!Number.isSafeInteger(value) || Number(value) < 0) {\n return fail();\n }\n return value as number;\n };\n const fulfilment =\n v.fulfilment === undefined ? undefined : record(v.fulfilment);\n if (\n v.menu_version_stale !== undefined &&\n typeof v.menu_version_stale !== \"boolean\"\n ) {\n return fail();\n }\n const lines = list(v.lines).map((raw) => {\n const l = record(raw);\n if (\n (l.unit_price == null || l.line_total == null) &&\n v.lines_unpriced !== true\n ) {\n return fail();\n }\n return {\n ...(l.item_id !== undefined ? { itemId: text(l.item_id) } : {}),\n ...(l.name !== undefined ? { name: text(l.name) } : {}),\n ...(l.quantity !== undefined ? { quantity: integer(l.quantity) } : {}),\n ...(l.status !== undefined ? { status: text(l.status) } : {}),\n ...(l.options_total !== undefined\n ? {\n optionsTotal:\n l.options_total === null ? null : amount(l.options_total),\n }\n : {}),\n lineId: text(l.line_id),\n unitPrice: l.unit_price == null ? null : amount(l.unit_price),\n total: l.line_total == null ? null : amount(l.line_total),\n };\n });\n if (\n v.lines_unpriced !== true &&\n sumMoney(\n lines.map((line) => line.total!),\n money(0, subtotal.currency),\n ).amountMinor !== subtotal.amountMinor\n ) {\n return fail();\n }\n return {\n ...(v.menu_version_stale !== undefined\n ? { menuVersionStale: v.menu_version_stale as boolean }\n : {}),\n ...(fulfilment\n ? {\n fulfilment: {\n type: text(fulfilment.type),\n scheduledFor:\n fulfilment.scheduled_for === null\n ? null\n : text(fulfilment.scheduled_for),\n ...(fulfilment.eta_minutes !== undefined\n ? { etaMinutes: list(fulfilment.eta_minutes).map(integer) }\n : {}),\n ...(fulfilment.delivery_region_id !== undefined\n ? { deliveryRegionId: text(fulfilment.delivery_region_id) }\n : {}),\n },\n }\n : {}),\n lines,\n ...(v.lines_unpriced === true ? { linesUnpriced: true } : {}),\n subtotal,\n total,\n fees: charges.filter((c) => c.code !== \"delivery\"),\n discounts,\n ...(deliveryCharges.length\n ? {\n delivery: sumMoney(\n deliveryCharges.map((c) => c.amount),\n money(0, subtotal.currency),\n ),\n }\n : {}),\n menuVersion: text(v.menu_version),\n expiresAt: text(v.expires_at),\n issues: list(v.issues).flatMap((raw): CartIssue[] => {\n const i = record(raw);\n const code = text(i.code);\n const severity = text(i.severity);\n const known =\n codes.includes(code) &&\n [\"blocking\", \"warning\", \"info\"].includes(severity);\n const fixes = list(i.fixes)\n .map(fix)\n .filter((f): f is CartFix => f !== undefined);\n const lineId = i.line_id ? text(i.line_id) : undefined;\n if (!known && (severity === \"warning\" || severity === \"info\")) {\n console.warn(\n `Zappie quote issue \"${code}\" is newer than this SDK and was skipped`,\n );\n return [];\n }\n // A blocking (or unknown-severity) issue newer than the SDK keeps checkout blocked.\n return [\n {\n code: known ? (code as CartIssue[\"code\"]) : \"item_unavailable\",\n severity: known ? (severity as CartIssue[\"severity\"]) : \"blocking\",\n message: text(i.message),\n source: \"quote\",\n ...(lineId ? { lineId } : {}),\n ...(i.group_id ? { groupId: text(i.group_id) } : {}),\n ...(i.data || !known\n ? {\n data: {\n ...(i.data ? record(i.data) : {}),\n ...(known ? {} : { code }),\n },\n }\n : {}),\n fixes:\n !known && !fixes.length && lineId\n ? [{ action: \"remove_line\" }]\n : fixes,\n },\n ];\n }),\n canCheckout: v.can_checkout,\n checkout: {\n ready: checkout.ready,\n ...(checkout.reason !== undefined ? { reason: checkout.reason } : {}),\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["value"]
|
|
7
7
|
}
|
package/dist/cart/quote.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { T as Transport, R as RequestCtx, Q as QuoteRequest, a as Quote } from '../client-
|
|
2
|
-
import '../models-
|
|
1
|
+
import { T as Transport, R as RequestCtx, Q as QuoteRequest, a as Quote } from '../client-RFcLoZ04.js';
|
|
2
|
+
import '../models-Rg5kQUkv.js';
|
|
3
3
|
|
|
4
4
|
declare function createQuoteClient(transport: Transport, context: () => RequestCtx): {
|
|
5
5
|
cancel: () => void;
|
package/dist/cart/storage.js
CHANGED
|
@@ -66,7 +66,7 @@ function validFulfilment(f) {
|
|
|
66
66
|
if (!a || typeof a.line1 !== "string" || !a.line1.trim()) {
|
|
67
67
|
return false;
|
|
68
68
|
}
|
|
69
|
-
if ([a.line2, a.city, a.placeId, a.instructions].some(
|
|
69
|
+
if ([a.line2, a.city, a.placeId, a.instructions, f.deliveryRegionId].some(
|
|
70
70
|
(s) => s !== void 0 && typeof s !== "string"
|
|
71
71
|
)) {
|
|
72
72
|
return false;
|
package/dist/cart/storage.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/cart/storage.ts"],
|
|
4
|
-
"sourcesContent": ["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"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["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, f.deliveryRegionId].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"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/cart/wire.js
CHANGED
|
@@ -21,6 +21,7 @@ function wireFulfilment(f) {
|
|
|
21
21
|
..."scheduledFor" in f && f.scheduledFor ? { scheduled_for: f.scheduledFor } : {},
|
|
22
22
|
...f.type === "dine_in" && f.table ? { table: f.table } : {},
|
|
23
23
|
...f.type === "delivery" ? {
|
|
24
|
+
...f.deliveryRegionId !== void 0 ? { delivery_region_id: f.deliveryRegionId } : {},
|
|
24
25
|
address: {
|
|
25
26
|
line1: f.address.line1,
|
|
26
27
|
...f.address.line2 ? { line2: f.address.line2 } : {},
|
package/dist/cart/wire.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/cart/wire.ts"],
|
|
4
|
-
"sourcesContent": ["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"],
|
|
5
|
-
"mappings": ";AAMO,SAAS,SAAS,MAA0B;AACjD,SAAO;AAAA,IACL,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,IACd,GAAI,KAAK,WAAW,SAAY,EAAE,SAAS,KAAK,OAAO,IAAI,CAAC;AAAA,IAC5D,UAAU,KAAK;AAAA,IACf,GAAI,KAAK,YAAY,EAAE,YAAY,KAAK,UAAU,IAAI,CAAC;AAAA,IACvD,SAAS,KAAK,QAAQ,IAAI,CAAC,OAAO;AAAA,MAChC,UAAU,EAAE;AAAA,MACZ,WAAW,EAAE;AAAA,MACb,UAAU,EAAE;AAAA,IACd,EAAE;AAAA,IACF,QAAQ,EAAE,GAAG,KAAK,OAAO;AAAA,IACzB,GAAI,KAAK,SAAS,SAAY,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,EACvD;AACF;AAQO,SAAS,eAAe,GAAmC;AAChE,SAAO;AAAA,IACL,MAAM,EAAE;AAAA,IACR,GAAI,kBAAkB,KAAK,EAAE,eACzB,EAAE,eAAe,EAAE,aAAa,IAChC,CAAC;AAAA,IACL,GAAI,EAAE,SAAS,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAAA,IAC5D,GAAI,EAAE,SAAS,aACX;AAAA,MACE,SAAS;AAAA,QACP,OAAO,EAAE,QAAQ;AAAA,QACjB,GAAI,EAAE,QAAQ,QAAQ,EAAE,OAAO,EAAE,QAAQ,MAAM,IAAI,CAAC;AAAA,QACpD,GAAI,EAAE,QAAQ,OAAO,EAAE,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,QACjD,GAAI,EAAE,QAAQ,UAAU,EAAE,UAAU,EAAE,QAAQ,QAAQ,IAAI,CAAC;AAAA,QAC3D,GAAI,EAAE,QAAQ,eACV,EAAE,cAAc,EAAE,QAAQ,aAAa,IACvC,CAAC;AAAA,QACL,GAAI,EAAE,QAAQ,cACV;AAAA,UACE,KAAK,EAAE,QAAQ,YAAY;AAAA,UAC3B,KAAK,EAAE,QAAQ,YAAY;AAAA,QAC7B,IACA,CAAC;AAAA,MACP;AAAA,IACF,IACA,CAAC;AAAA,EACP;AACF;",
|
|
4
|
+
"sourcesContent": ["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 ...(f.deliveryRegionId !== undefined\n ? { delivery_region_id: f.deliveryRegionId }\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"],
|
|
5
|
+
"mappings": ";AAMO,SAAS,SAAS,MAA0B;AACjD,SAAO;AAAA,IACL,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,IACd,GAAI,KAAK,WAAW,SAAY,EAAE,SAAS,KAAK,OAAO,IAAI,CAAC;AAAA,IAC5D,UAAU,KAAK;AAAA,IACf,GAAI,KAAK,YAAY,EAAE,YAAY,KAAK,UAAU,IAAI,CAAC;AAAA,IACvD,SAAS,KAAK,QAAQ,IAAI,CAAC,OAAO;AAAA,MAChC,UAAU,EAAE;AAAA,MACZ,WAAW,EAAE;AAAA,MACb,UAAU,EAAE;AAAA,IACd,EAAE;AAAA,IACF,QAAQ,EAAE,GAAG,KAAK,OAAO;AAAA,IACzB,GAAI,KAAK,SAAS,SAAY,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,EACvD;AACF;AAQO,SAAS,eAAe,GAAmC;AAChE,SAAO;AAAA,IACL,MAAM,EAAE;AAAA,IACR,GAAI,kBAAkB,KAAK,EAAE,eACzB,EAAE,eAAe,EAAE,aAAa,IAChC,CAAC;AAAA,IACL,GAAI,EAAE,SAAS,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAAA,IAC5D,GAAI,EAAE,SAAS,aACX;AAAA,MACE,GAAI,EAAE,qBAAqB,SACvB,EAAE,oBAAoB,EAAE,iBAAiB,IACzC,CAAC;AAAA,MACL,SAAS;AAAA,QACP,OAAO,EAAE,QAAQ;AAAA,QACjB,GAAI,EAAE,QAAQ,QAAQ,EAAE,OAAO,EAAE,QAAQ,MAAM,IAAI,CAAC;AAAA,QACpD,GAAI,EAAE,QAAQ,OAAO,EAAE,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,QACjD,GAAI,EAAE,QAAQ,UAAU,EAAE,UAAU,EAAE,QAAQ,QAAQ,IAAI,CAAC;AAAA,QAC3D,GAAI,EAAE,QAAQ,eACV,EAAE,cAAc,EAAE,QAAQ,aAAa,IACvC,CAAC;AAAA,QACL,GAAI,EAAE,QAAQ,cACV;AAAA,UACE,KAAK,EAAE,QAAQ,YAAY;AAAA,UAC3B,KAAK,EAAE,QAAQ,YAAY;AAAA,QAC7B,IACA,CAAC;AAAA,MACP;AAAA,IACF,IACA,CAAC;AAAA,EACP;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { d as Currency, M as Money, I as Item, a as Menu, C as CategoryPage, S as Store, F as Formatters } from './models-
|
|
1
|
+
import { d as Currency, M as Money, I as Item, a as Menu, C as CategoryPage, S as Store, F as Formatters } from './models-Rg5kQUkv.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* An item selection you submit to the cart, with optional quantity, choices, inputs and source menu.
|
|
@@ -62,6 +62,8 @@ type CartFulfilment = {
|
|
|
62
62
|
type: "delivery";
|
|
63
63
|
branchId: string;
|
|
64
64
|
address: DeliveryAddress;
|
|
65
|
+
/** The delivery region you selected from the branch. */
|
|
66
|
+
deliveryRegionId?: string;
|
|
65
67
|
scheduledFor?: string;
|
|
66
68
|
} | {
|
|
67
69
|
type: "dine_in";
|
|
@@ -76,7 +78,7 @@ type CartIssueCode = "item_unavailable" | "item_not_found" | "option_unavailable
|
|
|
76
78
|
* A suggested cart correction, including any option, quantity or fulfilment details it needs.
|
|
77
79
|
*/
|
|
78
80
|
type CartFix = {
|
|
79
|
-
action: "remove_line" | "accept_price" | "remove_promo" | "change_address";
|
|
81
|
+
action: "remove_line" | "accept_price" | "remove_promo" | "change_address" | "choose_region";
|
|
80
82
|
} | {
|
|
81
83
|
action: "choose_option" | "choose_other_option";
|
|
82
84
|
groupId: string;
|
|
@@ -113,7 +115,26 @@ type Quote = {
|
|
|
113
115
|
lineId: string;
|
|
114
116
|
unitPrice: Money | null;
|
|
115
117
|
total: Money | null;
|
|
118
|
+
/** Item identity echoed by the quote. */
|
|
119
|
+
itemId?: string;
|
|
120
|
+
/** Item name returned by the quote. */
|
|
121
|
+
name?: string;
|
|
122
|
+
/** Quantity priced by the quote. */
|
|
123
|
+
quantity?: number;
|
|
124
|
+
/** Authoritative option total, or null when the line could not be priced. */
|
|
125
|
+
optionsTotal?: Money | null;
|
|
126
|
+
/** Line status returned by the service. */
|
|
127
|
+
status?: string;
|
|
116
128
|
}[];
|
|
129
|
+
/** Whether the submitted menu version differs from the current version. */
|
|
130
|
+
menuVersionStale?: boolean;
|
|
131
|
+
/** Fulfilment details and arrival estimate returned by the service. */
|
|
132
|
+
fulfilment?: {
|
|
133
|
+
type: string;
|
|
134
|
+
scheduledFor: string | null;
|
|
135
|
+
etaMinutes?: number[];
|
|
136
|
+
deliveryRegionId?: string;
|
|
137
|
+
};
|
|
117
138
|
linesUnpriced?: boolean;
|
|
118
139
|
subtotal: Money;
|
|
119
140
|
fees: {
|
|
@@ -223,6 +244,10 @@ type WireLine = {
|
|
|
223
244
|
* A fulfilment selection serialized with API field names, without its branch ID.
|
|
224
245
|
*/
|
|
225
246
|
type WireFulfilment = {
|
|
247
|
+
/** Selected delivery region in API field names. */
|
|
248
|
+
delivery_region_id?: string;
|
|
249
|
+
/** Delivery instructions sent alongside the address. */
|
|
250
|
+
instructions?: string;
|
|
226
251
|
type: CartFulfilment["type"];
|
|
227
252
|
scheduled_for?: string;
|
|
228
253
|
table?: string;
|
|
@@ -276,12 +301,26 @@ type WireIssue = Omit<CartIssue, "source" | "lineId" | "groupId" | "fixes"> & {
|
|
|
276
301
|
* The server quote response in API field names, including prices, charges and checkout readiness.
|
|
277
302
|
*/
|
|
278
303
|
type WireQuote = {
|
|
304
|
+
/** Whether the submitted menu version is stale. */
|
|
305
|
+
menu_version_stale?: boolean;
|
|
306
|
+
/** Fulfilment details returned by the quote service. */
|
|
307
|
+
fulfilment?: {
|
|
308
|
+
type: string;
|
|
309
|
+
scheduled_for: string | null;
|
|
310
|
+
eta_minutes?: number[];
|
|
311
|
+
delivery_region_id?: string;
|
|
312
|
+
};
|
|
279
313
|
branch_id: string;
|
|
280
314
|
menu_version: string;
|
|
281
315
|
expires_at: string;
|
|
282
316
|
lines_unpriced?: boolean;
|
|
283
317
|
lines: {
|
|
284
318
|
line_id: string;
|
|
319
|
+
item_id?: string;
|
|
320
|
+
name?: string;
|
|
321
|
+
quantity?: number;
|
|
322
|
+
options_total?: WireMoney | null;
|
|
323
|
+
status?: string;
|
|
285
324
|
unit_price: WireMoney | null;
|
|
286
325
|
line_total: WireMoney | null;
|
|
287
326
|
}[];
|
package/dist/debug.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { C as CartLineInput, Z as Zappie, a as Quote } from './client-
|
|
2
|
-
import { M as Money, a as Menu, B as Branch } from './models-
|
|
1
|
+
import { C as CartLineInput, Z as Zappie, a as Quote } from './client-RFcLoZ04.js';
|
|
2
|
+
import { M as Money, a as Menu, B as Branch } from './models-Rg5kQUkv.js';
|
|
3
3
|
|
|
4
4
|
type StoredLine = CartLineInput & {
|
|
5
5
|
id: string;
|