@zappie/sdk 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +55 -313
  3. package/dist/cart/errors.js +13 -0
  4. package/dist/cart/errors.js.map +7 -0
  5. package/dist/cart/index.js +768 -0
  6. package/dist/cart/index.js.map +7 -0
  7. package/dist/cart/item.js +12 -1
  8. package/dist/cart/item.js.map +7 -1
  9. package/dist/cart/preview.js +32 -0
  10. package/dist/cart/preview.js.map +7 -0
  11. package/dist/cart/price.js +25 -0
  12. package/dist/cart/price.js.map +7 -0
  13. package/dist/cart/quote-client.js +76 -0
  14. package/dist/cart/quote-client.js.map +7 -0
  15. package/dist/cart/quote-response.js +178 -0
  16. package/dist/cart/quote-response.js.map +7 -0
  17. package/dist/cart/reconcile.js +108 -0
  18. package/dist/cart/reconcile.js.map +7 -0
  19. package/dist/cart/source-menu.js +21 -0
  20. package/dist/cart/source-menu.js.map +7 -0
  21. package/dist/cart/storage.js +174 -0
  22. package/dist/cart/storage.js.map +7 -0
  23. package/dist/cart/types.js +1 -0
  24. package/dist/cart/types.js.map +7 -0
  25. package/dist/cart/validate.js +265 -0
  26. package/dist/cart/validate.js.map +7 -0
  27. package/dist/cart/wire.js +42 -0
  28. package/dist/cart/wire.js.map +7 -0
  29. package/dist/cart/working-set.js +80 -0
  30. package/dist/cart/working-set.js.map +7 -0
  31. package/dist/checkout/client.js +102 -0
  32. package/dist/checkout/client.js.map +7 -0
  33. package/dist/checkout/error.js +21 -0
  34. package/dist/checkout/error.js.map +7 -0
  35. package/dist/checkout/index.js +13 -1
  36. package/dist/checkout/index.js.map +7 -1
  37. package/dist/checkout/readiness.js +36 -0
  38. package/dist/checkout/readiness.js.map +7 -0
  39. package/dist/checkout/sdk.js +9 -0
  40. package/dist/checkout/sdk.js.map +7 -0
  41. package/dist/checkout/session.js +58 -0
  42. package/dist/checkout/session.js.map +7 -0
  43. package/dist/checkout/types.js +1 -0
  44. package/dist/checkout/types.js.map +7 -0
  45. package/dist/client.js +253 -0
  46. package/dist/client.js.map +7 -0
  47. package/dist/config/index.js +13 -1
  48. package/dist/config/index.js.map +7 -0
  49. package/dist/config.js +28 -0
  50. package/dist/config.js.map +7 -0
  51. package/dist/customer/client.js +149 -0
  52. package/dist/customer/client.js.map +7 -0
  53. package/dist/customer/error.js +20 -0
  54. package/dist/customer/error.js.map +7 -0
  55. package/dist/customer/index.js +8 -3
  56. package/dist/customer/index.js.map +7 -1
  57. package/dist/customer/navigation.js +45 -0
  58. package/dist/customer/navigation.js.map +7 -0
  59. package/dist/customer/react.js +67 -2
  60. package/dist/customer/react.js.map +7 -1
  61. package/dist/customer/request.js +37 -0
  62. package/dist/customer/request.js.map +7 -0
  63. package/dist/customer/sdk.js +6 -0
  64. package/dist/customer/sdk.js.map +7 -0
  65. package/dist/customer/types.js +1 -0
  66. package/dist/customer/types.js.map +7 -0
  67. package/dist/customer/watch-order.js +80 -0
  68. package/dist/customer/watch-order.js.map +7 -0
  69. package/dist/debug.js +78 -1
  70. package/dist/debug.js.map +7 -1
  71. package/dist/errors.js +69 -0
  72. package/dist/errors.js.map +7 -0
  73. package/dist/index.d.ts +2 -2
  74. package/dist/index.js +29 -1
  75. package/dist/index.js.map +7 -1
  76. package/dist/internal/abort.js +29 -0
  77. package/dist/internal/abort.js.map +7 -0
  78. package/dist/internal/cache.js +142 -0
  79. package/dist/internal/cache.js.map +7 -0
  80. package/dist/internal/customer-http.js +74 -0
  81. package/dist/internal/customer-http.js.map +7 -0
  82. package/dist/internal/digest.js +15 -0
  83. package/dist/internal/digest.js.map +7 -0
  84. package/dist/internal/emitter.js +27 -0
  85. package/dist/internal/emitter.js.map +7 -0
  86. package/dist/internal/money-math.js +30 -0
  87. package/dist/internal/money-math.js.map +7 -0
  88. package/dist/internal.js +9 -1
  89. package/dist/internal.js.map +7 -1
  90. package/dist/models.js +1 -0
  91. package/dist/models.js.map +7 -0
  92. package/dist/money.js +58 -0
  93. package/dist/money.js.map +7 -0
  94. package/dist/persist/catalogue.js +206 -2
  95. package/dist/persist/catalogue.js.map +7 -1
  96. package/dist/places/client.js +97 -0
  97. package/dist/places/client.js.map +7 -0
  98. package/dist/places/error.js +20 -0
  99. package/dist/places/error.js.map +7 -0
  100. package/dist/places/index.js +8 -1
  101. package/dist/places/index.js.map +7 -1
  102. package/dist/places/request.js +40 -0
  103. package/dist/places/request.js.map +7 -0
  104. package/dist/places/sdk.js +10 -0
  105. package/dist/places/sdk.js.map +7 -0
  106. package/dist/places/search.js +80 -0
  107. package/dist/places/search.js.map +7 -0
  108. package/dist/places/types.js +1 -0
  109. package/dist/places/types.js.map +7 -0
  110. package/dist/react/cart.js +30 -0
  111. package/dist/react/cart.js.map +7 -0
  112. package/dist/react/hooks.js +91 -0
  113. package/dist/react/hooks.js.map +7 -0
  114. package/dist/react/index.js +18 -1
  115. package/dist/react/index.js.map +7 -1
  116. package/dist/react/provider.js +34 -0
  117. package/dist/react/provider.js.map +7 -0
  118. package/dist/server/index.js +32 -2
  119. package/dist/server/index.js.map +7 -1
  120. package/dist/server/storefront-url/build-v1.js +75 -0
  121. package/dist/server/storefront-url/build-v1.js.map +7 -0
  122. package/dist/server/storefront-url/build-v2.js +79 -0
  123. package/dist/server/storefront-url/build-v2.js.map +7 -0
  124. package/dist/server/storefront-url/build.js +19 -0
  125. package/dist/server/storefront-url/build.js.map +7 -0
  126. package/dist/server/storefront-url/contract.js +25 -0
  127. package/dist/server/storefront-url/contract.js.map +7 -0
  128. package/dist/server/storefront-url/index.js +16 -0
  129. package/dist/server/storefront-url/index.js.map +7 -0
  130. package/dist/server/storefront-url/installation.js +58 -0
  131. package/dist/server/storefront-url/installation.js.map +7 -0
  132. package/dist/server/storefront-url/params.js +72 -0
  133. package/dist/server/storefront-url/params.js.map +7 -0
  134. package/dist/server/storefront-url/parse-v1.js +135 -0
  135. package/dist/server/storefront-url/parse-v1.js.map +7 -0
  136. package/dist/server/storefront-url/parse-v2.js +139 -0
  137. package/dist/server/storefront-url/parse-v2.js.map +7 -0
  138. package/dist/server/storefront-url/parse.js +9 -0
  139. package/dist/server/storefront-url/parse.js.map +7 -0
  140. package/dist/server/storefront-url/redirect.js +30 -0
  141. package/dist/server/storefront-url/redirect.js.map +7 -0
  142. package/dist/server/storefront-url/sign-in.js +17 -0
  143. package/dist/server/storefront-url/sign-in.js.map +7 -0
  144. package/dist/server/storefront-url/types.js +55 -0
  145. package/dist/server/storefront-url/types.js.map +7 -0
  146. package/dist/server/storefront-url/url.js +61 -0
  147. package/dist/server/storefront-url/url.js.map +7 -0
  148. package/dist/server/webhook.js +96 -0
  149. package/dist/server/webhook.js.map +7 -0
  150. package/dist/site-config/helpers.js +59 -0
  151. package/dist/site-config/helpers.js.map +7 -0
  152. package/dist/site-config/sections.js +105 -0
  153. package/dist/site-config/sections.js.map +7 -0
  154. package/dist/site-config/types.js +31 -0
  155. package/dist/site-config/types.js.map +7 -0
  156. package/dist/site-config/validate.js +165 -0
  157. package/dist/site-config/validate.js.map +7 -0
  158. package/dist/template/index.js +46 -3
  159. package/dist/template/index.js.map +7 -1
  160. package/dist/template/react.js +81 -2
  161. package/dist/template/react.js.map +7 -1
  162. package/dist/testing/index.js +451 -2
  163. package/dist/testing/index.js.map +7 -1
  164. package/dist/transport/category-page.js +21 -2
  165. package/dist/transport/category-page.js.map +7 -1
  166. package/dist/transport/mappers.js +326 -0
  167. package/dist/transport/mappers.js.map +7 -0
  168. package/dist/transport/rest.js +313 -0
  169. package/dist/transport/rest.js.map +7 -0
  170. package/dist/transport/search.js +32 -2
  171. package/dist/transport/search.js.map +7 -1
  172. package/dist/transport/selected-menu.js +79 -2
  173. package/dist/transport/selected-menu.js.map +7 -1
  174. package/dist/transport/store.js +120 -2
  175. package/dist/transport/store.js.map +7 -1
  176. package/dist/transport/types.js +1 -0
  177. package/dist/transport/types.js.map +7 -0
  178. package/dist/url/index.js +16 -2
  179. package/dist/url/index.js.map +7 -1
  180. package/dist/visits/index.js +62 -1
  181. package/dist/visits/index.js.map +7 -1
  182. package/dist/visits/page-views.js +103 -0
  183. package/dist/visits/page-views.js.map +7 -0
  184. package/package.json +5 -4
  185. package/dist/cart/quote.js +0 -1
  186. package/dist/cart/quote.js.map +0 -1
  187. package/dist/chunk-I55A5QXJ.js +0 -2
  188. package/dist/chunk-I55A5QXJ.js.map +0 -1
  189. package/dist/chunk-VG7NKIKR.js +0 -2
  190. package/dist/chunk-VG7NKIKR.js.map +0 -1
@@ -1 +1,7 @@
1
- {"version":3,"sources":["../../src/server/storefront-url/contract.ts","../../src/server/storefront-url/types.ts","../../src/server/storefront-url/url.ts","../../src/server/storefront-url/installation.ts","../../src/server/storefront-url/params.ts","../../src/server/storefront-url/build-v1.ts","../../src/server/storefront-url/sign-in.ts","../../src/server/storefront-url/build-v2.ts","../../src/server/storefront-url/build.ts","../../src/server/storefront-url/parse-v1.ts","../../src/server/storefront-url/parse-v2.ts","../../src/server/storefront-url/parse.ts","../../src/server/storefront-url/redirect.ts"],"names":["CART_MODAL","CHECKOUT_MODAL","SIGN_IN_MODAL","SIGN_IN_MODALS","usesV2","options","menuRoute","route","STOREFRONT_V1_QUERY_PARAMETERS","STOREFRONT_QUERY_PARAMETERS","FALLBACK_ORIGIN","ITEM_MODAL_PREFIX","decode","value","encode","inputUrl","input","queryRecord","params","contract","query","key","pageState","url","pickup","normalizedPath","pathname","installationPath","installation","business","suffix","publicInstallationPath","branchPrefix","segment","parts","index","stateParams","state","v1Params","v2Params","routePathV1","branch","buildV1","internal","publicRoute","signInFromOverlay","search","canonicalRoute","common","profilePath","routePathV2","buildV2","canonical","buildStorefrontUrl","FIXED_ROUTES","ID_ROUTES","order","payPoint","beacon","link","session","isKeyOf","table","parseV1","modalItem","prefix","id","step","page","scoped","returnTo","pages","overlay","authModalId","modalId","parseV2","parseStorefrontUrl","comparable","storefrontRedirect","target"],"mappings":"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","file":"index.js","sourcesContent":["import type { StorefrontRoute, StorefrontUrlOptions } from \"./types\";\n\nexport const CART_MODAL = \"review-menu\";\nexport const CHECKOUT_MODAL = \"payment\";\nexport const SIGN_IN_MODAL = \"send-otp\";\nexport const SIGN_IN_MODALS = new Set([\n SIGN_IN_MODAL,\n \"verify-otp\",\n \"update-profile\",\n]);\n\nexport const usesV2 = (options: StorefrontUrlOptions) =>\n options.contract !== \"v1\" && options.installation !== undefined;\n\nexport const menuRoute = (\n route: Extract<\n StorefrontRoute,\n { type: \"cart\" | \"checkout\" | \"checkout-return\" | \"sign-in\" }\n >,\n): Extract<StorefrontRoute, { type: \"order-menu\" }> => ({\n type: \"order-menu\",\n business: route.business,\n ...(route.branch !== undefined ? { branch: route.branch } : {}),\n state: route.state,\n});\n","/**\n * A URL string, URL object or Request you can parse as a storefront route.\n */\nexport type StorefrontUrlInput = string | URL | Request;\n\n/**\n * The business and optional default branch bound to an installed storefront.\n */\nexport type StorefrontInstallation = {\n business: string;\n defaultBranch?: string;\n};\n\n/**\n * URL contract, installation and origin settings for parsing and building storefront routes.\n * An installation selects v2 unless you explicitly request v1.\n */\nexport type StorefrontUrlOptions = {\n contract?: \"v1\" | \"v2\";\n installation?: StorefrontInstallation;\n origin?: string;\n};\n\n/** Query keys that URL contract v1 keeps. */\nexport const STOREFRONT_V1_QUERY_PARAMETERS = [\n \"ref\",\n \"utm_source\",\n \"payment_id\",\n \"context\",\n \"prefetch\",\n \"business_tag\",\n \"pay_point_id\",\n \"dine_in_order_id\",\n \"no_context\",\n \"payment_context_id\",\n \"ws\",\n \"preview\",\n \"device\",\n \"auto_scroll\",\n \"pickup\",\n \"branch_closed\",\n \"order_id\",\n \"modal_id\",\n \"lightbox\",\n \"menu_id\",\n \"payment_method\",\n \"beacon_id\",\n \"menu_group_id\",\n \"category_id\",\n \"menu_layout\",\n \"can_schedule\",\n \"refresh\",\n \"success\",\n \"grant\",\n \"portal\",\n \"can_download_receipt\",\n \"auth_modal_id\",\n \"experimental_otp\",\n \"branch\",\n \"business\",\n \"env\",\n \"switched_branch\",\n \"from\",\n \"template\",\n \"catalog_rendering\",\n \"catalogue_search\",\n \"catalogue_categories\",\n] as const;\n\n/**\n * Recognized storefront query keys, including the v1 keys and checkout return and session keys.\n */\nexport const STOREFRONT_QUERY_PARAMETERS = [\n ...STOREFRONT_V1_QUERY_PARAMETERS,\n \"return\",\n \"session\",\n] as const;\n\n/**\n * Readonly query parameter names and string values carried by storefront page state.\n */\nexport type StorefrontQuery = Readonly<Record<string, string>>;\n\n/**\n * Query parameters and named UI selections carried alongside a storefront route.\n */\nexport type StorefrontPageState = {\n query: StorefrontQuery;\n menuId?: string;\n categoryId?: string;\n menuLayout?: string;\n mode?: \"delivery\" | \"pickup\";\n modalId?: string;\n authModalId?: string;\n paymentId?: string;\n lightbox?: string;\n catalogueSearch?: string;\n catalogueCategories?: string;\n};\n\nexport type WithState = { state: StorefrontPageState };\n\n/**\n * A parsed storefront destination with its route identifiers and page state.\n * Unrecognized paths use the unknown variant.\n */\nexport type StorefrontRoute =\n | ({\n type: \"order-menu\";\n business: string;\n branch?: string;\n cataloguePath?: boolean;\n } & WithState)\n | ({\n type: \"item\";\n business: string;\n branch?: string;\n item: string;\n } & WithState)\n | ({ type: \"cart\"; business: string; branch?: string } & WithState)\n | ({ type: \"checkout\"; business: string; branch?: string } & WithState)\n | ({\n type: \"checkout-return\";\n business: string;\n branch?: string;\n session?: string;\n } & WithState)\n | ({\n type: \"sign-in\";\n business: string;\n branch?: string;\n returnTo?: string;\n } & WithState)\n | ({\n type: \"content-page\";\n business: string;\n slug: string;\n branch?: string;\n } & WithState)\n | ({ type: \"dine-in\"; order: string } & WithState)\n | ({ type: \"dine-in-menus\" } & WithState)\n | ({ type: \"self-service-menus\" } & WithState)\n | ({ type: \"pay-point\"; payPoint: string } & WithState)\n | ({ type: \"beacon\"; beacon: string } & WithState)\n | ({ type: \"link\"; link: string } & WithState)\n | ({ type: \"collect-payment\" } & WithState)\n | ({ type: \"reservation\" } & WithState)\n | ({ type: \"pay-session\"; session: string } & WithState)\n | ({\n type: \"payment-step\";\n payment: string;\n step: \"payment\" | \"successful\" | \"failed\" | \"refunded\";\n } & WithState)\n | ({\n type: \"payment-card\";\n transaction: string;\n } & WithState)\n | ({\n type: \"profile\";\n page:\n | \"add-store-credit\"\n | \"edit\"\n | \"orders\"\n | \"payment-methods\"\n | \"transactions\";\n order?: string;\n } & WithState)\n | ({ type: \"explore\"; home?: boolean } & WithState)\n | ({ type: \"unknown\"; pathname: string } & WithState);\n","import {\n STOREFRONT_QUERY_PARAMETERS,\n STOREFRONT_V1_QUERY_PARAMETERS,\n type StorefrontPageState,\n type StorefrontUrlInput,\n} from \"./types\";\n\nexport const FALLBACK_ORIGIN = \"https://storefront.invalid\";\nexport const ITEM_MODAL_PREFIX = \"product_\";\n\nexport const decode = (value: string) => {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n};\n\nexport const encode = (value: string) => encodeURIComponent(value);\n\nexport const inputUrl = (input: StorefrontUrlInput) => {\n if (input instanceof URL) {\n return new URL(input.toString());\n }\n const value = typeof input === \"string\" ? input : input.url;\n return new URL(value, FALLBACK_ORIGIN);\n};\n\nexport const queryRecord = (params: URLSearchParams, contract: \"v1\" | \"v2\") => {\n const query: Record<string, string> = {};\n params.forEach((value, key) => {\n const allowed: readonly string[] =\n contract === \"v2\"\n ? STOREFRONT_QUERY_PARAMETERS\n : STOREFRONT_V1_QUERY_PARAMETERS;\n if (allowed.includes(key)) {\n query[key] = value;\n }\n });\n return query;\n};\n\nexport const pageState = (\n url: URL,\n contract: \"v1\" | \"v2\" = \"v2\",\n): StorefrontPageState => {\n const query = queryRecord(url.searchParams, contract);\n const pickup = url.searchParams.get(\"pickup\");\n return {\n query,\n ...(url.searchParams.has(\"menu_id\")\n ? { menuId: url.searchParams.get(\"menu_id\") ?? \"\" }\n : {}),\n ...(url.searchParams.has(\"category_id\")\n ? { categoryId: url.searchParams.get(\"category_id\") ?? \"\" }\n : {}),\n ...(url.searchParams.has(\"menu_layout\")\n ? { menuLayout: url.searchParams.get(\"menu_layout\") ?? \"\" }\n : {}),\n ...(pickup === \"true\"\n ? { mode: \"pickup\" as const }\n : pickup === \"false\"\n ? { mode: \"delivery\" as const }\n : {}),\n ...(url.searchParams.has(\"modal_id\")\n ? { modalId: url.searchParams.get(\"modal_id\") ?? \"\" }\n : {}),\n ...(url.searchParams.has(\"auth_modal_id\")\n ? { authModalId: url.searchParams.get(\"auth_modal_id\") ?? \"\" }\n : {}),\n ...(url.searchParams.has(\"payment_id\")\n ? { paymentId: url.searchParams.get(\"payment_id\") ?? \"\" }\n : {}),\n ...(url.searchParams.has(\"lightbox\")\n ? { lightbox: url.searchParams.get(\"lightbox\") ?? \"\" }\n : {}),\n ...(url.searchParams.has(\"catalogue_search\")\n ? { catalogueSearch: url.searchParams.get(\"catalogue_search\") ?? \"\" }\n : {}),\n ...(url.searchParams.has(\"catalogue_categories\")\n ? {\n catalogueCategories:\n url.searchParams.get(\"catalogue_categories\") ?? \"\",\n }\n : {}),\n };\n};\n","import { type StorefrontInstallation, type StorefrontRoute } from \"./types\";\nimport { decode, encode } from \"./url\";\n\nexport const normalizedPath = (pathname: string) => {\n const trimmed = pathname.replace(/\\/+$/, \"\");\n return trimmed || \"/\";\n};\n\nexport const installationPath = (\n pathname: string,\n installation?: StorefrontInstallation,\n) => {\n if (!installation) {\n return pathname;\n }\n const business = `/order/${encode(installation.business)}`;\n if (pathname === \"/\") {\n return business;\n }\n if (pathname === \"/order\") {\n return installation.defaultBranch\n ? `${business}/${encode(installation.defaultBranch)}`\n : business;\n }\n if (pathname.startsWith(\"/pages/\")) {\n return `${business}${pathname}`;\n }\n if (\n !pathname.startsWith(\"/order/\") ||\n pathname === business ||\n pathname.startsWith(`${business}/`)\n ) {\n return pathname;\n }\n const suffix = pathname.slice(\"/order\".length);\n if (\n installation.defaultBranch &&\n (suffix === \"/products\" ||\n suffix.startsWith(\"/products/\") ||\n suffix.startsWith(\"/pages/\"))\n ) {\n return `${business}/${encode(installation.defaultBranch)}${suffix}`;\n }\n return `${business}${suffix}`;\n};\n\nexport const publicInstallationPath = (\n pathname: string,\n route: StorefrontRoute,\n installation?: StorefrontInstallation,\n) => {\n if (!installation || !(\"business\" in route)) {\n return pathname;\n }\n if (route.business !== installation.business) {\n return pathname;\n }\n if (route.type === \"content-page\" && !route.branch) {\n return `/pages/${encode(route.slug)}`;\n }\n if (route.type === \"order-menu\" && !route.branch) {\n return \"/\";\n }\n const branchPrefix = `/order/${encode(route.business)}/${encode(route.branch ?? \"\")}`;\n const suffix = pathname.slice(branchPrefix.length);\n if (route.branch === installation.defaultBranch) {\n return `/order${suffix}`;\n }\n return `/order/${encode(route.branch ?? \"\")}${suffix}`;\n};\n\nexport const segment = (parts: string[], index: number) =>\n decode(parts[index] ?? \"\");\n","import { CART_MODAL, CHECKOUT_MODAL, SIGN_IN_MODAL } from \"./contract\";\nimport type { StorefrontInstallation, StorefrontRoute } from \"./types\";\n\nconst stateParams = (route: StorefrontRoute) => {\n const params = new URLSearchParams(route.state.query);\n const state = route.state;\n const values: ReadonlyArray<[string, string | undefined]> = [\n [\"menu_id\", state.menuId],\n [\"category_id\", state.categoryId],\n [\"menu_layout\", state.menuLayout],\n [\"pickup\", state.mode ? String(state.mode === \"pickup\") : undefined],\n [\"modal_id\", state.modalId],\n [\"auth_modal_id\", state.authModalId],\n [\"payment_id\", state.paymentId],\n [\"lightbox\", state.lightbox],\n [\"catalogue_search\", state.catalogueSearch],\n [\"catalogue_categories\", state.catalogueCategories],\n ];\n values.forEach(([key, value]) => {\n if (value !== undefined) {\n params.set(key, value);\n }\n });\n return params;\n};\n\nexport const v1Params = (route: StorefrontRoute) => {\n const params = stateParams(route);\n if (route.type === \"item\") {\n params.delete(\"modal_id\");\n } else if (route.type === \"cart\") {\n params.set(\"modal_id\", CART_MODAL);\n } else if (route.type === \"checkout\") {\n params.set(\"modal_id\", CHECKOUT_MODAL);\n } else if (route.type === \"sign-in\") {\n params.set(\"auth_modal_id\", SIGN_IN_MODAL);\n if (route.returnTo !== undefined) {\n params.set(\"return\", route.returnTo);\n }\n } else if (route.type === \"checkout-return\" && route.session !== undefined) {\n params.set(\"session\", route.session);\n }\n params.sort();\n return params;\n};\n\nexport const v2Params = (\n route: StorefrontRoute,\n installation: StorefrontInstallation,\n) => {\n const params = stateParams(route);\n if (\n route.type === \"order-menu\" ||\n route.type === \"item\" ||\n route.type === \"cart\" ||\n route.type === \"checkout\" ||\n route.type === \"checkout-return\" ||\n route.type === \"sign-in\" ||\n route.type === \"content-page\"\n ) {\n if (route.branch && route.branch !== installation.defaultBranch) {\n params.set(\"branch\", route.branch);\n } else {\n params.delete(\"branch\");\n }\n }\n if (\n route.type === \"item\" ||\n route.type === \"cart\" ||\n route.type === \"checkout\" ||\n route.type === \"checkout-return\"\n ) {\n params.delete(\"modal_id\");\n }\n if (route.type === \"sign-in\") {\n params.delete(\"auth_modal_id\");\n if (route.returnTo !== undefined) {\n params.set(\"return\", route.returnTo);\n }\n }\n if (route.type === \"checkout-return\" && route.session !== undefined) {\n params.set(\"session\", route.session);\n }\n params.sort();\n return params;\n};\n","import { menuRoute } from \"./contract\";\nimport { publicInstallationPath } from \"./installation\";\nimport { v1Params } from \"./params\";\nimport { type StorefrontRoute, type StorefrontUrlOptions } from \"./types\";\nimport { encode } from \"./url\";\n\nexport const routePathV1 = (\n route: StorefrontRoute,\n options: StorefrontUrlOptions = {},\n): string => {\n switch (route.type) {\n case \"order-menu\":\n return `/order/${encode(route.business)}${route.branch ? `/${encode(route.branch)}` : \"\"}${route.cataloguePath ? \"/products\" : \"\"}`;\n case \"item\": {\n const branch = route.branch ?? options.installation?.defaultBranch;\n return branch\n ? `/order/${encode(route.business)}/${encode(branch)}/products/${encode(route.item)}`\n : `/order/${encode(route.business)}`;\n }\n case \"cart\":\n case \"checkout\":\n case \"checkout-return\":\n case \"sign-in\":\n return routePathV1(menuRoute(route), options);\n case \"content-page\":\n return `/order/${encode(route.business)}${route.branch ? `/${encode(route.branch)}` : \"\"}/pages/${encode(route.slug)}`;\n case \"dine-in\":\n return `/dine-in/${encode(route.order)}`;\n case \"dine-in-menus\":\n return \"/dine-in/menus\";\n case \"self-service-menus\":\n return \"/self-service/menus\";\n case \"pay-point\":\n return `/pay-point/${encode(route.payPoint)}`;\n case \"beacon\":\n return `/beacons/${encode(route.beacon)}`;\n case \"link\":\n return `/links/${encode(route.link)}`;\n case \"collect-payment\":\n return \"/collect-payment\";\n case \"reservation\":\n return \"/reservation\";\n case \"pay-session\":\n return `/pay/${encode(route.session)}`;\n case \"payment-step\":\n return `/payment/${encode(route.payment)}${route.step === \"payment\" ? \"\" : `/${route.step}`}`;\n case \"payment-card\":\n return `/payment/card/${encode(route.transaction)}`;\n case \"profile\":\n return `/profile/${route.page}${route.order ? `/${encode(route.order)}` : \"\"}`;\n case \"explore\":\n return route.home ? \"/\" : \"/explore\";\n case \"unknown\":\n return route.pathname || \"/\";\n }\n};\n\nexport const buildV1 = (\n route: StorefrontRoute,\n options: StorefrontUrlOptions = {},\n) => {\n const internal = routePathV1(route, options);\n const publicRoute =\n route.type === \"item\" &&\n route.branch === undefined &&\n options.installation?.defaultBranch\n ? { ...route, branch: options.installation.defaultBranch }\n : route;\n const pathname = publicInstallationPath(\n internal,\n publicRoute,\n options.installation,\n );\n const query = v1Params(route).toString();\n const value = `${pathname}${query ? `?${query}` : \"\"}`;\n if (!options.origin) {\n return value;\n }\n try {\n return new URL(value, options.origin).toString();\n } catch {\n return value;\n }\n};\n","import { v2Params } from \"./params\";\nimport type { StorefrontInstallation, StorefrontRoute } from \"./types\";\n\nexport const signInFromOverlay = (\n route: Extract<StorefrontRoute, { type: \"order-menu\" }>,\n installation: StorefrontInstallation,\n): Extract<StorefrontRoute, { type: \"sign-in\" }> => {\n const params = v2Params(route, installation);\n params.delete(\"auth_modal_id\");\n const search = params.toString();\n return {\n type: \"sign-in\",\n business: route.business,\n state: { query: {} },\n returnTo: `/${search ? `?${search}` : \"\"}`,\n };\n};\n","import { routePathV1 } from \"./build-v1\";\nimport { CART_MODAL, CHECKOUT_MODAL, SIGN_IN_MODALS } from \"./contract\";\nimport { v2Params } from \"./params\";\nimport { signInFromOverlay } from \"./sign-in\";\nimport type {\n StorefrontInstallation,\n StorefrontRoute,\n StorefrontUrlOptions,\n} from \"./types\";\nimport { encode, ITEM_MODAL_PREFIX } from \"./url\";\n\nconst canonicalRoute = (\n route: StorefrontRoute,\n installation: StorefrontInstallation,\n): StorefrontRoute => {\n if (route.type !== \"order-menu\") {\n return route;\n }\n const common = {\n business: route.business,\n ...(route.branch !== undefined ? { branch: route.branch } : {}),\n state: route.state,\n };\n if (route.state.authModalId && SIGN_IN_MODALS.has(route.state.authModalId)) {\n return signInFromOverlay(route, installation);\n }\n if (route.state.modalId?.startsWith(ITEM_MODAL_PREFIX)) {\n return {\n type: \"item\",\n ...common,\n item: route.state.modalId.slice(ITEM_MODAL_PREFIX.length),\n };\n }\n if (route.state.modalId === CART_MODAL) {\n return { type: \"cart\", ...common };\n }\n if (route.state.modalId === CHECKOUT_MODAL) {\n return { type: \"checkout\", ...common };\n }\n return route;\n};\n\nconst profilePath = (route: Extract<StorefrontRoute, { type: \"profile\" }>) => {\n if (route.page === \"orders\") {\n return `/orders${route.order ? `/${encode(route.order)}` : \"\"}`;\n }\n if (route.page === \"edit\") {\n return \"/account\";\n }\n const page = route.page === \"add-store-credit\" ? \"store-credit\" : route.page;\n return `/account/${page}`;\n};\n\nconst routePathV2 = (route: StorefrontRoute, options: StorefrontUrlOptions) => {\n switch (route.type) {\n case \"order-menu\":\n return \"/\";\n case \"item\":\n return `/item/${encode(route.item)}`;\n case \"cart\":\n return \"/cart\";\n case \"checkout\":\n return \"/checkout\";\n case \"checkout-return\":\n return \"/checkout/return\";\n case \"sign-in\":\n return \"/sign-in\";\n case \"content-page\":\n return `/pages/${encode(route.slug)}`;\n case \"profile\":\n return profilePath(route);\n default:\n return routePathV1(route, options);\n }\n};\n\nexport const buildV2 = (\n route: StorefrontRoute,\n options: StorefrontUrlOptions,\n) => {\n const installation = options.installation;\n if (!installation) {\n return \"\";\n }\n const canonical = canonicalRoute(route, installation);\n const pathname = routePathV2(canonical, options);\n const query = v2Params(canonical, installation).toString();\n return `${pathname}${query ? `?${query}` : \"\"}`;\n};\n","import { buildV1 } from \"./build-v1\";\nimport { buildV2 } from \"./build-v2\";\nimport { usesV2 } from \"./contract\";\nimport type { StorefrontRoute, StorefrontUrlOptions } from \"./types\";\n\n/**\n * Build a storefront URL from a route and its page state.\n * Uses v2 when installation metadata is present unless you select v1 explicitly.\n *\n * @param route - The destination and UI state to encode.\n * @param options - Contract, installation and optional origin for an absolute URL.\n * @returns The built path, or an absolute URL when the origin resolves successfully.\n */\nexport const buildStorefrontUrl = (\n route: StorefrontRoute,\n options: StorefrontUrlOptions = {},\n) => {\n const value = usesV2(options)\n ? buildV2(route, options)\n : buildV1(route, options);\n if (!options.origin) {\n return value;\n }\n try {\n return new URL(value, options.origin).toString();\n } catch {\n return value;\n }\n};\n","import { installationPath, normalizedPath, segment } from \"./installation\";\nimport {\n type StorefrontPageState,\n type StorefrontRoute,\n type StorefrontUrlInput,\n type StorefrontUrlOptions,\n} from \"./types\";\nimport { ITEM_MODAL_PREFIX, inputUrl, pageState } from \"./url\";\n\n/** Paths with no variable segment. Checked before ID_ROUTES: `/dine-in/menus` is not a dine-in order. */\nconst FIXED_ROUTES = {\n \"/dine-in/menus\": \"dine-in-menus\",\n \"/self-service/menus\": \"self-service-menus\",\n \"/collect-payment\": \"collect-payment\",\n \"/reservation\": \"reservation\",\n} as const;\n\n/** `/<prefix>/<id>` routes, where the one segment after the prefix names the resource. */\nconst ID_ROUTES = {\n \"dine-in\": (order, state) => ({ type: \"dine-in\", order, state }),\n \"pay-point\": (payPoint, state) => ({ type: \"pay-point\", payPoint, state }),\n beacons: (beacon, state) => ({ type: \"beacon\", beacon, state }),\n links: (link, state) => ({ type: \"link\", link, state }),\n pay: (session, state) => ({ type: \"pay-session\", session, state }),\n} satisfies Record<\n string,\n (id: string, state: StorefrontPageState) => StorefrontRoute\n>;\n\nconst isKeyOf = <T extends object>(\n table: T,\n key: string,\n): key is Extract<keyof T, string> => Object.hasOwn(table, key);\n\nexport const parseV1 = (\n input: StorefrontUrlInput,\n options: StorefrontUrlOptions = {},\n): StorefrontRoute => {\n try {\n const url = inputUrl(input);\n const state = pageState(url, \"v1\");\n const pathname = installationPath(\n normalizedPath(url.pathname),\n options.installation,\n );\n const parts = pathname.split(\"/\").filter(Boolean);\n\n if (parts[0] === \"order\" && parts[1]) {\n const business = segment(parts, 1);\n if (parts[2] === \"pages\" && parts.length === 4) {\n return {\n type: \"content-page\",\n business,\n slug: segment(parts, 3),\n state,\n };\n }\n const branch = parts[2] ? segment(parts, 2) : undefined;\n if (branch && parts[3] === \"pages\" && parts.length === 5) {\n return {\n type: \"content-page\",\n business,\n branch,\n slug: segment(parts, 4),\n state,\n };\n }\n if (branch && parts[3] === \"products\" && parts[4] && parts.length === 5) {\n return {\n type: \"item\",\n business,\n branch,\n item: segment(parts, 4),\n state,\n };\n }\n if (\n parts.length <= 3 ||\n (parts.length === 4 && parts[3] === \"products\")\n ) {\n const modalItem = state.modalId?.startsWith(ITEM_MODAL_PREFIX)\n ? state.modalId.slice(ITEM_MODAL_PREFIX.length)\n : \"\";\n if (branch && modalItem) {\n return {\n type: \"item\",\n business,\n branch,\n item: modalItem,\n state,\n };\n }\n return {\n type: \"order-menu\",\n business,\n ...(branch ? { branch } : {}),\n ...(parts[3] === \"products\" ? { cataloguePath: true } : {}),\n state,\n };\n }\n }\n\n if (isKeyOf(FIXED_ROUTES, pathname)) {\n return { type: FIXED_ROUTES[pathname], state };\n }\n const [prefix = \"\", id] = parts;\n if (parts.length === 2 && id && isKeyOf(ID_ROUTES, prefix)) {\n return ID_ROUTES[prefix](segment(parts, 1), state);\n }\n if (\n parts[0] === \"payment\" &&\n parts[1] === \"card\" &&\n parts[2] &&\n parts.length === 3\n ) {\n return { type: \"payment-card\", transaction: segment(parts, 2), state };\n }\n if (parts[0] === \"payment\" && parts[1] && parts.length <= 3) {\n const step = parts[2];\n if (\n !step ||\n step === \"successful\" ||\n step === \"failed\" ||\n step === \"refunded\"\n ) {\n return {\n type: \"payment-step\",\n payment: segment(parts, 1),\n step:\n step === \"successful\" || step === \"failed\" || step === \"refunded\"\n ? step\n : \"payment\",\n state,\n };\n }\n }\n if (parts[0] === \"orders\" && parts.length <= 2) {\n return {\n type: \"profile\",\n page: \"orders\",\n ...(parts[1] ? { order: segment(parts, 1) } : {}),\n state,\n };\n }\n if (parts[0] === \"profile\" && parts[1] && parts.length <= 3) {\n const page = parts[1];\n if (\n page === \"add-store-credit\" ||\n page === \"edit\" ||\n page === \"payment-methods\" ||\n page === \"transactions\"\n ) {\n return { type: \"profile\", page, state };\n }\n if (page === \"orders\") {\n return {\n type: \"profile\",\n page,\n ...(parts[2] ? { order: segment(parts, 2) } : {}),\n state,\n };\n }\n }\n if (pathname === \"/\" || pathname === \"/explore\") {\n return {\n type: \"explore\",\n ...(pathname === \"/\" ? { home: true } : {}),\n state,\n };\n }\n return { type: \"unknown\", pathname, state };\n } catch {\n return { type: \"unknown\", pathname: \"\", state: { query: {} } };\n }\n};\n","import { CART_MODAL, CHECKOUT_MODAL, SIGN_IN_MODALS } from \"./contract\";\nimport { normalizedPath, segment } from \"./installation\";\nimport { parseV1 } from \"./parse-v1\";\nimport { signInFromOverlay } from \"./sign-in\";\nimport type {\n StorefrontPageState,\n StorefrontRoute,\n StorefrontUrlInput,\n StorefrontUrlOptions,\n} from \"./types\";\nimport { ITEM_MODAL_PREFIX, inputUrl, pageState } from \"./url\";\n\nconst branch = (url: URL) =>\n url.searchParams.has(\"branch\")\n ? { branch: url.searchParams.get(\"branch\") ?? \"\" }\n : {};\n\nconst canonical = (\n url: URL,\n state: StorefrontPageState,\n business: string,\n): StorefrontRoute | null => {\n const pathname = normalizedPath(url.pathname);\n const parts = pathname.split(\"/\").filter(Boolean);\n const scoped = branch(url);\n if (pathname === \"/\") {\n return { type: \"order-menu\", business, ...scoped, state };\n }\n if (parts[0] === \"item\" && parts[1] && parts.length === 2) {\n return {\n type: \"item\",\n business,\n ...scoped,\n item: segment(parts, 1),\n state,\n };\n }\n if (pathname === \"/cart\" || pathname === \"/checkout\") {\n return {\n type: pathname === \"/cart\" ? \"cart\" : \"checkout\",\n business,\n ...scoped,\n state,\n };\n }\n if (pathname === \"/checkout/return\") {\n const session = url.searchParams.get(\"session\");\n return {\n type: \"checkout-return\",\n business,\n ...scoped,\n ...(session !== null ? { session } : {}),\n state,\n };\n }\n if (pathname === \"/sign-in\") {\n const returnTo = url.searchParams.get(\"return\");\n return {\n type: \"sign-in\",\n business,\n ...scoped,\n ...(returnTo !== null ? { returnTo } : {}),\n state,\n };\n }\n if (parts[0] === \"pages\" && parts[1] && parts.length === 2) {\n return {\n type: \"content-page\",\n business,\n ...scoped,\n slug: segment(parts, 1),\n state,\n };\n }\n if (parts[0] === \"orders\" && parts.length <= 2) {\n return {\n type: \"profile\",\n page: \"orders\",\n ...(parts[1] ? { order: segment(parts, 1) } : {}),\n state,\n };\n }\n if (parts[0] === \"account\" && parts.length <= 2) {\n const pages = {\n \"payment-methods\": \"payment-methods\",\n transactions: \"transactions\",\n \"store-credit\": \"add-store-credit\",\n } as const;\n if (parts.length === 1) {\n return { type: \"profile\", page: \"edit\", state };\n }\n const page = parts[1];\n if (page && Object.hasOwn(pages, page)) {\n return {\n type: \"profile\",\n page: pages[page as keyof typeof pages],\n state,\n };\n }\n }\n return null;\n};\n\nconst overlay = (\n route: StorefrontRoute,\n installation: NonNullable<StorefrontUrlOptions[\"installation\"]>,\n): StorefrontRoute => {\n if (route.type !== \"order-menu\") {\n return route;\n }\n const { authModalId, modalId } = route.state;\n if (authModalId && SIGN_IN_MODALS.has(authModalId)) {\n return signInFromOverlay(route, installation);\n }\n if (modalId?.startsWith(ITEM_MODAL_PREFIX)) {\n return {\n type: \"item\",\n business: route.business,\n ...(route.branch !== undefined ? { branch: route.branch } : {}),\n item: modalId.slice(ITEM_MODAL_PREFIX.length),\n state: route.state,\n };\n }\n if (modalId === CART_MODAL || modalId === CHECKOUT_MODAL) {\n return {\n type: modalId === CART_MODAL ? \"cart\" : \"checkout\",\n business: route.business,\n ...(route.branch !== undefined ? { branch: route.branch } : {}),\n state: route.state,\n };\n }\n return route;\n};\n\nexport const parseV2 = (\n input: StorefrontUrlInput,\n options: StorefrontUrlOptions,\n): StorefrontRoute => {\n try {\n const url = inputUrl(input);\n const state = pageState(url);\n const installation = options.installation;\n if (!installation) {\n return parseV1(input, options);\n }\n const route = canonical(url, state, installation.business);\n if (route) {\n return route.type === \"order-menu\" ? overlay(route, installation) : route;\n }\n return overlay(\n parseV1(input, { ...options, contract: \"v1\" }),\n installation,\n );\n } catch {\n return { type: \"unknown\", pathname: \"\", state: { query: {} } };\n }\n};\n","import { usesV2 } from \"./contract\";\nimport { parseV1 } from \"./parse-v1\";\nimport { parseV2 } from \"./parse-v2\";\nimport type {\n StorefrontRoute,\n StorefrontUrlInput,\n StorefrontUrlOptions,\n} from \"./types\";\n\n/**\n * Parse a storefront URL into a route and its page state.\n * Uses v2 when installation metadata is present unless you select v1 explicitly.\n *\n * @param input - A URL string, URL object or Request.\n * @param options - Contract, installation and origin settings.\n * @returns A recognized route or an unknown route retaining the pathname.\n */\nexport const parseStorefrontUrl = (\n input: StorefrontUrlInput,\n options: StorefrontUrlOptions = {},\n): StorefrontRoute =>\n usesV2(options) ? parseV2(input, options) : parseV1(input, options);\n","import { buildStorefrontUrl } from \"./build\";\nimport { usesV2 } from \"./contract\";\nimport { normalizedPath } from \"./installation\";\nimport { parseStorefrontUrl } from \"./parse\";\nimport type { StorefrontUrlInput, StorefrontUrlOptions } from \"./types\";\nimport { inputUrl } from \"./url\";\n\nconst comparable = (value: string | URL) => {\n const url = inputUrl(value);\n url.searchParams.sort();\n return `${normalizedPath(url.pathname)}${url.search}`;\n};\n\n/**\n * Find the canonical v2 URL for a recognized storefront route.\n * Compares normalized paths and sorted query parameters to avoid unnecessary redirects.\n *\n * @returns A redirect target, or null for v1, an unknown route, a parse/build failure or an equivalent URL.\n */\nexport const storefrontRedirect = (\n input: StorefrontUrlInput,\n options: StorefrontUrlOptions = {},\n): string | null => {\n if (!usesV2(options)) {\n return null;\n }\n try {\n const route = parseStorefrontUrl(input, options);\n if (route.type === \"unknown\") {\n return null;\n }\n const target = buildStorefrontUrl(route, options);\n return comparable(inputUrl(input)) === comparable(target) ? null : target;\n } catch {\n return null;\n }\n};\n"]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/url/index.ts"],
4
+ "sourcesContent": ["export {\n STOREFRONT_QUERY_PARAMETERS,\n STOREFRONT_V1_QUERY_PARAMETERS,\n buildStorefrontUrl,\n parseStorefrontUrl,\n storefrontRedirect,\n type StorefrontInstallation,\n type StorefrontPageState,\n type StorefrontQuery,\n type StorefrontRoute,\n type StorefrontUrlInput,\n type StorefrontUrlOptions,\n} from \"../server/storefront-url/index\";\n"],
5
+ "mappings": ";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAOK;",
6
+ "names": []
7
+ }
@@ -1 +1,62 @@
1
- var V="zappie_visit";function a(t){try{let e=t.getItem(V);return e?JSON.parse(e):null}catch{return null}}function v(t,e){try{t.setItem(V,JSON.stringify(e));}catch{}}function I(t){return t==="/"?"menu":t.startsWith("/item/")?"item":t==="/cart"?"bag":t==="/checkout"?"checkout":t.startsWith("/checkout/")?"payment":t.startsWith("/orders")?"order":"page"}function d(t,e,n){let i=e.steps??[];return i.includes(n)?false:(e.steps=[...i,n],v(t,e),true)}function E(t,e,n){let i=t.split(/\s+[·|–-]\s+/).filter(s=>s.trim()&&s.trim()!==e).join(" \xB7 ").trim();return i||(n==="/"?"Home":"")}function u(t){let{path:e,search:n,title:i,referrer:s,storeName:S,storage:o}=t,m=a(o),r=m;if(!r){let l=new URLSearchParams(n);r={source:l.get("utm_source")||s,campaign:l.get("utm_campaign")||""},v(o,r);}return {path:e,title:E(i,S,e),source:r.source,campaign:r.campaign,new:m===null,step:d(o,r,I(e))}}function g(t,e,n){let i=a(n)??{source:"",campaign:""};return {event:t,path:e,source:i.source,campaign:i.campaign,step:d(n,i,t)}}function c(t){let e=a(t);return {source:e?.source??"",campaign:e?.campaign??""}}var p=false,h={getItem:()=>null,setItem:()=>{}};function f(){try{return window.sessionStorage}catch{return h}}function y(){return typeof navigator<"u"&&typeof navigator.sendBeacon=="function"}function w(t){navigator.sendBeacon("/_zappie/view",JSON.stringify(t));}function P(t){if(p=false,t.enabled===false)return;let{enabled:e,...n}=t,i=u({...n,storage:f()});p=true,y()&&w(i);}function N(t){!p||typeof window>"u"||!y()||w(g(t,window.location.pathname,f()));}function k(){return typeof window>"u"?{source:"",campaign:""}:c(f())}export{N as countEvent,P as countPage,k as currentSource,u as pageView,g as visitEvent,c as visitSource};//# sourceMappingURL=index.js.map
1
+ // src/visits/index.ts
2
+ import {
3
+ pageView,
4
+ visitEvent,
5
+ visitSource
6
+ } from "./page-views.js";
7
+ import {
8
+ pageView as pageView2,
9
+ visitEvent as visitEvent2,
10
+ visitSource as visitSource2
11
+ } from "./page-views.js";
12
+ var counting = false;
13
+ var emptyStorage = {
14
+ getItem: () => null,
15
+ setItem: () => void 0
16
+ };
17
+ function session() {
18
+ try {
19
+ return window.sessionStorage;
20
+ } catch {
21
+ return emptyStorage;
22
+ }
23
+ }
24
+ function canSend() {
25
+ return typeof navigator !== "undefined" && typeof navigator.sendBeacon === "function";
26
+ }
27
+ function send(body) {
28
+ navigator.sendBeacon("/_zappie/view", JSON.stringify(body));
29
+ }
30
+ function countPage(input) {
31
+ counting = false;
32
+ if (input.enabled === false) {
33
+ return;
34
+ }
35
+ const { enabled: _enabled, ...page } = input;
36
+ const view = pageView({ ...page, storage: session() });
37
+ counting = true;
38
+ if (canSend()) {
39
+ send(view);
40
+ }
41
+ }
42
+ function countEvent(event) {
43
+ if (!counting || typeof window === "undefined" || !canSend()) {
44
+ return;
45
+ }
46
+ send(visitEvent(event, window.location.pathname, session()));
47
+ }
48
+ function currentSource() {
49
+ if (typeof window === "undefined") {
50
+ return { source: "", campaign: "" };
51
+ }
52
+ return visitSource(session());
53
+ }
54
+ export {
55
+ countEvent,
56
+ countPage,
57
+ currentSource,
58
+ pageView2 as pageView,
59
+ visitEvent2 as visitEvent,
60
+ visitSource2 as visitSource
61
+ };
62
+ //# sourceMappingURL=index.js.map
@@ -1 +1,7 @@
1
- {"version":3,"sources":["../../src/visits/page-views.ts","../../src/visits/index.ts"],"names":["VISIT_KEY","stored","storage","raw","save","visit","kindOf","path","reached","kind","steps","titleOf","title","storeName","own","part","pageView","input","search","referrer","known","query","visitEvent","event","visitSource","counting","emptyStorage","session","canSend","send","body","countPage","_enabled","page","view","countEvent","currentSource"],"mappings":"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","file":"index.js","sourcesContent":["const VISIT_KEY = \"zappie_visit\";\n\n/**\n * The string storage interface used to retain visit attribution and reached steps.\n */\nexport type VisitStorage = {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n};\n\ntype Visit = { source: string; campaign: string; steps?: string[] };\n\n/**\n * A page-view payload with attribution and flags for a new visit and a newly reached page kind.\n */\nexport type PageView = {\n path: string;\n title: string;\n source: string;\n campaign: string;\n new: boolean;\n step: boolean;\n};\n\n/**\n * Supported visit events: adding an item or viewing the bag.\n */\nexport type VisitEventName = \"add\" | \"bag\";\n\n/**\n * A visit event with its path, attribution and whether this event is a new step.\n */\nexport type VisitEvent = {\n event: VisitEventName;\n path: string;\n source: string;\n campaign: string;\n step: boolean;\n};\n\n/**\n * Page location, title, referrer and store name plus the storage used to track the visit.\n */\nexport type PageViewInput = {\n path: string;\n search: string;\n title: string;\n referrer: string;\n storeName: string;\n storage: VisitStorage;\n};\n\nfunction stored(storage: VisitStorage): Visit | null {\n try {\n const raw = storage.getItem(VISIT_KEY);\n if (raw) {\n return JSON.parse(raw) as Visit;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nfunction save(storage: VisitStorage, visit: Visit): void {\n try {\n storage.setItem(VISIT_KEY, JSON.stringify(visit));\n } catch {\n // Without storage, each page is its own visit.\n }\n}\n\nfunction kindOf(path: string): string {\n if (path === \"/\") {\n return \"menu\";\n }\n if (path.startsWith(\"/item/\")) {\n return \"item\";\n }\n if (path === \"/cart\") {\n return \"bag\";\n }\n if (path === \"/checkout\") {\n return \"checkout\";\n }\n if (path.startsWith(\"/checkout/\")) {\n return \"payment\";\n }\n if (path.startsWith(\"/orders\")) {\n return \"order\";\n }\n return \"page\";\n}\n\nfunction reached(storage: VisitStorage, visit: Visit, kind: string): boolean {\n const steps = visit.steps ?? [];\n if (steps.includes(kind)) {\n return false;\n }\n visit.steps = [...steps, kind];\n save(storage, visit);\n return true;\n}\n\nfunction titleOf(title: string, storeName: string, path: string): string {\n const own = title\n .split(/\\s+[·|–-]\\s+/)\n .filter((part) => part.trim() && part.trim() !== storeName)\n .join(\" · \")\n .trim();\n if (own) {\n return own;\n }\n if (path === \"/\") {\n return \"Home\";\n }\n return \"\";\n}\n\n/**\n * Build a page-view payload and save visit attribution and reached steps in your storage.\n * On the first page, utm_source takes precedence over the referrer and utm_campaign supplies the campaign.\n *\n * @returns The payload with the store name removed from its title and visit/step flags. Does not send a request.\n */\nexport function pageView(input: PageViewInput): PageView {\n const { path, search, title, referrer, storeName, storage } = input;\n const known = stored(storage);\n let visit = known;\n if (!visit) {\n const query = new URLSearchParams(search);\n visit = {\n source: query.get(\"utm_source\") || referrer,\n campaign: query.get(\"utm_campaign\") || \"\",\n };\n save(storage, visit);\n }\n return {\n path,\n title: titleOf(title, storeName, path),\n source: visit.source,\n campaign: visit.campaign,\n new: known === null,\n step: reached(storage, visit, kindOf(path)),\n };\n}\n\n/**\n * Build a visit-event payload and record whether this event has already occurred in storage.\n * Uses stored attribution or empty strings. Does not send a request.\n */\nexport function visitEvent(\n event: VisitEventName,\n path: string,\n storage: VisitStorage,\n): VisitEvent {\n const visit = stored(storage) ?? { source: \"\", campaign: \"\" };\n return {\n event,\n path,\n source: visit.source,\n campaign: visit.campaign,\n step: reached(storage, visit, event),\n };\n}\n\n/**\n * Read the saved visit source and campaign from your storage, defaulting each to an empty string.\n */\nexport function visitSource(storage: VisitStorage): {\n source: string;\n campaign: string;\n} {\n const visit = stored(storage);\n return {\n source: visit?.source ?? \"\",\n campaign: visit?.campaign ?? \"\",\n };\n}\n","import {\n pageView,\n visitEvent,\n visitSource,\n type PageViewInput,\n type VisitEventName,\n type VisitStorage,\n} from \"./page-views\";\n\nexport {\n pageView,\n visitEvent,\n visitSource,\n type PageView,\n type PageViewInput,\n type VisitEvent,\n type VisitEventName,\n type VisitStorage,\n} from \"./page-views\";\n\n/**\n * Page-view details with an optional enabled flag. Browser session storage is supplied automatically.\n */\nexport type CountPageInput = Omit<PageViewInput, \"storage\"> & {\n enabled?: boolean;\n};\n\nlet counting = false;\n\nconst emptyStorage: VisitStorage = {\n getItem: () => null,\n setItem: () => undefined,\n};\n\nfunction session(): VisitStorage {\n try {\n return window.sessionStorage;\n } catch {\n return emptyStorage;\n }\n}\n\nfunction canSend(): boolean {\n return (\n typeof navigator !== \"undefined\" &&\n typeof navigator.sendBeacon === \"function\"\n );\n}\n\nfunction send(body: unknown): void {\n navigator.sendBeacon(\"/_zappie/view\", JSON.stringify(body));\n}\n\n/**\n * Record a page view in session storage and send it to /_zappie/view when sendBeacon is available.\n * Passing enabled: false disables this call and subsequent event counting until an enabled page is counted.\n */\nexport function countPage(input: CountPageInput): void {\n counting = false;\n if (input.enabled === false) {\n return;\n }\n const { enabled: _enabled, ...page } = input;\n // The visit is recorded even without a beacon, so checkout can still name its source.\n const view = pageView({ ...page, storage: session() });\n counting = true;\n if (canSend()) {\n send(view);\n }\n}\n\n/**\n * Send an add or bag event for the current path after countPage has enabled counting.\n * Does nothing without a browser window or sendBeacon support.\n */\nexport function countEvent(event: VisitEventName): void {\n if (!counting || typeof window === \"undefined\" || !canSend()) {\n return;\n }\n send(visitEvent(event, window.location.pathname, session()));\n}\n\n/**\n * Read visit attribution from browser session storage.\n * Returns empty source and campaign strings on the server or when no visit is stored.\n */\nexport function currentSource(): { source: string; campaign: string } {\n if (typeof window === \"undefined\") {\n return { source: \"\", campaign: \"\" };\n }\n return visitSource(session());\n}\n"]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/visits/index.ts"],
4
+ "sourcesContent": ["import {\n pageView,\n visitEvent,\n visitSource,\n type PageViewInput,\n type VisitEventName,\n type VisitStorage,\n} from \"./page-views\";\n\nexport {\n pageView,\n visitEvent,\n visitSource,\n type PageView,\n type PageViewInput,\n type VisitEvent,\n type VisitEventName,\n type VisitStorage,\n} from \"./page-views\";\n\n/**\n * Page-view details with an optional enabled flag. Browser session storage is supplied automatically.\n */\nexport type CountPageInput = Omit<PageViewInput, \"storage\"> & {\n enabled?: boolean;\n};\n\nlet counting = false;\n\nconst emptyStorage: VisitStorage = {\n getItem: () => null,\n setItem: () => undefined,\n};\n\nfunction session(): VisitStorage {\n try {\n return window.sessionStorage;\n } catch {\n return emptyStorage;\n }\n}\n\nfunction canSend(): boolean {\n return (\n typeof navigator !== \"undefined\" &&\n typeof navigator.sendBeacon === \"function\"\n );\n}\n\nfunction send(body: unknown): void {\n navigator.sendBeacon(\"/_zappie/view\", JSON.stringify(body));\n}\n\n/**\n * Record a page view in session storage and send it to /_zappie/view when sendBeacon is available.\n * Passing enabled: false disables this call and subsequent event counting until an enabled page is counted.\n */\nexport function countPage(input: CountPageInput): void {\n counting = false;\n if (input.enabled === false) {\n return;\n }\n const { enabled: _enabled, ...page } = input;\n // The visit is recorded even without a beacon, so checkout can still name its source.\n const view = pageView({ ...page, storage: session() });\n counting = true;\n if (canSend()) {\n send(view);\n }\n}\n\n/**\n * Send an add or bag event for the current path after countPage has enabled counting.\n * Does nothing without a browser window or sendBeacon support.\n */\nexport function countEvent(event: VisitEventName): void {\n if (!counting || typeof window === \"undefined\" || !canSend()) {\n return;\n }\n send(visitEvent(event, window.location.pathname, session()));\n}\n\n/**\n * Read visit attribution from browser session storage.\n * Returns empty source and campaign strings on the server or when no visit is stored.\n */\nexport function currentSource(): { source: string; campaign: string } {\n if (typeof window === \"undefined\") {\n return { source: \"\", campaign: \"\" };\n }\n return visitSource(session());\n}\n"],
5
+ "mappings": ";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAEP;AAAA,EACE,YAAAA;AAAA,EACA,cAAAC;AAAA,EACA,eAAAC;AAAA,OAMK;AASP,IAAI,WAAW;AAEf,IAAM,eAA6B;AAAA,EACjC,SAAS,MAAM;AAAA,EACf,SAAS,MAAM;AACjB;AAEA,SAAS,UAAwB;AAC/B,MAAI;AACF,WAAO,OAAO;AAAA,EAChB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAmB;AAC1B,SACE,OAAO,cAAc,eACrB,OAAO,UAAU,eAAe;AAEpC;AAEA,SAAS,KAAK,MAAqB;AACjC,YAAU,WAAW,iBAAiB,KAAK,UAAU,IAAI,CAAC;AAC5D;AAMO,SAAS,UAAU,OAA6B;AACrD,aAAW;AACX,MAAI,MAAM,YAAY,OAAO;AAC3B;AAAA,EACF;AACA,QAAM,EAAE,SAAS,UAAU,GAAG,KAAK,IAAI;AAEvC,QAAM,OAAO,SAAS,EAAE,GAAG,MAAM,SAAS,QAAQ,EAAE,CAAC;AACrD,aAAW;AACX,MAAI,QAAQ,GAAG;AACb,SAAK,IAAI;AAAA,EACX;AACF;AAMO,SAAS,WAAW,OAA6B;AACtD,MAAI,CAAC,YAAY,OAAO,WAAW,eAAe,CAAC,QAAQ,GAAG;AAC5D;AAAA,EACF;AACA,OAAK,WAAW,OAAO,OAAO,SAAS,UAAU,QAAQ,CAAC,CAAC;AAC7D;AAMO,SAAS,gBAAsD;AACpE,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,EAAE,QAAQ,IAAI,UAAU,GAAG;AAAA,EACpC;AACA,SAAO,YAAY,QAAQ,CAAC;AAC9B;",
6
+ "names": ["pageView", "visitEvent", "visitSource"]
7
+ }
@@ -0,0 +1,103 @@
1
+ // src/visits/page-views.ts
2
+ var VISIT_KEY = "zappie_visit";
3
+ function stored(storage) {
4
+ try {
5
+ const raw = storage.getItem(VISIT_KEY);
6
+ if (raw) {
7
+ return JSON.parse(raw);
8
+ }
9
+ return null;
10
+ } catch {
11
+ return null;
12
+ }
13
+ }
14
+ function save(storage, visit) {
15
+ try {
16
+ storage.setItem(VISIT_KEY, JSON.stringify(visit));
17
+ } catch {
18
+ }
19
+ }
20
+ function kindOf(path) {
21
+ if (path === "/") {
22
+ return "menu";
23
+ }
24
+ if (path.startsWith("/item/")) {
25
+ return "item";
26
+ }
27
+ if (path === "/cart") {
28
+ return "bag";
29
+ }
30
+ if (path === "/checkout") {
31
+ return "checkout";
32
+ }
33
+ if (path.startsWith("/checkout/")) {
34
+ return "payment";
35
+ }
36
+ if (path.startsWith("/orders")) {
37
+ return "order";
38
+ }
39
+ return "page";
40
+ }
41
+ function reached(storage, visit, kind) {
42
+ const steps = visit.steps ?? [];
43
+ if (steps.includes(kind)) {
44
+ return false;
45
+ }
46
+ visit.steps = [...steps, kind];
47
+ save(storage, visit);
48
+ return true;
49
+ }
50
+ function titleOf(title, storeName, path) {
51
+ const own = title.split(/\s+[·|–-]\s+/).filter((part) => part.trim() && part.trim() !== storeName).join(" \xB7 ").trim();
52
+ if (own) {
53
+ return own;
54
+ }
55
+ if (path === "/") {
56
+ return "Home";
57
+ }
58
+ return "";
59
+ }
60
+ function pageView(input) {
61
+ const { path, search, title, referrer, storeName, storage } = input;
62
+ const known = stored(storage);
63
+ let visit = known;
64
+ if (!visit) {
65
+ const query = new URLSearchParams(search);
66
+ visit = {
67
+ source: query.get("utm_source") || referrer,
68
+ campaign: query.get("utm_campaign") || ""
69
+ };
70
+ save(storage, visit);
71
+ }
72
+ return {
73
+ path,
74
+ title: titleOf(title, storeName, path),
75
+ source: visit.source,
76
+ campaign: visit.campaign,
77
+ new: known === null,
78
+ step: reached(storage, visit, kindOf(path))
79
+ };
80
+ }
81
+ function visitEvent(event, path, storage) {
82
+ const visit = stored(storage) ?? { source: "", campaign: "" };
83
+ return {
84
+ event,
85
+ path,
86
+ source: visit.source,
87
+ campaign: visit.campaign,
88
+ step: reached(storage, visit, event)
89
+ };
90
+ }
91
+ function visitSource(storage) {
92
+ const visit = stored(storage);
93
+ return {
94
+ source: visit?.source ?? "",
95
+ campaign: visit?.campaign ?? ""
96
+ };
97
+ }
98
+ export {
99
+ pageView,
100
+ visitEvent,
101
+ visitSource
102
+ };
103
+ //# sourceMappingURL=page-views.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/visits/page-views.ts"],
4
+ "sourcesContent": ["const VISIT_KEY = \"zappie_visit\";\n\n/**\n * The string storage interface used to retain visit attribution and reached steps.\n */\nexport type VisitStorage = {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n};\n\ntype Visit = { source: string; campaign: string; steps?: string[] };\n\n/**\n * A page-view payload with attribution and flags for a new visit and a newly reached page kind.\n */\nexport type PageView = {\n path: string;\n title: string;\n source: string;\n campaign: string;\n new: boolean;\n step: boolean;\n};\n\n/**\n * Supported visit events: adding an item or viewing the bag.\n */\nexport type VisitEventName = \"add\" | \"bag\";\n\n/**\n * A visit event with its path, attribution and whether this event is a new step.\n */\nexport type VisitEvent = {\n event: VisitEventName;\n path: string;\n source: string;\n campaign: string;\n step: boolean;\n};\n\n/**\n * Page location, title, referrer and store name plus the storage used to track the visit.\n */\nexport type PageViewInput = {\n path: string;\n search: string;\n title: string;\n referrer: string;\n storeName: string;\n storage: VisitStorage;\n};\n\nfunction stored(storage: VisitStorage): Visit | null {\n try {\n const raw = storage.getItem(VISIT_KEY);\n if (raw) {\n return JSON.parse(raw) as Visit;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nfunction save(storage: VisitStorage, visit: Visit): void {\n try {\n storage.setItem(VISIT_KEY, JSON.stringify(visit));\n } catch {\n // Without storage, each page is its own visit.\n }\n}\n\nfunction kindOf(path: string): string {\n if (path === \"/\") {\n return \"menu\";\n }\n if (path.startsWith(\"/item/\")) {\n return \"item\";\n }\n if (path === \"/cart\") {\n return \"bag\";\n }\n if (path === \"/checkout\") {\n return \"checkout\";\n }\n if (path.startsWith(\"/checkout/\")) {\n return \"payment\";\n }\n if (path.startsWith(\"/orders\")) {\n return \"order\";\n }\n return \"page\";\n}\n\nfunction reached(storage: VisitStorage, visit: Visit, kind: string): boolean {\n const steps = visit.steps ?? [];\n if (steps.includes(kind)) {\n return false;\n }\n visit.steps = [...steps, kind];\n save(storage, visit);\n return true;\n}\n\nfunction titleOf(title: string, storeName: string, path: string): string {\n const own = title\n .split(/\\s+[\u00B7|\u2013-]\\s+/)\n .filter((part) => part.trim() && part.trim() !== storeName)\n .join(\" \u00B7 \")\n .trim();\n if (own) {\n return own;\n }\n if (path === \"/\") {\n return \"Home\";\n }\n return \"\";\n}\n\n/**\n * Build a page-view payload and save visit attribution and reached steps in your storage.\n * On the first page, utm_source takes precedence over the referrer and utm_campaign supplies the campaign.\n *\n * @returns The payload with the store name removed from its title and visit/step flags. Does not send a request.\n */\nexport function pageView(input: PageViewInput): PageView {\n const { path, search, title, referrer, storeName, storage } = input;\n const known = stored(storage);\n let visit = known;\n if (!visit) {\n const query = new URLSearchParams(search);\n visit = {\n source: query.get(\"utm_source\") || referrer,\n campaign: query.get(\"utm_campaign\") || \"\",\n };\n save(storage, visit);\n }\n return {\n path,\n title: titleOf(title, storeName, path),\n source: visit.source,\n campaign: visit.campaign,\n new: known === null,\n step: reached(storage, visit, kindOf(path)),\n };\n}\n\n/**\n * Build a visit-event payload and record whether this event has already occurred in storage.\n * Uses stored attribution or empty strings. Does not send a request.\n */\nexport function visitEvent(\n event: VisitEventName,\n path: string,\n storage: VisitStorage,\n): VisitEvent {\n const visit = stored(storage) ?? { source: \"\", campaign: \"\" };\n return {\n event,\n path,\n source: visit.source,\n campaign: visit.campaign,\n step: reached(storage, visit, event),\n };\n}\n\n/**\n * Read the saved visit source and campaign from your storage, defaulting each to an empty string.\n */\nexport function visitSource(storage: VisitStorage): {\n source: string;\n campaign: string;\n} {\n const visit = stored(storage);\n return {\n source: visit?.source ?? \"\",\n campaign: visit?.campaign ?? \"\",\n };\n}\n"],
5
+ "mappings": ";AAAA,IAAM,YAAY;AAoDlB,SAAS,OAAO,SAAqC;AACnD,MAAI;AACF,UAAM,MAAM,QAAQ,QAAQ,SAAS;AACrC,QAAI,KAAK;AACP,aAAO,KAAK,MAAM,GAAG;AAAA,IACvB;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,KAAK,SAAuB,OAAoB;AACvD,MAAI;AACF,YAAQ,QAAQ,WAAW,KAAK,UAAU,KAAK,CAAC;AAAA,EAClD,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,OAAO,MAAsB;AACpC,MAAI,SAAS,KAAK;AAChB,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,SAAS,SAAS;AACpB,WAAO;AAAA,EACT;AACA,MAAI,SAAS,aAAa;AACxB,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,YAAY,GAAG;AACjC,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,SAAS,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,QAAQ,SAAuB,OAAc,MAAuB;AAC3E,QAAM,QAAQ,MAAM,SAAS,CAAC;AAC9B,MAAI,MAAM,SAAS,IAAI,GAAG;AACxB,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,CAAC,GAAG,OAAO,IAAI;AAC7B,OAAK,SAAS,KAAK;AACnB,SAAO;AACT;AAEA,SAAS,QAAQ,OAAe,WAAmB,MAAsB;AACvE,QAAM,MAAM,MACT,MAAM,cAAc,EACpB,OAAO,CAAC,SAAS,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,SAAS,EACzD,KAAK,QAAK,EACV,KAAK;AACR,MAAI,KAAK;AACP,WAAO;AAAA,EACT;AACA,MAAI,SAAS,KAAK;AAChB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAQO,SAAS,SAAS,OAAgC;AACvD,QAAM,EAAE,MAAM,QAAQ,OAAO,UAAU,WAAW,QAAQ,IAAI;AAC9D,QAAM,QAAQ,OAAO,OAAO;AAC5B,MAAI,QAAQ;AACZ,MAAI,CAAC,OAAO;AACV,UAAM,QAAQ,IAAI,gBAAgB,MAAM;AACxC,YAAQ;AAAA,MACN,QAAQ,MAAM,IAAI,YAAY,KAAK;AAAA,MACnC,UAAU,MAAM,IAAI,cAAc,KAAK;AAAA,IACzC;AACA,SAAK,SAAS,KAAK;AAAA,EACrB;AACA,SAAO;AAAA,IACL;AAAA,IACA,OAAO,QAAQ,OAAO,WAAW,IAAI;AAAA,IACrC,QAAQ,MAAM;AAAA,IACd,UAAU,MAAM;AAAA,IAChB,KAAK,UAAU;AAAA,IACf,MAAM,QAAQ,SAAS,OAAO,OAAO,IAAI,CAAC;AAAA,EAC5C;AACF;AAMO,SAAS,WACd,OACA,MACA,SACY;AACZ,QAAM,QAAQ,OAAO,OAAO,KAAK,EAAE,QAAQ,IAAI,UAAU,GAAG;AAC5D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ,MAAM;AAAA,IACd,UAAU,MAAM;AAAA,IAChB,MAAM,QAAQ,SAAS,OAAO,KAAK;AAAA,EACrC;AACF;AAKO,SAAS,YAAY,SAG1B;AACA,QAAM,QAAQ,OAAO,OAAO;AAC5B,SAAO;AAAA,IACL,QAAQ,OAAO,UAAU;AAAA,IACzB,UAAU,OAAO,YAAY;AAAA,EAC/B;AACF;",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zappie/sdk",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Typed, framework-agnostic client for Zappie menus, carts, checkout, auth and events.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -79,7 +79,8 @@
79
79
  "provenance": false
80
80
  },
81
81
  "files": [
82
- "dist"
82
+ "dist",
83
+ "CHANGELOG.md"
83
84
  ],
84
85
  "peerDependencies": {
85
86
  "react": "^18.2.0 || ^19.0.0"
@@ -100,8 +101,8 @@
100
101
  "url": "https://github.com/zappie/storefront/issues"
101
102
  },
102
103
  "scripts": {
103
- "build": "tsup && tsup --config tsup.checkout.config.ts && tsup --config tsup.customer.config.ts && tsup --config tsup.places.config.ts && tsup --config tsup.url.config.ts && tsup --config tsup.visits.config.ts && tsup --config tsup.site-config.config.ts && tsup --config tsup.template.config.ts",
104
+ "build": "tsup && tsup --config tsup.checkout.config.ts && tsup --config tsup.customer.config.ts && tsup --config tsup.places.config.ts && tsup --config tsup.url.config.ts && tsup --config tsup.visits.config.ts && tsup --config tsup.site-config.config.ts && tsup --config tsup.template.config.ts && node ../../scripts/release-packages/build-modules.mjs",
104
105
  "test": "vitest run --root ../.. packages/sdk/test",
105
- "size": "size-limit"
106
+ "size": "node ../../scripts/release-packages/size-sdk.mjs && size-limit"
106
107
  }
107
108
  }
@@ -1 +0,0 @@
1
- import {i as i$1,a,j,p,g,e}from'../chunk-I55A5QXJ.js';function d(){throw new a("server_error","Invalid quote response")}function i(c){return typeof c!="string"?d():c}function y(c){return Array.isArray(c)?c:d()}function M(c){let r=j(c);switch(r.action){case "remove_line":case "accept_price":case "remove_promo":case "change_address":return {action:r.action};case "choose_option":case "choose_other_option":return {action:r.action,groupId:i(r.group_id)};case "set_quantity":return !Number.isInteger(r.quantity)||Number(r.quantity)<1||Number(r.quantity)>99?d():{action:r.action,quantity:r.quantity};case "schedule":return {action:r.action,...r.next_open_at?{nextOpenAt:i(r.next_open_at)}:{},...r.slots?{slots:y(r.slots).map(i)}:{}};case "switch_fulfilment":{let t=y(r.types).map(i).filter(s=>["pickup","delivery","dine_in"].includes(s));return t.length?{action:r.action,types:t}:void 0}default:return}}var N=["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"];function A(c,r){let t=j(c);if(t.branch_id!==r||!Number.isFinite(Date.parse(i(t.expires_at))))return d();let s=p(t.subtotal),o=j(t.checkout);if(typeof t.can_checkout!="boolean"||typeof o.ready!="boolean"||o.reason!==void 0&&o.reason!=="issues"&&o.reason!=="customer_required")return d();let l=n=>{let e=p(n);return e.currency!==s.currency?d():e},q=n=>{let e=j(n);return {code:i(e.code),label:i(e.label),amount:l(e.amount)}},a=y(t.charges).map(q),p$1=y(t.discounts).map(q),w=l(t.total);if(g([...a,...p$1].map(n=>n.amount),s).amountMinor!==w.amountMinor)return d();let m=a.filter(n=>n.code==="delivery"),v=y(t.lines).map(n=>{let e=j(n);return (e.unit_price==null||e.line_total==null)&&t.lines_unpriced!==true?d():{lineId:i(e.line_id),unitPrice:e.unit_price==null?null:l(e.unit_price),total:e.line_total==null?null:l(e.line_total)}});return t.lines_unpriced!==true&&g(v.map(n=>n.total),e(0,s.currency)).amountMinor!==s.amountMinor?d():{lines:v,...t.lines_unpriced===true?{linesUnpriced:true}:{},subtotal:s,total:w,fees:a.filter(n=>n.code!=="delivery"),discounts:p$1,...m.length?{delivery:g(m.map(n=>n.amount),e(0,s.currency))}:{},menuVersion:i(t.menu_version),expiresAt:i(t.expires_at),issues:y(t.issues).flatMap(n=>{let e=j(n),h=i(e.code),g=i(e.severity),u=N.includes(h)&&["blocking","warning","info"].includes(g),k=y(e.fixes).map(M).filter(F=>F!==void 0),_=e.line_id?i(e.line_id):void 0;return !u&&(g==="warning"||g==="info")?(console.warn(`Zappie quote issue "${h}" is newer than this SDK and was skipped`),[]):[{code:u?h:"item_unavailable",severity:u?g:"blocking",message:i(e.message),source:"quote",..._?{lineId:_}:{},...e.group_id?{groupId:i(e.group_id)}:{},...e.data||!u?{data:{...e.data?j(e.data):{},...u?{}:{code:h}}}:{},fixes:!u&&!k.length&&_?[{action:"remove_line"}]:k}]}),canCheckout:t.can_checkout,checkout:{ready:o.ready,...o.reason!==void 0?{reason:o.reason}:{}}}}function E(c,r){let t,s=0,o,l,q=()=>{s++,t?.abort(),l=void 0;};return {cancel:q,async get(a$1,p,w){let m=JSON.stringify(a$1);if(!p&&o?.key===m&&Date.parse(o.quote.expiresAt)>Date.now())return w(o.quote),o.quote;if(!p&&l?.key===m)return l.promise;q();let v=s;t=new AbortController;let n=t.signal,e=(async()=>{let h=await i$1(m);n.throwIfAborted();let g=await c.quote({...r(),signal:n,idempotencyKey:h},a$1);n.throwIfAborted();let u=A(g,a$1.branch_id),k=new Set(u.lines.map(_=>_.lineId));if(k.size!==u.lines.length||u.lines.length!==a$1.lines.length||a$1.lines.some(_=>!k.has(_.line_id)))throw new a("server_error","Quote line identities do not match the cart");return v===s&&(o={key:m,quote:u},w(u)),u})();l={key:m,promise:e};try{return await e}finally{v===s&&(l=void 0);}},accept(a){o&&(o.quote={...o.quote,issues:o.quote.issues.filter(p=>!(p.code===a.code&&p.lineId===a.lineId))});}}}export{E as createQuoteClient};//# sourceMappingURL=quote.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/cart/quote-response.ts","../../src/cart/quote-client.ts"],"names":["fail","ZappieError","text","value","list","fix","v","record","types","t","codes","mapQuote","branchId","subtotal","mapMoney","checkout","amount","raw","result","charge","c","charges","discounts","total","sumMoney","deliveryCharges","lines","l","line","money","i","code","severity","known","fixes","f","lineId","createQuoteClient","transport","context","controller","sequence","cached","flight","cancel","body","force","apply","key","seq","signal","promise","idempotencyKey","payloadKey","quote","ids","issue"],"mappings":"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","file":"quote.js","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","import { ZappieError } from \"../errors\";\nimport { payloadKey } from \"../internal/digest\";\nimport type { RequestCtx, Transport } from \"../transport/types\";\nimport { mapQuote } from \"./quote-response\";\nimport type { Quote, QuoteRequest } from \"./types\";\nexport function createQuoteClient(\n transport: Transport,\n context: () => RequestCtx,\n) {\n let controller: AbortController | undefined;\n let sequence = 0;\n let cached: { key: string; quote: Quote } | undefined;\n let flight: { key: string; promise: Promise<Quote> } | undefined;\n const cancel = () => {\n sequence++;\n controller?.abort();\n flight = undefined;\n };\n return {\n cancel,\n async get(\n body: QuoteRequest,\n force: boolean,\n apply: (quote: Quote) => void,\n ): Promise<Quote> {\n const key = JSON.stringify(body);\n if (\n !force &&\n cached?.key === key &&\n Date.parse(cached.quote.expiresAt) > Date.now()\n ) {\n apply(cached.quote);\n return cached.quote;\n }\n if (!force && flight?.key === key) {\n return flight.promise;\n }\n cancel();\n const seq = sequence;\n controller = new AbortController();\n const signal = controller.signal;\n const promise = (async () => {\n const idempotencyKey = await payloadKey(key);\n signal.throwIfAborted();\n const raw = await transport.quote(\n { ...context(), signal, idempotencyKey },\n body,\n );\n signal.throwIfAborted();\n const quote = mapQuote(raw, body.branch_id);\n const ids = new Set(quote.lines.map((line) => line.lineId));\n if (\n ids.size !== quote.lines.length ||\n quote.lines.length !== body.lines.length ||\n body.lines.some((line) => !ids.has(line.line_id))\n ) {\n throw new ZappieError(\n \"server_error\",\n \"Quote line identities do not match the cart\",\n );\n }\n if (seq === sequence) {\n cached = { key, quote };\n apply(quote);\n }\n return quote;\n })();\n flight = { key, promise };\n try {\n return await promise;\n } finally {\n if (seq === sequence) {\n flight = undefined;\n }\n }\n },\n accept(issue: CartIssueForAcceptance) {\n if (cached) {\n cached.quote = {\n ...cached.quote,\n issues: cached.quote.issues.filter(\n (i) => !(i.code === issue.code && i.lineId === issue.lineId),\n ),\n };\n }\n },\n };\n}\ntype CartIssueForAcceptance = { code: string; lineId?: string };\n\nexport type QuoteClient = ReturnType<typeof createQuoteClient>;\n"]}
@@ -1,2 +0,0 @@
1
- var D=["network_error","timeout","rate_limited","unauthorized","forbidden_origin","not_found","store_not_found","branch_not_found","item_not_found","cart_invalid","invalid_request","version_unsupported","server_error"],u=class extends Error{constructor(r,s,t={}){super(s,{cause:t.cause});this.code=r;this.name="ZappieError",t.status!==void 0&&(this.status=t.status),t.param!==void 0&&(this.param=t.param),t.requestId!==void 0&&(this.requestId=t.requestId),this.docUrl=t.docUrl??`https://docs.zappie.ai/errors#${r}`,this.retryable=t.retryable??["network_error","timeout","rate_limited","server_error"].includes(r);}};function N(n){return n instanceof u}function j(n){return N(n)?n:new u("network_error","The storefront request failed",{cause:n})}function V(n,e,r){let s=n&&typeof n=="object"?n:{},t=s.error&&typeof s.error=="object"?s.error:{},p=e===401?"unauthorized":e===403?"forbidden_origin":e===404?"not_found":e===429?"rate_limited":e>=500?"server_error":"invalid_request",o=typeof t.code=="string"&&D.includes(t.code),m=o?t.code:t.code?"server_error":p,a=typeof t.message=="string"?t.message:"The storefront request failed";return new u(m,!o&&t.code?`${String(t.code)}: ${a}`:a,{status:e,...r?{requestId:r}:{},...typeof t.param=="string"?{param:t.param}:{},...typeof t.doc_url=="string"?{docUrl:t.doc_url}:{}})}var R=" AFN ALL BIF CLP DJF GNF IQD IRR ISK JPY KMF KPW KRW LAK LBP MGA MMK PYG RSD RWF SLL SOS SYP UGX UYI VND VUV XAF XOF XPF YER ",A=" BHD JOD KWD LYD OMR TND ",F=" CLF UYW ",T=" BOV CHE CHW CLF COU MXV USN UYI UYW VED ",k=(n,e)=>n.includes(` ${e} `),C;function U(n){return /^[A-Z]{3}$/.test(n)?typeof Intl.supportedValuesOf!="function"?true:(C??(C=new Set(Intl.supportedValuesOf("currency"))),k(T,n)||C.has(n)):false}function G(n){return k(R,n)?0:k(A,n)?3:k(F,n)?4:2}function y(n,e){let r=typeof e=="string"?e.trim().toUpperCase():"";if(!Number.isSafeInteger(n)||!U(r))throw new u("invalid_request","Money requires safe integer minor units and a valid ISO 4217 currency");return Object.freeze({amountMinor:n,currency:r})}var H={money(n,e={}){let r=y(n.amountMinor,n.currency),s=r.currency==="NGN"?"en-NG":"en",t=G(r.currency);return new Intl.NumberFormat(s,{style:"currency",currency:r.currency,currencyDisplay:"narrowSymbol",minimumFractionDigits:e.showZeroDecimals||r.amountMinor%10**t!==0?t:0,maximumFractionDigits:t,notation:e.compact?"compact":"standard",signDisplay:e.sign??"auto"}).format(r.amountMinor/10**t)}};function J(n,e){let r=e.amountMinor;for(let s of n){if(s.currency!==e.currency)throw new u("invalid_request","Cannot combine different currencies");r=y(r+s.amountMinor,e.currency).amountMinor;}return y(r,e.currency)}function Q(n,e){if(!Number.isSafeInteger(e))throw new u("invalid_request","Money requires an integer quantity");return y(n.amountMinor*e,n.currency)}async function ne(n){let e=await globalThis.crypto.subtle.digest("SHA-256",new TextEncoder().encode(n));return Array.from(new Uint8Array(e),r=>r.toString(16).padStart(2,"0")).join("")}var g=class extends Error{};function c(n){if(!n||typeof n!="object"||Array.isArray(n))throw new u("server_error","Invalid storefront response object");return n}function i(n){if(typeof n!="string")throw new u("server_error","Invalid storefront response string");return n}function l(n){if(!Array.isArray(n))throw new u("server_error","Invalid storefront response list");return n}function _(n){if(typeof n!="number"||!Number.isFinite(n))throw new u("server_error","Invalid storefront response number");return n}function h(n){let e=_(n);if(e<0)throw new u("server_error","Negative selection or quantity bound");return e}function E(n){let e=c(n),r=h(e.min);if(e.max==null)return {min:r};let s=h(e.max);if(s<r)throw new u("server_error","Maximum quantity is below its minimum");return {min:r,max:s}}var v=n=>typeof n=="string",w=n=>typeof n=="boolean";function f(n,e,r){return r(e)?{[n]:e}:{}}function b(n){let e=c(n);return y(_(e.amount_minor??e.amountMinor),i(e.currency))}function Z(n){return l(n??[]).map(e=>{let r=c(e),s=_(r.day);if(!Number.isInteger(s)||s<0||s>6)throw new u("server_error","Invalid opening day");return {day:s,opens:i(r.opens??r.open??r.start),closes:i(r.closes??r.close??r.end),...f("disabled",r.disabled,w)}})}function K(n){if(n===void 0)return;let e=c(n);return {openingTimes:Z(e.opening_times??e.openingTimes??e.hours??[]),...f("preorder",e.preorder,w),...e.preorder_notice_hours!==void 0?{preorderNoticeHours:_(e.preorder_notice_hours)}:{},...e.preorder_max_days!==void 0?{preorderMaxDays:_(e.preorder_max_days)}:{}}}function L(n){let e=c(n),r=c(e.selection??{min:e.min??0,max:e.max}),s=e.is_attribute===true,t=i(e.kind??"select");if(!["select","text","number","date","time","toggle"].includes(t))throw new g(`option input kind "${t}"`);return {id:i(e.id),name:i(e.name),kind:t,required:typeof e.required=="boolean"?e.required:_(r.min)>0,selection:E(r),isAttribute:s,choices:l(e.choices??[]).map(p=>{let o=c(p),m=b(o.price);return {id:i(o.id),name:i(o.name),price:s?y(0,m.currency):m,...s&&o.price_hint!==void 0?{priceHint:b(o.price_hint)}:{},isAvailable:(o.is_available??o.available)===true,...o.quantity?{quantity:E(o.quantity)}:{}}}),...f("helpText",e.help_text,v),...e.input?{input:{...c(e.input).max_length!==void 0?{maxLength:_(c(e.input).max_length)}:{},...typeof c(e.input).placeholder=="string"?{placeholder:i(c(e.input).placeholder)}:{}}}:{},...f("isAvailable",e.is_available,w),...f("isInformational",e.is_informational,w),...e.conditions?{conditions:l(e.conditions).map(p=>{let o=c(p),m=o.count?c(o.count):void 0;if(m&&!["eq","gte","lte"].includes(i(m.op)))throw new g(`option count operator "${i(m.op)}"`);if(o.match!==void 0&&o.match!=="any"&&o.match!=="all")throw new g(`option match operator "${String(o.match)}"`);if(o.set_required!=null&&typeof o.set_required!="boolean")throw new u("server_error","Invalid conditional required flag");return {groupId:i(o.group_id),choiceIds:l(o.choice_ids??[]).map(i),match:o.match==="all"?"all":"any",...m?{count:{op:i(m.op),value:h(m.value)}}:{},...o.set_required!==void 0?{setRequired:o.set_required}:{},...o.set_min!==void 0?{setMin:o.set_min===null?null:h(o.set_min)}:{},...o.set_max!==void 0?{setMax:o.set_max===null?null:h(o.set_max)}:{}}})}:{}}}function P(n){let e=c(n);return {name:i(e.name)}}function $(n){let e=c(n),r=i(e.id),s=[],t=false;for(let a of l(e.option_groups??[]))try{s.push(L(a));}catch(d){if(!(d instanceof g))throw d;t=true,console.warn(`Zappie item ${r} uses an ${d.message} this SDK can't validate; it is shown as unavailable`);}let p=l(e.variants).map(a=>{let d=c(a);return {id:i(d.id),attributeChoices:Object.fromEntries(Object.entries(c(d.attribute_choices??{})).map(([x,q])=>[x,i(q)])),price:b(d.price),...f("lowStock",d.low_stock,w),isAvailable:!t&&(d.is_available??d.available)===true}});if(!p.length)throw new u("server_error","An item must carry at least one exact variant");let o=c(e.quantity??{min:1,step:1,max:e.max_quantity}),m=_(o.step);if(m<=0||new Set(p.map(a=>a.id)).size!==p.length)throw new u("server_error","Invalid quantity step or duplicate variant identity");return {...e.placements!==void 0?{placements:l(e.placements).map(a=>{let d=c(a);return {menuId:i(d.menu_id),categoryId:i(d.category_id)}})}:{},id:r,name:i(e.name),images:l(e.images??[]).map(i),price:b(e.price),isAvailable:!t&&(e.is_available??e.available)===true,quantity:{...E(o),step:m},variants:p,optionGroups:s,tags:l(e.tags??[]).map(i),...f("stockLabel",e.stock_label,v),...e.promo!==void 0?{promo:P(e.promo)}:{},...f("description",e.description,v),...e.compare_at_price?{compareAtPrice:b(e.compare_at_price)}:{}}}function ie(n,e){let r=c(n),s=l(r.menus??[r]);if(r.completeness!==void 0&&r.completeness!=="partial"&&r.completeness!=="complete")throw new u("server_error","Invalid catalogue completeness");let t=new Map,p=s.map(m=>{let a=c(m);if(a.placement_count!==void 0&&(!Number.isSafeInteger(a.placement_count)||Number(a.placement_count)<0)||a.paginated!==void 0&&typeof a.paginated!="boolean")throw new u("server_error","Invalid menu loading metadata");let d=l(a.categories??[]).map(q=>{let I=c(q),M=i(I.id),S=t.get(M),O=[...new Set([...S?.itemIds??[],...l(I.item_ids??[]).map(i)])];return t.set(M,{id:M,name:i(I.name),itemIds:O,...f("description",I.description,v)}),M}),x=K(a.schedule);return {id:i(a.id),name:i(a.name),categoryIds:d,...a.placement_count!==void 0?{placementCount:a.placement_count}:{},...f("paginated",a.paginated,w),...x?{schedule:x}:{},...f("infoBanner",a.info_banner,v)}}),o=Object.fromEntries(Object.entries(c(r.items)).map(([m,a])=>{let d=$(a);if(d.id!==m)throw new u("server_error","Item map key does not match its identity");return [m,d]}));if(r.branch_id!==void 0&&r.branch_id!==e)throw new u("server_error","Menu branch mismatch");return {id:p.length===1?p[0].id:`branch:${e}`,branchId:e,...r.completeness==="partial"?{completeness:"partial"}:{},name:p.length===1?p[0].name:"Catalogue",version:i(r.menu_version??r.version),categories:[...t.values()],items:o,menus:p,...p.length===1&&p[0].schedule?{schedule:p[0].schedule}:{}}}
2
- export{u as a,N as b,j as c,V as d,y as e,H as f,J as g,Q as h,ne as i,c as j,i as k,l,v as m,w as n,f as o,b as p,Z as q,$ as r,ie as s};//# sourceMappingURL=chunk-I55A5QXJ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/money.ts","../src/internal/money-math.ts","../src/internal/digest.ts","../src/transport/mappers.ts"],"names":["codes","ZappieError","code","message","details","isZappieError","error","asError","wireError","value","status","requestId","envelope","e","fallback","known","ZERO_DIGIT_CURRENCIES","THREE_DIGIT_CURRENCIES","FOUR_DIGIT_CURRENCIES","API_ONLY_CURRENCIES","contains","currency","intlCurrencies","isCurrency","currencyDigits","money","amountMinor","normalized","format","opts","locale","digits","sumMoney","values","zero","amount","multiplyMoney","quantity","payloadKey","payload","digest","byte","UnsupportedValue","record","text","list","number","nonnegative","result","bounds","input","min","max","isString","isBoolean","opt","key","is","mapMoney","v","hours","slot","day","schedule","mapGroup","g","selection","isAttribute","kind","raw","c","price","count","mapPromo","p","mapItem","id","optionGroups","unsupported","variants","x","k","step","variant","placement","mapMenu","branchId","sources","categories","menus","m","categoryIds","rawCategory","previous","itemIds","s","items","item","mapped"],"mappings":"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","file":"chunk-I55A5QXJ.js","sourcesContent":["/** Stable public error codes. */\nexport type ZappieErrorCode =\n | \"network_error\"\n | \"timeout\"\n | \"rate_limited\"\n | \"unauthorized\"\n | \"forbidden_origin\"\n | \"not_found\"\n | \"store_not_found\"\n | \"branch_not_found\"\n | \"item_not_found\"\n | \"cart_invalid\"\n | \"invalid_request\"\n | \"version_unsupported\"\n | \"server_error\";\nconst codes: readonly string[] = [\n \"network_error\",\n \"timeout\",\n \"rate_limited\",\n \"unauthorized\",\n \"forbidden_origin\",\n \"not_found\",\n \"store_not_found\",\n \"branch_not_found\",\n \"item_not_found\",\n \"cart_invalid\",\n \"invalid_request\",\n \"version_unsupported\",\n \"server_error\",\n];\n/** Context attached to an SDK failure. */\nexport type ErrorDetails = {\n status?: number;\n param?: string;\n docUrl?: string;\n requestId?: string;\n retryable?: boolean;\n cause?: unknown;\n};\n/** An SDK error you can handle by its stable code. */\nexport class ZappieError extends Error {\n readonly status?: number;\n readonly param?: string;\n readonly docUrl: string;\n readonly requestId?: string;\n readonly retryable: boolean;\n constructor(\n readonly code: ZappieErrorCode,\n message: string,\n details: ErrorDetails = {},\n ) {\n super(message, { cause: details.cause });\n this.name = \"ZappieError\";\n if (details.status !== undefined) {\n this.status = details.status;\n }\n if (details.param !== undefined) {\n this.param = details.param;\n }\n if (details.requestId !== undefined) {\n this.requestId = details.requestId;\n }\n this.docUrl = details.docUrl ?? `https://docs.zappie.ai/errors#${code}`;\n this.retryable =\n details.retryable ??\n [\"network_error\", \"timeout\", \"rate_limited\", \"server_error\"].includes(\n code,\n );\n }\n}\n/** Check whether a thrown value is a ZappieError. */\nexport function isZappieError(error: unknown): error is ZappieError {\n return error instanceof ZappieError;\n}\nexport function asError(error: unknown): ZappieError {\n return isZappieError(error)\n ? error\n : new ZappieError(\"network_error\", \"The storefront request failed\", {\n cause: error,\n });\n}\nexport function wireError(\n value: unknown,\n status: number,\n requestId?: string,\n): ZappieError {\n const envelope =\n value && typeof value === \"object\"\n ? (value as Record<string, unknown>)\n : {};\n const e =\n envelope.error && typeof envelope.error === \"object\"\n ? (envelope.error as Record<string, unknown>)\n : {};\n const fallback =\n status === 401\n ? \"unauthorized\"\n : status === 403\n ? \"forbidden_origin\"\n : status === 404\n ? \"not_found\"\n : status === 429\n ? \"rate_limited\"\n : status >= 500\n ? \"server_error\"\n : \"invalid_request\";\n const known = typeof e.code === \"string\" && codes.includes(e.code);\n const code = known\n ? (e.code as ZappieErrorCode)\n : e.code\n ? \"server_error\"\n : fallback;\n const message =\n typeof e.message === \"string\" ? e.message : \"The storefront request failed\";\n return new ZappieError(\n code,\n !known && e.code ? `${String(e.code)}: ${message}` : message,\n {\n status,\n ...(requestId ? { requestId } : {}),\n ...(typeof e.param === \"string\" ? { param: e.param } : {}),\n ...(typeof e.doc_url === \"string\" ? { docUrl: e.doc_url } : {}),\n },\n );\n}\n","import { ZappieError } from \"./errors\";\ndeclare const MoneyBrand: unique symbol;\n/** A normalized ISO 4217 currency code. */\nexport type Currency = string;\n// Minor-unit digits match the API, which scales amount_minor with\n// github.com/bojanz/currency v1.2.0 (pkg/currency.Digits). Intl differs for COP,\n// HUF, IDR, PKR and RSD, so it only presents the amount. Unlisted codes use 2.\nconst ZERO_DIGIT_CURRENCIES =\n \" AFN ALL BIF CLP DJF GNF IQD IRR ISK JPY KMF KPW KRW LAK LBP MGA MMK PYG RSD RWF SLL SOS SYP UGX UYI VND VUV XAF XOF XPF YER \";\nconst THREE_DIGIT_CURRENCIES = \" BHD JOD KWD LYD OMR TND \";\nconst FOUR_DIGIT_CURRENCIES = \" CLF UYW \";\n// API codes that Intl.supportedValuesOf(\"currency\") doesn't list.\nconst API_ONLY_CURRENCIES = \" BOV CHE CHW CLF COU MXV USN UYI UYW VED \";\nconst contains = (codes: string, currency: string) =>\n codes.includes(` ${currency} `);\nlet intlCurrencies: Set<string> | undefined;\nfunction isCurrency(code: string): boolean {\n if (!/^[A-Z]{3}$/.test(code)) {\n return false;\n }\n if (typeof Intl.supportedValuesOf !== \"function\") {\n return true;\n }\n intlCurrencies ??= new Set(Intl.supportedValuesOf(\"currency\"));\n return contains(API_ONLY_CURRENCIES, code) || intlCurrencies.has(code);\n}\nfunction currencyDigits(currency: Currency): number {\n if (contains(ZERO_DIGIT_CURRENCIES, currency)) {\n return 0;\n }\n if (contains(THREE_DIGIT_CURRENCIES, currency)) {\n return 3;\n }\n return contains(FOUR_DIGIT_CURRENCIES, currency) ? 4 : 2;\n}\n/** A frozen amount in safe integer minor units. Create it with money(). */\nexport type Money = {\n readonly amountMinor: number;\n readonly currency: Currency;\n readonly [MoneyBrand]: true;\n};\n/** Validate an amount in minor units and freeze it without rounding. */\nexport function money(amountMinor: number, currency: Currency): Money {\n const normalized =\n typeof currency === \"string\" ? currency.trim().toUpperCase() : \"\";\n if (!Number.isSafeInteger(amountMinor) || !isCurrency(normalized)) {\n throw new ZappieError(\n \"invalid_request\",\n \"Money requires safe integer minor units and a valid ISO 4217 currency\",\n );\n }\n return Object.freeze({ amountMinor, currency: normalized }) as Money;\n}\n/** Currency presentation options. */\nexport type MoneyFormatOptions = {\n showZeroDecimals?: boolean;\n compact?: boolean;\n sign?: \"auto\" | \"always\";\n};\n/** Format amounts for display. Use server quotes for final prices. */\nexport interface Formatters {\n money(value: Money, opts?: MoneyFormatOptions): string;\n}\n/** Format money with currency-specific minor units and locale defaults. */\nexport const format: Formatters = {\n money(value, opts = {}) {\n const normalized = money(value.amountMinor, value.currency);\n const locale = normalized.currency === \"NGN\" ? \"en-NG\" : \"en\";\n const digits = currencyDigits(normalized.currency);\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency: normalized.currency,\n currencyDisplay: \"narrowSymbol\",\n minimumFractionDigits:\n opts.showZeroDecimals || normalized.amountMinor % 10 ** digits !== 0\n ? digits\n : 0,\n maximumFractionDigits: digits,\n notation: opts.compact ? \"compact\" : \"standard\",\n signDisplay: opts.sign ?? \"auto\",\n }).format(normalized.amountMinor / 10 ** digits);\n },\n};\n","import { ZappieError } from \"../errors\";\nimport type { Money } from \"../money\";\nimport { money } from \"../money\";\nexport function sumMoney(values: readonly Money[], zero: Money): Money {\n let amount = zero.amountMinor;\n for (const value of values) {\n if (value.currency !== zero.currency) {\n throw new ZappieError(\n \"invalid_request\",\n \"Cannot combine different currencies\",\n );\n }\n amount = money(amount + value.amountMinor, zero.currency).amountMinor;\n }\n return money(amount, zero.currency);\n}\nexport function multiplyMoney(value: Money, quantity: number): Money {\n if (!Number.isSafeInteger(quantity)) {\n throw new ZappieError(\n \"invalid_request\",\n \"Money requires an integer quantity\",\n );\n }\n return money(value.amountMinor * quantity, value.currency);\n}\n","/** Payload digests avoid putting notes, addresses or credentials in request headers. */\nexport async function payloadKey(payload: string): Promise<string> {\n const digest = await globalThis.crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(payload),\n );\n return Array.from(new Uint8Array(digest), (byte) =>\n byte.toString(16).padStart(2, \"0\"),\n ).join(\"\");\n}\n","import { ZappieError } from \"../errors\";\nimport type {\n Item,\n Menu,\n MenuSchedule,\n OpeningTime,\n OptionGroup,\n Variant,\n} from \"../models\";\nimport type { Currency, Money } from \"../money\";\nimport { money } from \"../money\";\n/** A value newer than this SDK; the item that carries it is shown as unavailable. */\nclass UnsupportedValue extends Error {}\nexport function record(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new ZappieError(\"server_error\", \"Invalid storefront response object\");\n }\n return value as Record<string, unknown>;\n}\nexport function text(value: unknown): string {\n if (typeof value !== \"string\") {\n throw new ZappieError(\"server_error\", \"Invalid storefront response string\");\n }\n return value;\n}\nexport function list(value: unknown): unknown[] {\n if (!Array.isArray(value)) {\n throw new ZappieError(\"server_error\", \"Invalid storefront response list\");\n }\n return value;\n}\nfunction number(value: unknown): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new ZappieError(\"server_error\", \"Invalid storefront response number\");\n }\n return value;\n}\nfunction nonnegative(value: unknown): number {\n const result = number(value);\n if (result < 0) {\n throw new ZappieError(\n \"server_error\",\n \"Negative selection or quantity bound\",\n );\n }\n return result;\n}\nfunction bounds(value: unknown): { min: number; max?: number } {\n const input = record(value);\n const min = nonnegative(input.min);\n if (input.max == null) {\n return { min };\n }\n const max = nonnegative(input.max);\n if (max < min) {\n throw new ZappieError(\n \"server_error\",\n \"Maximum quantity is below its minimum\",\n );\n }\n return { min, max };\n}\nexport const isString = (value: unknown): value is string =>\n typeof value === \"string\";\nexport const isBoolean = (value: unknown): value is boolean =>\n typeof value === \"boolean\";\n/** `{ [key]: value }` when the value passes the guard, otherwise `{}`, for optional wire fields. */\nexport function opt<K extends string, T>(\n key: K,\n value: unknown,\n is: (value: unknown) => value is T,\n): { [P in K]?: T } {\n return is(value) ? ({ [key]: value } as { [P in K]?: T }) : {};\n}\nexport function mapMoney(value: unknown): Money {\n const v = record(value);\n return money(\n number(v.amount_minor ?? v.amountMinor),\n text(v.currency) as Currency,\n );\n}\nexport function hours(value: unknown): OpeningTime[] {\n return list(value ?? []).map((slot) => {\n const v = record(slot);\n const day = number(v.day);\n if (!Number.isInteger(day) || day < 0 || day > 6) {\n throw new ZappieError(\"server_error\", \"Invalid opening day\");\n }\n return {\n day: day as OpeningTime[\"day\"],\n opens: text(v.opens ?? v.open ?? v.start),\n closes: text(v.closes ?? v.close ?? v.end),\n ...opt(\"disabled\", v.disabled, isBoolean),\n };\n });\n}\nfunction schedule(value: unknown): MenuSchedule | undefined {\n if (value === undefined) {\n return undefined;\n }\n const v = record(value);\n return {\n openingTimes: hours(v.opening_times ?? v.openingTimes ?? v.hours ?? []),\n ...opt(\"preorder\", v.preorder, isBoolean),\n ...(v.preorder_notice_hours !== undefined\n ? { preorderNoticeHours: number(v.preorder_notice_hours) }\n : {}),\n ...(v.preorder_max_days !== undefined\n ? { preorderMaxDays: number(v.preorder_max_days) }\n : {}),\n };\n}\nfunction mapGroup(value: unknown): OptionGroup {\n const g = record(value);\n const selection = record(g.selection ?? { min: g.min ?? 0, max: g.max });\n const isAttribute = g.is_attribute === true;\n const kind = text(g.kind ?? \"select\");\n if (![\"select\", \"text\", \"number\", \"date\", \"time\", \"toggle\"].includes(kind)) {\n throw new UnsupportedValue(`option input kind \"${kind}\"`);\n }\n return {\n id: text(g.id),\n name: text(g.name),\n kind: kind as OptionGroup[\"kind\"],\n required:\n typeof g.required === \"boolean\" ? g.required : number(selection.min) > 0,\n selection: bounds(selection),\n isAttribute,\n choices: list(g.choices ?? []).map((raw) => {\n const c = record(raw);\n const price = mapMoney(c.price);\n return {\n id: text(c.id),\n name: text(c.name),\n price: isAttribute ? money(0, price.currency) : price,\n ...(isAttribute && c.price_hint !== undefined\n ? { priceHint: mapMoney(c.price_hint) }\n : {}),\n isAvailable: (c.is_available ?? c.available) === true,\n ...(c.quantity ? { quantity: bounds(c.quantity) } : {}),\n };\n }),\n ...opt(\"helpText\", g.help_text, isString),\n ...(g.input\n ? {\n input: {\n ...(record(g.input).max_length !== undefined\n ? { maxLength: number(record(g.input).max_length) }\n : {}),\n ...(typeof record(g.input).placeholder === \"string\"\n ? { placeholder: text(record(g.input).placeholder) }\n : {}),\n },\n }\n : {}),\n ...opt(\"isAvailable\", g.is_available, isBoolean),\n ...opt(\"isInformational\", g.is_informational, isBoolean),\n ...(g.conditions\n ? {\n conditions: list(g.conditions).map((raw) => {\n const c = record(raw);\n const count = c.count ? record(c.count) : undefined;\n if (count && ![\"eq\", \"gte\", \"lte\"].includes(text(count.op))) {\n throw new UnsupportedValue(\n `option count operator \"${text(count.op)}\"`,\n );\n }\n if (\n c.match !== undefined &&\n c.match !== \"any\" &&\n c.match !== \"all\"\n ) {\n throw new UnsupportedValue(\n `option match operator \"${String(c.match)}\"`,\n );\n }\n if (c.set_required != null && typeof c.set_required !== \"boolean\") {\n throw new ZappieError(\n \"server_error\",\n \"Invalid conditional required flag\",\n );\n }\n return {\n groupId: text(c.group_id),\n choiceIds: list(c.choice_ids ?? []).map(text),\n match: c.match === \"all\" ? (\"all\" as const) : (\"any\" as const),\n ...(count\n ? {\n count: {\n op: text(count.op) as \"eq\" | \"gte\" | \"lte\",\n value: nonnegative(count.value),\n },\n }\n : {}),\n ...(c.set_required !== undefined\n ? { setRequired: c.set_required as boolean | null }\n : {}),\n ...(c.set_min !== undefined\n ? { setMin: c.set_min === null ? null : nonnegative(c.set_min) }\n : {}),\n ...(c.set_max !== undefined\n ? { setMax: c.set_max === null ? null : nonnegative(c.set_max) }\n : {}),\n };\n }),\n }\n : {}),\n };\n}\nfunction mapPromo(value: unknown): NonNullable<Item[\"promo\"]> {\n const p = record(value);\n return { name: text(p.name) };\n}\nexport function mapItem(value: unknown): Item {\n const v = record(value);\n const id = text(v.id);\n const optionGroups: OptionGroup[] = [];\n let unsupported = false;\n for (const raw of list(v.option_groups ?? [])) {\n try {\n optionGroups.push(mapGroup(raw));\n } catch (error) {\n if (!(error instanceof UnsupportedValue)) {\n throw error;\n }\n unsupported = true;\n console.warn(\n `Zappie item ${id} uses an ${error.message} this SDK can't validate; it is shown as unavailable`,\n );\n }\n }\n const variants = list(v.variants).map((raw) => {\n const x = record(raw);\n return {\n id: text(x.id),\n attributeChoices: Object.fromEntries(\n Object.entries(record(x.attribute_choices ?? {})).map(([k, v]) => [\n k,\n text(v),\n ]),\n ),\n price: mapMoney(x.price),\n ...opt(\"lowStock\", x.low_stock, isBoolean),\n isAvailable: !unsupported && (x.is_available ?? x.available) === true,\n };\n });\n if (!variants.length) {\n throw new ZappieError(\n \"server_error\",\n \"An item must carry at least one exact variant\",\n );\n }\n const quantity = record(\n v.quantity ?? { min: 1, step: 1, max: v.max_quantity },\n );\n const step = number(quantity.step);\n if (\n step <= 0 ||\n new Set(variants.map((variant) => variant.id)).size !== variants.length\n ) {\n throw new ZappieError(\n \"server_error\",\n \"Invalid quantity step or duplicate variant identity\",\n );\n }\n return {\n ...(v.placements !== undefined\n ? {\n placements: list(v.placements).map((raw) => {\n const placement = record(raw);\n return {\n menuId: text(placement.menu_id),\n categoryId: text(placement.category_id),\n };\n }),\n }\n : {}),\n id,\n name: text(v.name),\n images: list(v.images ?? []).map(text),\n price: mapMoney(v.price),\n isAvailable: !unsupported && (v.is_available ?? v.available) === true,\n quantity: { ...bounds(quantity), step },\n variants: variants as [Variant, ...Variant[]],\n optionGroups,\n tags: list(v.tags ?? []).map(text),\n ...opt(\"stockLabel\", v.stock_label, isString),\n ...(v.promo !== undefined ? { promo: mapPromo(v.promo) } : {}),\n ...opt(\"description\", v.description, isString),\n ...(v.compare_at_price\n ? { compareAtPrice: mapMoney(v.compare_at_price) }\n : {}),\n };\n}\nexport function mapMenu(value: unknown, branchId: string): Menu {\n const v = record(value);\n const sources = list(v.menus ?? [v]);\n if (\n v.completeness !== undefined &&\n v.completeness !== \"partial\" &&\n v.completeness !== \"complete\"\n ) {\n throw new ZappieError(\"server_error\", \"Invalid catalogue completeness\");\n }\n const categories = new Map<string, Menu[\"categories\"][number]>();\n const menus = sources.map((raw) => {\n const m = record(raw);\n if (\n (m.placement_count !== undefined &&\n (!Number.isSafeInteger(m.placement_count) ||\n Number(m.placement_count) < 0)) ||\n (m.paginated !== undefined && typeof m.paginated !== \"boolean\")\n ) {\n throw new ZappieError(\"server_error\", \"Invalid menu loading metadata\");\n }\n const categoryIds = list(m.categories ?? []).map((rawCategory) => {\n const c = record(rawCategory);\n const id = text(c.id);\n const previous = categories.get(id);\n const itemIds = [\n ...new Set([\n ...(previous?.itemIds ?? []),\n ...list(c.item_ids ?? []).map(text),\n ]),\n ];\n categories.set(id, {\n id,\n name: text(c.name),\n itemIds,\n ...opt(\"description\", c.description, isString),\n });\n return id;\n });\n const s = schedule(m.schedule);\n return {\n id: text(m.id),\n name: text(m.name),\n categoryIds,\n ...(m.placement_count !== undefined\n ? { placementCount: m.placement_count as number }\n : {}),\n ...opt(\"paginated\", m.paginated, isBoolean),\n ...(s ? { schedule: s } : {}),\n ...opt(\"infoBanner\", m.info_banner, isString),\n };\n });\n const items = Object.fromEntries(\n Object.entries(record(v.items)).map(([id, item]) => {\n const mapped = mapItem(item);\n if (mapped.id !== id) {\n throw new ZappieError(\n \"server_error\",\n \"Item map key does not match its identity\",\n );\n }\n return [id, mapped];\n }),\n );\n if (v.branch_id !== undefined && v.branch_id !== branchId) {\n throw new ZappieError(\"server_error\", \"Menu branch mismatch\");\n }\n return {\n id: menus.length === 1 ? menus[0]!.id : `branch:${branchId}`,\n branchId,\n ...(v.completeness === \"partial\"\n ? { completeness: \"partial\" as const }\n : {}),\n name: menus.length === 1 ? menus[0]!.name : \"Catalogue\",\n version: text(v.menu_version ?? v.version),\n categories: [...categories.values()],\n items,\n menus,\n ...(menus.length === 1 && menus[0]!.schedule\n ? { schedule: menus[0]!.schedule }\n : {}),\n };\n}\n"]}