@zappie/sdk 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +1 -0
  3. package/dist/cart/branch.d.ts +26 -0
  4. package/dist/cart/branch.js +79 -0
  5. package/dist/cart/branch.js.map +7 -0
  6. package/dist/cart/index.js +6 -1
  7. package/dist/cart/index.js.map +2 -2
  8. package/dist/cart/item.d.ts +3 -2
  9. package/dist/cart/quote-client.js +48 -3
  10. package/dist/cart/quote-client.js.map +2 -2
  11. package/dist/cart/quote-response.js +27 -0
  12. package/dist/cart/quote-response.js.map +3 -3
  13. package/dist/cart/quote.d.ts +8 -3
  14. package/dist/cart/storage.js +1 -1
  15. package/dist/cart/storage.js.map +2 -2
  16. package/dist/cart/wire.js +1 -0
  17. package/dist/cart/wire.js.map +2 -2
  18. package/dist/{client-BctSrEhO.d.ts → client-Bm2cCYea.d.ts} +17 -342
  19. package/dist/client.js +4 -2
  20. package/dist/client.js.map +2 -2
  21. package/dist/config.js.map +2 -2
  22. package/dist/debug.d.ts +3 -2
  23. package/dist/debug.js +1 -1
  24. package/dist/index.d.ts +9 -5
  25. package/dist/index.js +1 -1
  26. package/dist/index.js.map +2 -2
  27. package/dist/integrations/index.d.ts +39 -0
  28. package/dist/integrations/index.js +78 -0
  29. package/dist/integrations/index.js.map +7 -0
  30. package/dist/internal.d.ts +3 -3
  31. package/dist/{models-Dj-VkdU1.d.ts → models-Rg5kQUkv.d.ts} +26 -0
  32. package/dist/persist/catalogue.d.ts +3 -2
  33. package/dist/react/index.d.ts +3 -2
  34. package/dist/server/index.d.ts +4 -2
  35. package/dist/testing/index.d.ts +4 -2
  36. package/dist/transport/category-page.d.ts +1 -1
  37. package/dist/transport/mappers.js +20 -0
  38. package/dist/transport/mappers.js.map +2 -2
  39. package/dist/transport/quote-body.js +24 -0
  40. package/dist/transport/quote-body.js.map +7 -0
  41. package/dist/transport/rest.js +10 -2
  42. package/dist/transport/rest.js.map +2 -2
  43. package/dist/transport/search.d.ts +3 -2
  44. package/dist/transport/selected-menu.d.ts +3 -2
  45. package/dist/transport/store.d.ts +2 -2
  46. package/dist/transport/store.js +14 -1
  47. package/dist/transport/store.js.map +3 -3
  48. package/dist/types-CuDvfW9g.d.ts +380 -0
  49. package/package.json +9 -1
@@ -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": "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",
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
  }
@@ -1,7 +1,12 @@
1
- import { T as Transport, R as RequestCtx, Q as QuoteRequest, a as Quote } from '../client-BctSrEhO.js';
2
- import '../models-Dj-VkdU1.js';
1
+ import { T as Transport, R as RequestCtx } from '../client-Bm2cCYea.js';
2
+ import { Q as QuoteRequest, a as Quote } from '../types-CuDvfW9g.js';
3
+ import '../models-Rg5kQUkv.js';
3
4
 
4
- declare function createQuoteClient(transport: Transport, context: () => RequestCtx): {
5
+ type QuoteClientOptions = {
6
+ customerBase?: string | undefined;
7
+ fetch?: typeof fetch | undefined;
8
+ };
9
+ declare function createQuoteClient(transport: Transport, context: () => RequestCtx, options?: QuoteClientOptions): {
5
10
  cancel: () => void;
6
11
  get(body: QuoteRequest, force: boolean, apply: (quote: Quote) => void): Promise<Quote>;
7
12
  accept(issue: CartIssueForAcceptance): void;
@@ -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;
@@ -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 } : {},
@@ -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,342 +1,5 @@
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-Dj-VkdU1.js';
2
-
3
- /**
4
- * An item selection you submit to the cart, with optional quantity, choices, inputs and source menu.
5
- */
6
- type CartLineInput = {
7
- itemId: string;
8
- /** The source menu the shopper selected. The SDK checks catalogue membership. */
9
- menuId?: string;
10
- quantity?: number;
11
- choices?: {
12
- groupId: string;
13
- choiceId: string;
14
- quantity?: number;
15
- }[];
16
- inputs?: Record<string, string>;
17
- variantId?: string;
18
- note?: string;
19
- };
20
- /**
21
- * A readonly cart line with its selection, local price estimate and time added.
22
- */
23
- type CartLine = Readonly<{
24
- id: string;
25
- itemId: string;
26
- /** The source menu the shopper selected. The SDK checks catalogue membership. */
27
- menuId?: string;
28
- name: string;
29
- quantity: number;
30
- choices: readonly Readonly<{
31
- groupId: string;
32
- choiceId: string;
33
- quantity: number;
34
- }>[];
35
- inputs: Readonly<Record<string, string>>;
36
- variantId?: string;
37
- note?: string;
38
- unitPrice: Money;
39
- lineSubtotal: Money;
40
- addedAt: string;
41
- }>;
42
- /**
43
- * A cart delivery address with optional place coordinates and instructions.
44
- */
45
- type DeliveryAddress = {
46
- line1: string;
47
- line2?: string;
48
- city?: string;
49
- placeId?: string;
50
- coordinates?: {
51
- lat: number;
52
- lng: number;
53
- };
54
- instructions?: string;
55
- };
56
- /** A shopper's selection, distinct from the store's Fulfilment capabilities. */
57
- type CartFulfilment = {
58
- type: "pickup";
59
- branchId: string;
60
- scheduledFor?: string;
61
- } | {
62
- type: "delivery";
63
- branchId: string;
64
- address: DeliveryAddress;
65
- scheduledFor?: string;
66
- } | {
67
- type: "dine_in";
68
- branchId: string;
69
- table?: string;
70
- };
71
- /**
72
- * Stable identifiers for cart validation and quote issues you can handle in your UI.
73
- */
74
- type CartIssueCode = "item_unavailable" | "item_not_found" | "option_unavailable" | "option_required" | "option_limit" | "quantity_limit" | "price_changed" | "branch_closed" | "fulfilment_unavailable" | "outside_delivery_zone" | "delivery_region_required" | "schedule_invalid" | "promo_invalid" | "promo_min_spend" | "min_order" | "menu_version_stale";
75
- /**
76
- * A suggested cart correction, including any option, quantity or fulfilment details it needs.
77
- */
78
- type CartFix = {
79
- action: "remove_line" | "accept_price" | "remove_promo" | "change_address";
80
- } | {
81
- action: "choose_option" | "choose_other_option";
82
- groupId: string;
83
- } | {
84
- action: "set_quantity";
85
- quantity: number;
86
- } | {
87
- action: "schedule";
88
- nextOpenAt?: string;
89
- slots?: string[];
90
- } | {
91
- action: "switch_fulfilment";
92
- types: CartFulfilment["type"][];
93
- };
94
- /**
95
- * A local or quoted cart issue with severity, display message and suggested fixes.
96
- */
97
- type CartIssue = {
98
- code: CartIssueCode;
99
- severity: "blocking" | "warning" | "info";
100
- lineId?: string;
101
- groupId?: string;
102
- message: string;
103
- data?: Record<string, unknown>;
104
- fixes: CartFix[];
105
- source: "local" | "quote";
106
- };
107
- /**
108
- * Server-provided cart pricing, fees, discounts, issues and checkout readiness with an expiry.
109
- */
110
- type Quote = {
111
- /** Null prices mean the service could not split the subtotal across lines. */
112
- lines: {
113
- lineId: string;
114
- unitPrice: Money | null;
115
- total: Money | null;
116
- }[];
117
- linesUnpriced?: boolean;
118
- subtotal: Money;
119
- fees: {
120
- code: string;
121
- label: string;
122
- amount: Money;
123
- }[];
124
- delivery?: Money;
125
- discounts: {
126
- code: string;
127
- label: string;
128
- amount: Money;
129
- }[];
130
- total: Money;
131
- issues: CartIssue[];
132
- canCheckout: boolean;
133
- checkout: {
134
- ready: boolean;
135
- reason?: "issues" | "customer_required";
136
- };
137
- menuVersion: string;
138
- expiresAt: string;
139
- };
140
- /**
141
- * The cart validation and quoting state, with a quote or issues when available.
142
- */
143
- type CartState = {
144
- status: "ready";
145
- } | {
146
- status: "quoting";
147
- } | {
148
- status: "quoted";
149
- quote: Quote;
150
- } | {
151
- status: "needs_attention";
152
- quote?: Quote;
153
- issues: readonly CartIssue[];
154
- };
155
- /**
156
- * The current readonly cart view, including lines, branch, fulfilment and hydration state.
157
- */
158
- type CartSnapshot = {
159
- /** Selected branch remains available before a fulfilment mode is chosen. */
160
- readonly branchId?: string | undefined;
161
- readonly lines: readonly CartLine[];
162
- readonly count: number;
163
- readonly subtotal: Money | null;
164
- readonly fulfilment: CartFulfilment | null;
165
- readonly promoCode: string | null;
166
- readonly state: CartState;
167
- readonly issues: readonly CartIssue[];
168
- readonly isHydrated: boolean;
169
- };
170
- /**
171
- * Cart state and operations for editing lines, quoting, persistence and subscriptions.
172
- */
173
- interface CartModule extends CartSnapshot {
174
- validate(input: CartLineInput): {
175
- ok: true;
176
- } | {
177
- ok: false;
178
- issues: CartIssue[];
179
- };
180
- add(item: Item | string, input?: Omit<CartLineInput, "itemId">): CartLine;
181
- update(lineId: string, patch: Partial<Omit<CartLineInput, "itemId">>): CartLine;
182
- remove(lineId: string): void;
183
- clear(): void;
184
- setFulfilment(fulfilment: CartFulfilment): void;
185
- setPromoCode(code: string | null): void;
186
- quote(opts?: {
187
- force?: boolean;
188
- }): Promise<Quote>;
189
- /** Handle interactive fixes by calling the option, address or time setter. */
190
- applyFix(issue: CartIssue, fix?: CartFix): void;
191
- moveTo(branchId: string): Promise<void>;
192
- hydrate(): Promise<void>;
193
- /** Attach browser listeners. Use the returned cleanup in your component effect. */
194
- mount(): () => void;
195
- dispose(): void;
196
- subscribe(fn: () => void): () => void;
197
- getSnapshot(): CartSnapshot;
198
- toCheckoutPayload(): {
199
- lines: WireLine[];
200
- fulfilment: CartFulfilment;
201
- promo_code?: string;
202
- menu_version: string;
203
- };
204
- }
205
- /**
206
- * A cart line serialized with API field names for quote and checkout requests.
207
- */
208
- type WireLine = {
209
- line_id: string;
210
- item_id: string;
211
- menu_id?: string;
212
- quantity: number;
213
- variant_id?: string;
214
- options: {
215
- group_id: string;
216
- choice_id: string;
217
- quantity: number;
218
- }[];
219
- inputs: Record<string, string>;
220
- note?: string;
221
- };
222
- /**
223
- * A fulfilment selection serialized with API field names, without its branch ID.
224
- */
225
- type WireFulfilment = {
226
- type: CartFulfilment["type"];
227
- scheduled_for?: string;
228
- table?: string;
229
- address?: {
230
- line1: string;
231
- line2?: string;
232
- city?: string;
233
- place_id?: string;
234
- lat?: number;
235
- lng?: number;
236
- instructions?: string;
237
- };
238
- };
239
- /**
240
- * The branch, menu version and cart contents you send for a server quote.
241
- */
242
- type QuoteRequest = {
243
- branch_id: string;
244
- lines: WireLine[];
245
- fulfilment?: WireFulfilment;
246
- promo_code?: string;
247
- menu_version: string;
248
- };
249
- /**
250
- * An API monetary amount in minor units with its currency code.
251
- */
252
- type WireMoney = {
253
- amount_minor: number;
254
- currency: Currency;
255
- };
256
- /**
257
- * A suggested cart correction in API field names, before conversion to CartFix.
258
- */
259
- type WireFix = {
260
- action: CartFix["action"];
261
- group_id?: string;
262
- next_open_at?: string;
263
- quantity?: number;
264
- slots?: string[];
265
- types?: CartFulfilment["type"][];
266
- };
267
- /**
268
- * A server cart issue in API field names, before adding its quote source.
269
- */
270
- type WireIssue = Omit<CartIssue, "source" | "lineId" | "groupId" | "fixes"> & {
271
- line_id?: string;
272
- group_id?: string;
273
- fixes: WireFix[];
274
- };
275
- /**
276
- * The server quote response in API field names, including prices, charges and checkout readiness.
277
- */
278
- type WireQuote = {
279
- branch_id: string;
280
- menu_version: string;
281
- expires_at: string;
282
- lines_unpriced?: boolean;
283
- lines: {
284
- line_id: string;
285
- unit_price: WireMoney | null;
286
- line_total: WireMoney | null;
287
- }[];
288
- subtotal: WireMoney;
289
- charges: {
290
- code: string;
291
- label: string;
292
- amount: WireMoney;
293
- }[];
294
- discounts: {
295
- code: string;
296
- label: string;
297
- amount: WireMoney;
298
- }[];
299
- total: WireMoney;
300
- issues: WireIssue[];
301
- can_checkout: boolean;
302
- checkout: {
303
- ready: boolean;
304
- reason?: "issues" | "customer_required";
305
- };
306
- };
307
- /** A saved cart with its scope, revision and expiry. */
308
- type CartSyncDocument = {
309
- schemaVersion: 1;
310
- store: string;
311
- branchId: string;
312
- revision: string;
313
- expiresAt: string;
314
- lines: WireLine[];
315
- fulfilment: CartFulfilment | null;
316
- promoCode: string | null;
317
- };
318
- /**
319
- * A storage adapter for reading cart documents and writing them with revision checks.
320
- * Writes return the saved document or the current document when revisions conflict.
321
- */
322
- interface CartSyncAdapter {
323
- read(scope: {
324
- store: string;
325
- branchId: string;
326
- }, signal?: AbortSignal): Promise<CartSyncDocument | null>;
327
- /** Write if the revision matches. Reuse the operation ID when you retry to avoid applying a change twice. */
328
- write(document: Omit<CartSyncDocument, "revision" | "expiresAt">, options: {
329
- expectedRevision: string | null;
330
- operationId: string;
331
- signal?: AbortSignal;
332
- }): Promise<{
333
- status: "saved";
334
- document: CartSyncDocument;
335
- } | {
336
- status: "conflict";
337
- document: CartSyncDocument;
338
- }>;
339
- }
1
+ import { a as Menu, C as CategoryPage, S as Store, I as Item, M as Money, F as Formatters } from './models-Rg5kQUkv.js';
2
+ import { Q as QuoteRequest, g as WireQuote, i as CartIssueCode, d as CartModule, b as CartLineInput } from './types-CuDvfW9g.js';
340
3
 
341
4
  /**
342
5
  * The store, branch, order context and source menu that identify a saved catalogue.
@@ -475,6 +138,7 @@ interface Transport {
475
138
  branchId: string;
476
139
  ifNoneMatch?: string;
477
140
  metadataOnly?: boolean;
141
+ fulfilment?: MenuFulfilment | undefined;
478
142
  }): Promise<MenuResponse>;
479
143
  getCategoryPage?(ctx: RequestCtx & {
480
144
  branchId: string;
@@ -484,6 +148,7 @@ interface Transport {
484
148
  }): Promise<CategoryPage>;
485
149
  getMenuVersion(ctx: RequestCtx & {
486
150
  branchId: string;
151
+ fulfilment?: MenuFulfilment | undefined;
487
152
  }): Promise<MenuVersion>;
488
153
  getItem(ctx: RequestCtx & {
489
154
  branchId: string;
@@ -522,6 +187,8 @@ type ZappieConfig = {
522
187
  baseUrl?: string;
523
188
  version?: string;
524
189
  fetch?: typeof fetch;
190
+ /** Route cart quotes through the same-origin customer channel when set. */
191
+ customerBase?: string;
525
192
  storage?: StorageLike;
526
193
  telemetry?: boolean;
527
194
  cart?: {
@@ -626,11 +293,17 @@ type ZappieEvents = {
626
293
  };
627
294
  };
628
295
 
296
+ /** A catalogue fulfilment mode accepted by menu reads. */
297
+ type MenuFulfilment = "delivery" | "pickup" | "dineIn";
629
298
  /** Optional branch selection and cancellation for resource reads. */
630
299
  type ReadOptions = {
631
300
  branch?: string;
632
301
  signal?: AbortSignal;
633
302
  };
303
+ /** Optional branch and fulfilment selection for catalogue reads. */
304
+ type MenuReadOptions = ReadOptions & {
305
+ fulfilment?: MenuFulfilment;
306
+ };
634
307
  /** Read-only store resource. */
635
308
  interface StoreResource {
636
309
  get(opts?: {
@@ -643,14 +316,14 @@ interface MenuResource {
643
316
  search(query: string, opts?: ReadOptions & {
644
317
  cursor?: string;
645
318
  }): Promise<SearchPage>;
646
- get(opts?: ReadOptions & {
319
+ get(opts?: MenuReadOptions & {
647
320
  metadataOnly?: boolean;
648
321
  }): Promise<Menu>;
649
322
  page(menuId: string, categoryId: string, opts?: ReadOptions & {
650
323
  cursor?: string;
651
324
  }): Promise<CategoryPage>;
652
325
  peek(branch?: string): Menu | undefined;
653
- version(opts?: ReadOptions): Promise<MenuVersion>;
326
+ version(opts?: MenuReadOptions): Promise<MenuVersion>;
654
327
  item(id: string, opts?: ReadOptions): Promise<Item>;
655
328
  hydrate(menu: Menu): void;
656
329
  }
@@ -667,6 +340,7 @@ declare function buildClient(input: ZappieConfig, secret?: boolean): Readonly<{
667
340
  transport?: Transport;
668
341
  baseUrl?: string;
669
342
  fetch?: typeof fetch;
343
+ customerBase?: string;
670
344
  storage?: StorageLike;
671
345
  cart?: {
672
346
  ttl?: number;
@@ -700,6 +374,7 @@ declare function createZappie(config: ZappieConfig): Readonly<{
700
374
  transport?: Transport;
701
375
  baseUrl?: string;
702
376
  fetch?: typeof fetch;
377
+ customerBase?: string;
703
378
  storage?: StorageLike;
704
379
  cart?: {
705
380
  ttl?: number;
@@ -722,4 +397,4 @@ declare function createZappie(config: ZappieConfig): Readonly<{
722
397
  };
723
398
  }>;
724
399
 
725
- export { createSelectedMenuReader as $, API_VERSION as A, type WireFix as B, type CartLineInput as C, type DeliveryAddress as D, type ErrorDetails as E, type WireIssue as F, type WireLine as G, type WireMoney as H, createZappie as I, isZappieError as J, CATALOGUE_MAX_AGE_MS as K, CATALOGUE_MAX_BYTES as L, type MenuResource as M, type CatalogueScope as N, type SavedCatalogue as O, catalogueDigest as P, type QuoteRequest as Q, type RequestCtx as R, type StorageLike as S, type Transport as T, catalogueKey as U, createCatalogueStorage as V, type WireFulfilment as W, createSavedCatalogue as X, type SelectedMenu as Y, type Zappie as Z, type SelectedMenuTransport as _, type Quote as a, selectedMenu as a0, selectedMenuKey as a1, type CartFulfilment as b, ZappieError as c, type CartModule as d, type CartLine as e, type CartState as f, type CartIssue as g, type ZappieConfig as h, type StoreResource as i, type ZappieEvents as j, Cache as k, type ZappieErrorCode as l, type WireQuote as m, type MenuResponse as n, type SelectedMenuRequest as o, type SelectedMenuResponse as p, type SearchRequest as q, type SearchPage as r, type MenuVersion as s, type CartFix as t, type CartIssueCode as u, validateConfig as v, type CartSnapshot as w, type CartSyncAdapter as x, type CartSyncDocument as y, type ReadOptions as z };
400
+ export { API_VERSION as A, type SelectedMenuTransport as B, Cache as C, createSelectedMenuReader as D, type ErrorDetails as E, selectedMenu as F, selectedMenuKey as G, type MenuResource as M, type RequestCtx as R, type StorageLike as S, type Transport as T, type Zappie as Z, ZappieError as a, type ZappieConfig as b, type StoreResource as c, type ZappieEvents as d, type ZappieErrorCode as e, type MenuFulfilment as f, type MenuResponse as g, type SelectedMenuRequest as h, type SelectedMenuResponse as i, type SearchRequest as j, type SearchPage as k, type MenuVersion as l, type MenuReadOptions as m, type ReadOptions as n, createZappie as o, isZappieError as p, CATALOGUE_MAX_AGE_MS as q, CATALOGUE_MAX_BYTES as r, type CatalogueScope as s, type SavedCatalogue as t, catalogueDigest as u, validateConfig as v, catalogueKey as w, createCatalogueStorage as x, createSavedCatalogue as y, type SelectedMenu as z };
package/dist/client.js CHANGED
@@ -77,11 +77,12 @@ function buildClient(input, secret = false) {
77
77
  async get(opts = {}) {
78
78
  const branch = resolveBranch(await store.get(opts), opts.branch);
79
79
  return cache.get(
80
- `menu:${branch.id}${opts.metadataOnly ? ":partial" : ""}`,
80
+ `${menuKey(branch.id)}${opts.fulfilment ? `:${opts.fulfilment}` : ""}${opts.metadataOnly ? ":partial" : ""}`,
81
81
  async (signal, entry) => {
82
82
  const response = await transport.getMenu({
83
83
  ...ctx(signal),
84
84
  branchId: branch.id,
85
+ fulfilment: opts.fulfilment,
85
86
  ...opts.metadataOnly ? { metadataOnly: true } : {},
86
87
  ...entry.etag ? { ifNoneMatch: entry.etag } : {}
87
88
  });
@@ -146,7 +147,8 @@ function buildClient(input, secret = false) {
146
147
  const branch = resolveBranch(await store.get(opts), opts.branch);
147
148
  return transport.getMenuVersion({
148
149
  ...ctx(opts.signal),
149
- branchId: branch.id
150
+ branchId: branch.id,
151
+ fulfilment: opts.fulfilment
150
152
  });
151
153
  },
152
154
  async item(id, opts = {}) {