@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
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/transport/rest.ts"],
4
+ "sourcesContent": ["import type { QuoteRequest, WireQuote } from \"../cart/types\";\nimport { ZappieError, wireError } from \"../errors\";\nimport { delay, throwIfAborted } from \"../internal/abort\";\nimport { payloadKey } from \"../internal/digest\";\nimport { money } from \"../money\";\nimport {\n hours,\n isBoolean,\n isString,\n list,\n mapItem,\n mapMenu,\n mapMoney,\n opt,\n record,\n text,\n} from \"./mappers\";\nimport type { SelectedMenuRequest } from \"./selected-menu\";\nimport type {\n MenuResponse,\n MenuVersion,\n RequestCtx,\n SearchRequest,\n Transport,\n} from \"./types\";\n/** The longest Retry-After the SDK waits out before surfacing the error instead. */\nconst MAX_RETRY_WAIT_MS = 5_000;\n/** REST connection options. A custom fetch can provide tracing or mock responses. */\nexport type RestTransportOptions = { baseUrl?: string; fetch?: typeof fetch };\n/** REST read adapter for the versioned storefront API. */\nexport class RestTransport implements Transport {\n readonly baseUrl: string;\n private fetcher: typeof fetch;\n constructor(opts: RestTransportOptions = {}) {\n const url = new URL(opts.baseUrl ?? \"https://api.zappie.ai/storefront/v1\");\n if (\n url.username ||\n url.password ||\n url.search ||\n url.hash ||\n (url.protocol !== \"https:\" &&\n !(\n url.protocol === \"http:\" &&\n [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(url.hostname)\n ))\n ) {\n throw new ZappieError(\n \"invalid_request\",\n \"REST baseUrl requires HTTPS, or HTTP on localhost\",\n );\n }\n this.baseUrl = url.href.replace(/\\/$/, \"\");\n // Called as this.fetcher(), a stored global fetch would run with the\n // transport as `this`, which Workers refuses (\"Illegal invocation\").\n this.fetcher =\n opts.fetch ?? ((input, init) => globalThis.fetch(input, init));\n }\n private async request(\n path: string,\n ctx: RequestCtx,\n etag?: string,\n body?: QuoteRequest,\n ): Promise<Response> {\n if (typeof window !== \"undefined\" && ctx.key.startsWith(\"sk_\")) {\n throw new ZappieError(\n \"invalid_request\",\n \"Secret keys cannot be sent from a browser\",\n );\n }\n for (let attempt = 0; ; attempt++) {\n throwIfAborted(ctx.signal);\n let response: Response;\n try {\n response = await this.fetcher(this.baseUrl + path, {\n method: body ? \"POST\" : \"GET\",\n ...(body ? { body: JSON.stringify(body) } : {}),\n // Workers reject redirect: \"error\"; a redirect is still refused below\n // as a non-OK response (a 3xx, or opaqueredirect in browsers).\n redirect: \"manual\",\n headers: {\n ...(body ? { \"Content-Type\": \"application/json\" } : {}),\n ...(ctx.idempotencyKey\n ? { \"Idempotency-Key\": ctx.idempotencyKey }\n : {}),\n Authorization: `Bearer ${ctx.key}`,\n \"Zappie-Version\": ctx.version,\n ...(etag ? { \"If-None-Match\": etag } : {}),\n },\n ...(ctx.signal ? { signal: ctx.signal } : {}),\n });\n } catch (error) {\n throwIfAborted(ctx.signal);\n if (attempt >= 2) {\n throw new ZappieError(\n \"network_error\",\n \"Could not reach the storefront service\",\n { cause: error },\n );\n }\n await delay(100 * 2 ** attempt + Math.random() * 100, ctx.signal);\n continue;\n }\n if (response.ok || response.status === 304) {\n return response;\n }\n const retry = response.headers.get(\"Retry-After\");\n const seconds = retry !== null ? Number(retry) : NaN;\n const wait =\n retry !== null\n ? Number.isFinite(seconds)\n ? Math.max(0, seconds * 1000)\n : Math.max(0, Date.parse(retry) - Date.now())\n : NaN;\n // A longer wait than this is the caller's decision, not a silently stalled read.\n const tooLong = Number.isFinite(wait) && wait > MAX_RETRY_WAIT_MS;\n if (\n attempt < 2 &&\n !tooLong &&\n (response.status === 429 || response.status >= 500)\n ) {\n await response.body?.cancel();\n await delay(\n Number.isFinite(wait)\n ? wait\n : 100 * 2 ** attempt + Math.random() * 100,\n ctx.signal,\n );\n continue;\n }\n const errorBody = await response.json().catch(() => ({}));\n throw wireError(\n errorBody,\n response.status,\n response.headers.get(\"Zappie-Request-Id\") ?? undefined,\n );\n }\n }\n private async json(response: Response): Promise<unknown> {\n try {\n return await response.json();\n } catch (cause) {\n if (cause instanceof Error && cause.name === \"AbortError\") {\n throw cause;\n }\n throw new ZappieError(\n \"server_error\",\n \"The storefront service returned invalid JSON\",\n { status: response.status, cause },\n );\n }\n }\n async quote(ctx: RequestCtx, body: QuoteRequest): Promise<WireQuote> {\n const request = {\n ...ctx,\n idempotencyKey:\n ctx.idempotencyKey ?? (await payloadKey(JSON.stringify(body))),\n };\n const raw = await this.json(\n await this.request(\"/quote\", request, undefined, body),\n );\n // The cart's quote client validates and maps the response.\n return raw as WireQuote;\n }\n async getStore(ctx: RequestCtx) {\n const mapper = import(\"./store\").catch((cause) => {\n throw new ZappieError(\n \"server_error\",\n \"Could not load the storefront store mapper\",\n { cause },\n );\n });\n const response = this.request(\"/store\", ctx).then((value) =>\n this.json(value),\n );\n const [{ mapStore }, raw] = await Promise.all([mapper, response]);\n return mapStore(\n raw,\n record,\n text,\n list,\n hours,\n mapMoney,\n money,\n opt,\n isString,\n isBoolean,\n );\n }\n async getMenu(\n ctx: RequestCtx & {\n branchId: string;\n ifNoneMatch?: string;\n metadataOnly?: boolean;\n },\n ): Promise<MenuResponse> {\n let cursor: string | undefined;\n const seen = new Set<string>();\n let output: ReturnType<typeof mapMenu> | undefined;\n let etag: string | undefined;\n do {\n const query = new URLSearchParams({\n branch: ctx.branchId,\n ...(ctx.metadataOnly ? { metadata_only: \"true\" } : {}),\n ...(cursor ? { cursor } : {}),\n });\n const response = await this.request(\n `/menus?${query}`,\n ctx,\n cursor ? undefined : ctx.ifNoneMatch,\n );\n if (response.status === 304) {\n if (cursor) {\n throw new ZappieError(\n \"server_error\",\n \"Unexpected 304 on a continuation page\",\n );\n }\n return {\n notModified: true,\n ...(response.headers.get(\"ETag\")\n ? { etag: response.headers.get(\"ETag\")! }\n : {}),\n };\n }\n const raw = record(await this.json(response));\n const page = mapMenu(raw, ctx.branchId);\n if (ctx.metadataOnly) {\n if (Object.keys(page.items).length || raw.next_cursor) {\n throw new ZappieError(\"server_error\", \"Invalid metadata response\");\n }\n return { menu: { ...page, completeness: \"partial\" } };\n }\n if (!output) {\n output = page;\n etag = response.headers.get(\"ETag\") ?? undefined;\n } else {\n if (page.version !== output.version) {\n throw new ZappieError(\n \"server_error\",\n \"Menu changed while fetching pages; retry the read\",\n );\n }\n Object.assign(output.items, page.items);\n for (const category of page.categories) {\n const existing = output.categories.find((c) => c.id === category.id);\n if (existing) {\n existing.itemIds = [\n ...new Set([...existing.itemIds, ...category.itemIds]),\n ];\n } else {\n output.categories.push(category);\n }\n }\n for (const section of page.menus ?? []) {\n const existing = output.menus?.find((m) => m.id === section.id);\n if (existing) {\n existing.categoryIds = [\n ...new Set([...existing.categoryIds, ...section.categoryIds]),\n ];\n } else {\n output.menus?.push(section);\n }\n }\n }\n cursor =\n typeof raw.next_cursor === \"string\" && raw.next_cursor\n ? raw.next_cursor\n : undefined;\n if (cursor) {\n if (seen.has(cursor)) {\n throw new ZappieError(\n \"server_error\",\n \"Repeated menu pagination cursor\",\n );\n }\n seen.add(cursor);\n }\n } while (cursor);\n if (output.menus && output.menus.length > 1) {\n output.id = `branch:${ctx.branchId}`;\n output.name = \"Catalogue\";\n delete output.schedule;\n }\n for (const category of output.categories) {\n for (const id of category.itemIds) {\n if (!Object.prototype.hasOwnProperty.call(output.items, id)) {\n throw new ZappieError(\n \"server_error\",\n \"Category refers to a missing item\",\n );\n }\n }\n }\n if (Object.keys(output.items).length > 2000) {\n console.warn(\"Zappie menu contains more than 2,000 items\");\n }\n return { menu: output, ...(etag ? { etag } : {}) };\n }\n async getSelectedMenu(ctx: SelectedMenuRequest) {\n return (await import(\"./selected-menu\")).selectedMenu(\n ctx,\n (path) => this.request(path, ctx, ctx.ifNoneMatch),\n (response) => this.json(response),\n mapMenu,\n () => new ZappieError(\"server_error\", \"Invalid selected menu\"),\n );\n }\n async search(ctx: SearchRequest) {\n return (await import(\"./search\")).searchPage(\n ctx,\n async (path) => this.json(await this.request(path, ctx)),\n mapMenu,\n () => new ZappieError(\"server_error\", \"Invalid search page\"),\n );\n }\n async getCategoryPage(\n ctx: RequestCtx & {\n branchId: string;\n menuId: string;\n categoryId: string;\n cursor?: string;\n },\n ) {\n const query = new URLSearchParams({\n branch: ctx.branchId,\n ...(ctx.cursor ? { cursor: ctx.cursor } : {}),\n });\n const raw = await this.json(\n await this.request(\n `/menus/${encodeURIComponent(ctx.menuId)}/categories/${encodeURIComponent(ctx.categoryId)}/items?${query}`,\n ctx,\n ),\n );\n // Loaded on first use: only progressive catalogues read pages.\n return (await import(\"./category-page\")).categoryPage(\n record(raw),\n ctx,\n mapMenu,\n () => new ZappieError(\"server_error\", \"Invalid category page\"),\n );\n }\n async getMenuVersion(\n ctx: RequestCtx & { branchId: string },\n ): Promise<MenuVersion> {\n const value = record(\n await this.json(\n await this.request(\n `/menus/version?${new URLSearchParams({ branch: ctx.branchId })}`,\n ctx,\n ),\n ),\n );\n if (\n typeof value.menu_version !== \"string\" ||\n typeof value.availability_hash !== \"string\"\n ) {\n throw new ZappieError(\"server_error\", \"Invalid menu version response\");\n }\n return {\n version: value.menu_version,\n availabilityHash: value.availability_hash,\n };\n }\n async getItem(ctx: RequestCtx & { branchId: string; itemId: string }) {\n const item = mapItem(\n await this.json(\n await this.request(\n `/items/${encodeURIComponent(ctx.itemId)}?${new URLSearchParams({ branch: ctx.branchId })}`,\n ctx,\n ),\n ),\n );\n if (item.id !== ctx.itemId) {\n throw new ZappieError(\n \"server_error\",\n \"Item response identity does not match the request\",\n );\n }\n return item;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,2 +1,32 @@
1
- async function m(e,i,c,a){e.signal?.throwIfAborted();let u=new URLSearchParams({branch:e.branchId,query:e.query.trim(),limit:"25",...e.cursor?{cursor:e.cursor}:{}}),o=await i(`/items/search?${u}`);if(e.signal?.throwIfAborted(),!o||typeof o!="object"||Array.isArray(o))throw a();let r=o.next_cursor,s=c(o,e.branchId);if(Object.keys(s.items).length>25||r!=null&&(typeof r!="string"||!r||r===e.cursor)||Object.keys(s.items).some(n=>!s.categories.some(t=>t.itemIds.includes(n)))||s.categories.some(n=>!s.menus?.some(t=>t.categoryIds.includes(n.id))))throw a();return {menu:{...s,completeness:"partial"},...typeof r=="string"?{nextCursor:r}:{}}}export{m as searchPage};//# sourceMappingURL=search.js.map
2
- //# sourceMappingURL=search.js.map
1
+ // src/transport/search.ts
2
+ async function searchPage(ctx, read, mapMenu, invalid) {
3
+ ctx.signal?.throwIfAborted();
4
+ const query = new URLSearchParams({
5
+ branch: ctx.branchId,
6
+ query: ctx.query.trim(),
7
+ limit: "25",
8
+ ...ctx.cursor ? { cursor: ctx.cursor } : {}
9
+ });
10
+ const raw = await read(`/items/search?${query}`);
11
+ ctx.signal?.throwIfAborted();
12
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
13
+ throw invalid();
14
+ }
15
+ const cursor = raw.next_cursor;
16
+ const menu = mapMenu(raw, ctx.branchId);
17
+ if (Object.keys(menu.items).length > 25 || cursor != null && (typeof cursor !== "string" || !cursor || cursor === ctx.cursor) || Object.keys(menu.items).some(
18
+ (id) => !menu.categories.some((category) => category.itemIds.includes(id))
19
+ ) || menu.categories.some(
20
+ (category) => !menu.menus?.some((source) => source.categoryIds.includes(category.id))
21
+ )) {
22
+ throw invalid();
23
+ }
24
+ return {
25
+ menu: { ...menu, completeness: "partial" },
26
+ ...typeof cursor === "string" ? { nextCursor: cursor } : {}
27
+ };
28
+ }
29
+ export {
30
+ searchPage
31
+ };
32
+ //# sourceMappingURL=search.js.map
@@ -1 +1,7 @@
1
- {"version":3,"sources":["../../src/transport/search.ts"],"names":["searchPage","ctx","read","mapMenu","invalid","query","raw","cursor","menu","id","category","source"],"mappings":"AAIA,eAAsBA,CAAAA,CACpBC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,EACqB,CACrBH,CAAAA,CAAI,MAAA,EAAQ,cAAA,EAAe,CAC3B,IAAMI,CAAAA,CAAQ,IAAI,gBAAgB,CAChC,MAAA,CAAQJ,CAAAA,CAAI,QAAA,CACZ,KAAA,CAAOA,CAAAA,CAAI,KAAA,CAAM,IAAA,GACjB,KAAA,CAAO,IAAA,CACP,GAAIA,CAAAA,CAAI,OAAS,CAAE,MAAA,CAAQA,CAAAA,CAAI,MAAO,EAAI,EAC5C,CAAC,CAAA,CACKK,CAAAA,CAAM,MAAMJ,CAAAA,CAAK,CAAA,cAAA,EAAiBG,CAAK,CAAA,CAAE,CAAA,CAE/C,GADAJ,CAAAA,CAAI,QAAQ,cAAA,EAAe,CACvB,CAACK,CAAAA,EAAO,OAAOA,CAAAA,EAAQ,QAAA,EAAY,KAAA,CAAM,OAAA,CAAQA,CAAG,CAAA,CACtD,MAAMF,CAAAA,GAER,IAAMG,CAAAA,CAAUD,CAAAA,CAAgC,WAAA,CAC1CE,EAAOL,CAAAA,CAAQG,CAAAA,CAAKL,CAAAA,CAAI,QAAQ,EACtC,GACE,MAAA,CAAO,IAAA,CAAKO,CAAAA,CAAK,KAAK,CAAA,CAAE,MAAA,CAAS,EAAA,EAChCD,GAAU,IAAA,GACR,OAAOA,CAAAA,EAAW,QAAA,EAAY,CAACA,CAAAA,EAAUA,CAAAA,GAAWN,CAAAA,CAAI,MAAA,CAAA,EAC3D,OAAO,IAAA,CAAKO,CAAAA,CAAK,KAAK,CAAA,CAAE,IAAA,CACrBC,CAAAA,EACC,CAACD,CAAAA,CAAK,WAAW,IAAA,CAAME,CAAAA,EAAaA,CAAAA,CAAS,OAAA,CAAQ,SAASD,CAAE,CAAC,CACrE,CAAA,EACAD,EAAK,UAAA,CAAW,IAAA,CACbE,CAAAA,EACC,CAACF,CAAAA,CAAK,KAAA,EAAO,IAAA,CAAMG,CAAAA,EAAWA,EAAO,WAAA,CAAY,QAAA,CAASD,CAAAA,CAAS,EAAE,CAAC,CAC1E,CAAA,CAEA,MAAMN,CAAAA,GAER,OAAO,CACL,IAAA,CAAM,CAAE,GAAGI,CAAAA,CAAM,YAAA,CAAc,SAAU,EACzC,GAAI,OAAOD,CAAAA,EAAW,QAAA,CAAW,CAAE,UAAA,CAAYA,CAAO,CAAA,CAAI,EAC5D,CACF","file":"search.js","sourcesContent":["import type { Menu } from \"../models\";\nimport type { SearchPage, SearchRequest } from \"./types\";\n\n/** Loaded only when search is used; request authentication/retries stay in REST. */\nexport async function searchPage(\n ctx: SearchRequest,\n read: (path: string) => Promise<unknown>,\n mapMenu: (value: unknown, branchId: string) => Menu,\n invalid: () => Error,\n): Promise<SearchPage> {\n ctx.signal?.throwIfAborted();\n const query = new URLSearchParams({\n branch: ctx.branchId,\n query: ctx.query.trim(),\n limit: \"25\",\n ...(ctx.cursor ? { cursor: ctx.cursor } : {}),\n });\n const raw = await read(`/items/search?${query}`);\n ctx.signal?.throwIfAborted();\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n throw invalid();\n }\n const cursor = (raw as Record<string, unknown>).next_cursor;\n const menu = mapMenu(raw, ctx.branchId);\n if (\n Object.keys(menu.items).length > 25 ||\n (cursor != null &&\n (typeof cursor !== \"string\" || !cursor || cursor === ctx.cursor)) ||\n Object.keys(menu.items).some(\n (id) =>\n !menu.categories.some((category) => category.itemIds.includes(id)),\n ) ||\n menu.categories.some(\n (category) =>\n !menu.menus?.some((source) => source.categoryIds.includes(category.id)),\n )\n ) {\n throw invalid();\n }\n return {\n menu: { ...menu, completeness: \"partial\" },\n ...(typeof cursor === \"string\" ? { nextCursor: cursor } : {}),\n };\n}\n"]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/transport/search.ts"],
4
+ "sourcesContent": ["import type { Menu } from \"../models\";\nimport type { SearchPage, SearchRequest } from \"./types\";\n\n/** Loaded only when search is used; request authentication/retries stay in REST. */\nexport async function searchPage(\n ctx: SearchRequest,\n read: (path: string) => Promise<unknown>,\n mapMenu: (value: unknown, branchId: string) => Menu,\n invalid: () => Error,\n): Promise<SearchPage> {\n ctx.signal?.throwIfAborted();\n const query = new URLSearchParams({\n branch: ctx.branchId,\n query: ctx.query.trim(),\n limit: \"25\",\n ...(ctx.cursor ? { cursor: ctx.cursor } : {}),\n });\n const raw = await read(`/items/search?${query}`);\n ctx.signal?.throwIfAborted();\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n throw invalid();\n }\n const cursor = (raw as Record<string, unknown>).next_cursor;\n const menu = mapMenu(raw, ctx.branchId);\n if (\n Object.keys(menu.items).length > 25 ||\n (cursor != null &&\n (typeof cursor !== \"string\" || !cursor || cursor === ctx.cursor)) ||\n Object.keys(menu.items).some(\n (id) =>\n !menu.categories.some((category) => category.itemIds.includes(id)),\n ) ||\n menu.categories.some(\n (category) =>\n !menu.menus?.some((source) => source.categoryIds.includes(category.id)),\n )\n ) {\n throw invalid();\n }\n return {\n menu: { ...menu, completeness: \"partial\" },\n ...(typeof cursor === \"string\" ? { nextCursor: cursor } : {}),\n };\n}\n"],
5
+ "mappings": ";AAIA,eAAsB,WACpB,KACA,MACA,SACA,SACqB;AACrB,MAAI,QAAQ,eAAe;AAC3B,QAAM,QAAQ,IAAI,gBAAgB;AAAA,IAChC,QAAQ,IAAI;AAAA,IACZ,OAAO,IAAI,MAAM,KAAK;AAAA,IACtB,OAAO;AAAA,IACP,GAAI,IAAI,SAAS,EAAE,QAAQ,IAAI,OAAO,IAAI,CAAC;AAAA,EAC7C,CAAC;AACD,QAAM,MAAM,MAAM,KAAK,iBAAiB,KAAK,EAAE;AAC/C,MAAI,QAAQ,eAAe;AAC3B,MAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,GAAG;AACzD,UAAM,QAAQ;AAAA,EAChB;AACA,QAAM,SAAU,IAAgC;AAChD,QAAM,OAAO,QAAQ,KAAK,IAAI,QAAQ;AACtC,MACE,OAAO,KAAK,KAAK,KAAK,EAAE,SAAS,MAChC,UAAU,SACR,OAAO,WAAW,YAAY,CAAC,UAAU,WAAW,IAAI,WAC3D,OAAO,KAAK,KAAK,KAAK,EAAE;AAAA,IACtB,CAAC,OACC,CAAC,KAAK,WAAW,KAAK,CAAC,aAAa,SAAS,QAAQ,SAAS,EAAE,CAAC;AAAA,EACrE,KACA,KAAK,WAAW;AAAA,IACd,CAAC,aACC,CAAC,KAAK,OAAO,KAAK,CAAC,WAAW,OAAO,YAAY,SAAS,SAAS,EAAE,CAAC;AAAA,EAC1E,GACA;AACA,UAAM,QAAQ;AAAA,EAChB;AACA,SAAO;AAAA,IACL,MAAM,EAAE,GAAG,MAAM,cAAc,UAAU;AAAA,IACzC,GAAI,OAAO,WAAW,WAAW,EAAE,YAAY,OAAO,IAAI,CAAC;AAAA,EAC7D;AACF;",
6
+ "names": []
7
+ }
@@ -1,2 +1,79 @@
1
- async function l(e,o,t,s,n){let r=a=>{if(!a||typeof a!="object"||Array.isArray(a))throw n();return a},d=new URLSearchParams({branch:e.branchId,order_context:e.orderContext}),c=await o(`/menus/${encodeURIComponent(e.menuId)}?${d}`),i=c.headers.get("ETag");if(!i)throw n();if(c.status===304)return {notModified:true,etag:i};let p=r(await t(c)),u=r(p.coverage),m=s(p,e.branchId);if(p.next_cursor||u.complete!==true||!Array.isArray(u.menuIds)||u.menuIds.length!==1||u.menuIds[0]!==e.menuId||m.menus?.length!==1||m.menus[0]?.id!==e.menuId)throw n();return {menu:{...m,completeness:"partial"},coverage:{menuIds:[e.menuId],complete:true},etag:i}}function g(e){return JSON.stringify(["selected-menu:v1",e.store,e.branchId,e.orderContext,e.menuId])}function h(e){let o=e._internal.transport;return {async read(t,s={}){if(!o.getSelectedMenu)throw new Error("Transport does not support selected menus");let n=await o.getSelectedMenu({key:e.config.key,version:e.config.version,branchId:t.branchId,menuId:t.menuId,orderContext:t.orderContext,...s});if(s.signal?.throwIfAborted(),!("notModified"in n)){if(n.menu.branchId!==t.branchId||n.coverage.menuIds.length!==1||n.coverage.menuIds[0]!==t.menuId)throw new Error("Selected menu belongs to another scope");let r=g(t),d=e._internal.cache.snapshot(r).value;JSON.stringify(d)!==JSON.stringify(n)&&e._internal.cache.set(r,n,n.etag);}return n}}}export{h as createSelectedMenuReader,l as selectedMenu,g as selectedMenuKey};//# sourceMappingURL=selected-menu.js.map
2
- //# sourceMappingURL=selected-menu.js.map
1
+ // src/transport/selected-menu.ts
2
+ async function selectedMenu(ctx, request, json, mapMenu, invalid) {
3
+ const record = (value) => {
4
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
5
+ throw invalid();
6
+ }
7
+ return value;
8
+ };
9
+ const query = new URLSearchParams({
10
+ branch: ctx.branchId,
11
+ order_context: ctx.orderContext
12
+ });
13
+ const response = await request(
14
+ `/menus/${encodeURIComponent(ctx.menuId)}?${query}`
15
+ );
16
+ const etag = response.headers.get("ETag");
17
+ if (!etag) {
18
+ throw invalid();
19
+ }
20
+ if (response.status === 304) {
21
+ return { notModified: true, etag };
22
+ }
23
+ const raw = record(await json(response));
24
+ const coverage = record(raw.coverage);
25
+ const menu = mapMenu(raw, ctx.branchId);
26
+ if (raw.next_cursor || coverage.complete !== true || !Array.isArray(coverage.menuIds) || coverage.menuIds.length !== 1 || coverage.menuIds[0] !== ctx.menuId || menu.menus?.length !== 1 || menu.menus[0]?.id !== ctx.menuId) {
27
+ throw invalid();
28
+ }
29
+ return {
30
+ menu: { ...menu, completeness: "partial" },
31
+ coverage: { menuIds: [ctx.menuId], complete: true },
32
+ etag
33
+ };
34
+ }
35
+ function selectedMenuKey(scope) {
36
+ return JSON.stringify([
37
+ "selected-menu:v1",
38
+ scope.store,
39
+ scope.branchId,
40
+ scope.orderContext,
41
+ scope.menuId
42
+ ]);
43
+ }
44
+ function createSelectedMenuReader(client) {
45
+ const transport = client._internal.transport;
46
+ return {
47
+ async read(scope, options = {}) {
48
+ if (!transport.getSelectedMenu) {
49
+ throw new Error("Transport does not support selected menus");
50
+ }
51
+ const response = await transport.getSelectedMenu({
52
+ key: client.config.key,
53
+ version: client.config.version,
54
+ branchId: scope.branchId,
55
+ menuId: scope.menuId,
56
+ orderContext: scope.orderContext,
57
+ ...options
58
+ });
59
+ options.signal?.throwIfAborted();
60
+ if (!("notModified" in response)) {
61
+ if (response.menu.branchId !== scope.branchId || response.coverage.menuIds.length !== 1 || response.coverage.menuIds[0] !== scope.menuId) {
62
+ throw new Error("Selected menu belongs to another scope");
63
+ }
64
+ const key = selectedMenuKey(scope);
65
+ const previous = client._internal.cache.snapshot(key).value;
66
+ if (JSON.stringify(previous) !== JSON.stringify(response)) {
67
+ client._internal.cache.set(key, response, response.etag);
68
+ }
69
+ }
70
+ return response;
71
+ }
72
+ };
73
+ }
74
+ export {
75
+ createSelectedMenuReader,
76
+ selectedMenu,
77
+ selectedMenuKey
78
+ };
79
+ //# sourceMappingURL=selected-menu.js.map
@@ -1 +1,7 @@
1
- {"version":3,"sources":["../../src/transport/selected-menu.ts"],"names":["selectedMenu","ctx","request","json","mapMenu","invalid","record","value","query","response","etag","raw","coverage","menu","selectedMenuKey","scope","createSelectedMenuReader","client","transport","options","key","previous"],"mappings":"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","file":"selected-menu.js","sourcesContent":["import type { Zappie } from \"../client\";\nimport type { Menu } from \"../models\";\nimport type { CatalogueScope } from \"../persist/catalogue\";\nimport type { RequestCtx } from \"./types\";\n\n/** Complete for the named source, never complete for the branch. */\nexport type SelectedMenu = {\n menu: Menu & { completeness: \"partial\" };\n coverage: { menuIds: [string]; complete: true };\n};\n/**\n * A source menu with its ETag, or an unchanged response carrying the matching ETag.\n */\nexport type SelectedMenuResponse =\n (SelectedMenu & { etag: string }) | { notModified: true; etag: string };\n/**\n * A branch-scoped source-menu request with order context and an optional conditional ETag.\n */\nexport type SelectedMenuRequest = RequestCtx & {\n branchId: string;\n menuId: string;\n orderContext: CatalogueScope[\"orderContext\"];\n ifNoneMatch?: string;\n};\n/**\n * A transport that reads one complete source menu without claiming branch-wide coverage.\n */\nexport type SelectedMenuTransport = {\n getSelectedMenu(request: SelectedMenuRequest): Promise<SelectedMenuResponse>;\n};\n/** Dependencies are passed by REST to avoid splitting core shared chunks. */\nexport async function selectedMenu(\n ctx: SelectedMenuRequest,\n request: (path: string) => Promise<Response>,\n json: (response: Response) => Promise<unknown>,\n mapMenu: (value: unknown, branchId: string) => Menu,\n invalid: () => Error,\n): Promise<SelectedMenuResponse> {\n // Checked here rather than passed in: every argument REST passes costs the\n // core bytes, and the core has none to spare.\n const record = (value: unknown) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw invalid();\n }\n return value as Record<string, unknown>;\n };\n const query = new URLSearchParams({\n branch: ctx.branchId,\n order_context: ctx.orderContext,\n });\n const response = await request(\n `/menus/${encodeURIComponent(ctx.menuId)}?${query}`,\n );\n const etag = response.headers.get(\"ETag\");\n if (!etag) {\n throw invalid();\n }\n if (response.status === 304) {\n return { notModified: true, etag };\n }\n const raw = record(await json(response));\n const coverage = record(raw.coverage);\n const menu = mapMenu(raw, ctx.branchId);\n if (\n raw.next_cursor ||\n coverage.complete !== true ||\n !Array.isArray(coverage.menuIds) ||\n coverage.menuIds.length !== 1 ||\n coverage.menuIds[0] !== ctx.menuId ||\n menu.menus?.length !== 1 ||\n menu.menus[0]?.id !== ctx.menuId\n ) {\n throw invalid();\n }\n return {\n menu: { ...menu, completeness: \"partial\" },\n coverage: { menuIds: [ctx.menuId], complete: true },\n etag,\n };\n}\n/**\n * Build a versioned cache key for a source menu within a store, branch and order context.\n */\nexport function selectedMenuKey(scope: CatalogueScope) {\n return JSON.stringify([\n \"selected-menu:v1\",\n scope.store,\n scope.branchId,\n scope.orderContext,\n scope.menuId,\n ]);\n}\n/** Dedicated lazy resource: deliberately does not call menu.hydrate(). */\nexport function createSelectedMenuReader(client: Zappie) {\n const transport = client._internal.transport;\n return {\n async read(\n scope: CatalogueScope,\n options: { signal?: AbortSignal; ifNoneMatch?: string } = {},\n ) {\n if (!transport.getSelectedMenu) {\n throw new Error(\"Transport does not support selected menus\");\n }\n const response = await transport.getSelectedMenu({\n key: client.config.key,\n version: client.config.version,\n branchId: scope.branchId,\n menuId: scope.menuId,\n orderContext: scope.orderContext,\n ...options,\n });\n options.signal?.throwIfAborted();\n if (!(\"notModified\" in response)) {\n if (\n response.menu.branchId !== scope.branchId ||\n response.coverage.menuIds.length !== 1 ||\n response.coverage.menuIds[0] !== scope.menuId\n ) {\n throw new Error(\"Selected menu belongs to another scope\");\n }\n const key = selectedMenuKey(scope);\n const previous =\n client._internal.cache.snapshot<SelectedMenuResponse>(key).value;\n if (JSON.stringify(previous) !== JSON.stringify(response)) {\n client._internal.cache.set(key, response, response.etag);\n }\n }\n return response;\n },\n };\n}\n"]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/transport/selected-menu.ts"],
4
+ "sourcesContent": ["import type { Zappie } from \"../client\";\nimport type { Menu } from \"../models\";\nimport type { CatalogueScope } from \"../persist/catalogue\";\nimport type { RequestCtx } from \"./types\";\n\n/** Complete for the named source, never complete for the branch. */\nexport type SelectedMenu = {\n menu: Menu & { completeness: \"partial\" };\n coverage: { menuIds: [string]; complete: true };\n};\n/**\n * A source menu with its ETag, or an unchanged response carrying the matching ETag.\n */\nexport type SelectedMenuResponse =\n (SelectedMenu & { etag: string }) | { notModified: true; etag: string };\n/**\n * A branch-scoped source-menu request with order context and an optional conditional ETag.\n */\nexport type SelectedMenuRequest = RequestCtx & {\n branchId: string;\n menuId: string;\n orderContext: CatalogueScope[\"orderContext\"];\n ifNoneMatch?: string;\n};\n/**\n * A transport that reads one complete source menu without claiming branch-wide coverage.\n */\nexport type SelectedMenuTransport = {\n getSelectedMenu(request: SelectedMenuRequest): Promise<SelectedMenuResponse>;\n};\n/** Dependencies are passed by REST to avoid splitting core shared chunks. */\nexport async function selectedMenu(\n ctx: SelectedMenuRequest,\n request: (path: string) => Promise<Response>,\n json: (response: Response) => Promise<unknown>,\n mapMenu: (value: unknown, branchId: string) => Menu,\n invalid: () => Error,\n): Promise<SelectedMenuResponse> {\n // Checked here rather than passed in: every argument REST passes costs the\n // core bytes, and the core has none to spare.\n const record = (value: unknown) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw invalid();\n }\n return value as Record<string, unknown>;\n };\n const query = new URLSearchParams({\n branch: ctx.branchId,\n order_context: ctx.orderContext,\n });\n const response = await request(\n `/menus/${encodeURIComponent(ctx.menuId)}?${query}`,\n );\n const etag = response.headers.get(\"ETag\");\n if (!etag) {\n throw invalid();\n }\n if (response.status === 304) {\n return { notModified: true, etag };\n }\n const raw = record(await json(response));\n const coverage = record(raw.coverage);\n const menu = mapMenu(raw, ctx.branchId);\n if (\n raw.next_cursor ||\n coverage.complete !== true ||\n !Array.isArray(coverage.menuIds) ||\n coverage.menuIds.length !== 1 ||\n coverage.menuIds[0] !== ctx.menuId ||\n menu.menus?.length !== 1 ||\n menu.menus[0]?.id !== ctx.menuId\n ) {\n throw invalid();\n }\n return {\n menu: { ...menu, completeness: \"partial\" },\n coverage: { menuIds: [ctx.menuId], complete: true },\n etag,\n };\n}\n/**\n * Build a versioned cache key for a source menu within a store, branch and order context.\n */\nexport function selectedMenuKey(scope: CatalogueScope) {\n return JSON.stringify([\n \"selected-menu:v1\",\n scope.store,\n scope.branchId,\n scope.orderContext,\n scope.menuId,\n ]);\n}\n/** Dedicated lazy resource: deliberately does not call menu.hydrate(). */\nexport function createSelectedMenuReader(client: Zappie) {\n const transport = client._internal.transport;\n return {\n async read(\n scope: CatalogueScope,\n options: { signal?: AbortSignal; ifNoneMatch?: string } = {},\n ) {\n if (!transport.getSelectedMenu) {\n throw new Error(\"Transport does not support selected menus\");\n }\n const response = await transport.getSelectedMenu({\n key: client.config.key,\n version: client.config.version,\n branchId: scope.branchId,\n menuId: scope.menuId,\n orderContext: scope.orderContext,\n ...options,\n });\n options.signal?.throwIfAborted();\n if (!(\"notModified\" in response)) {\n if (\n response.menu.branchId !== scope.branchId ||\n response.coverage.menuIds.length !== 1 ||\n response.coverage.menuIds[0] !== scope.menuId\n ) {\n throw new Error(\"Selected menu belongs to another scope\");\n }\n const key = selectedMenuKey(scope);\n const previous =\n client._internal.cache.snapshot<SelectedMenuResponse>(key).value;\n if (JSON.stringify(previous) !== JSON.stringify(response)) {\n client._internal.cache.set(key, response, response.etag);\n }\n }\n return response;\n },\n };\n}\n"],
5
+ "mappings": ";AA+BA,eAAsB,aACpB,KACA,SACA,MACA,SACA,SAC+B;AAG/B,QAAM,SAAS,CAAC,UAAmB;AACjC,QAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,YAAM,QAAQ;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,IAAI,gBAAgB;AAAA,IAChC,QAAQ,IAAI;AAAA,IACZ,eAAe,IAAI;AAAA,EACrB,CAAC;AACD,QAAM,WAAW,MAAM;AAAA,IACrB,UAAU,mBAAmB,IAAI,MAAM,CAAC,IAAI,KAAK;AAAA,EACnD;AACA,QAAM,OAAO,SAAS,QAAQ,IAAI,MAAM;AACxC,MAAI,CAAC,MAAM;AACT,UAAM,QAAQ;AAAA,EAChB;AACA,MAAI,SAAS,WAAW,KAAK;AAC3B,WAAO,EAAE,aAAa,MAAM,KAAK;AAAA,EACnC;AACA,QAAM,MAAM,OAAO,MAAM,KAAK,QAAQ,CAAC;AACvC,QAAM,WAAW,OAAO,IAAI,QAAQ;AACpC,QAAM,OAAO,QAAQ,KAAK,IAAI,QAAQ;AACtC,MACE,IAAI,eACJ,SAAS,aAAa,QACtB,CAAC,MAAM,QAAQ,SAAS,OAAO,KAC/B,SAAS,QAAQ,WAAW,KAC5B,SAAS,QAAQ,CAAC,MAAM,IAAI,UAC5B,KAAK,OAAO,WAAW,KACvB,KAAK,MAAM,CAAC,GAAG,OAAO,IAAI,QAC1B;AACA,UAAM,QAAQ;AAAA,EAChB;AACA,SAAO;AAAA,IACL,MAAM,EAAE,GAAG,MAAM,cAAc,UAAU;AAAA,IACzC,UAAU,EAAE,SAAS,CAAC,IAAI,MAAM,GAAG,UAAU,KAAK;AAAA,IAClD;AAAA,EACF;AACF;AAIO,SAAS,gBAAgB,OAAuB;AACrD,SAAO,KAAK,UAAU;AAAA,IACpB;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR,CAAC;AACH;AAEO,SAAS,yBAAyB,QAAgB;AACvD,QAAM,YAAY,OAAO,UAAU;AACnC,SAAO;AAAA,IACL,MAAM,KACJ,OACA,UAA0D,CAAC,GAC3D;AACA,UAAI,CAAC,UAAU,iBAAiB;AAC9B,cAAM,IAAI,MAAM,2CAA2C;AAAA,MAC7D;AACA,YAAM,WAAW,MAAM,UAAU,gBAAgB;AAAA,QAC/C,KAAK,OAAO,OAAO;AAAA,QACnB,SAAS,OAAO,OAAO;AAAA,QACvB,UAAU,MAAM;AAAA,QAChB,QAAQ,MAAM;AAAA,QACd,cAAc,MAAM;AAAA,QACpB,GAAG;AAAA,MACL,CAAC;AACD,cAAQ,QAAQ,eAAe;AAC/B,UAAI,EAAE,iBAAiB,WAAW;AAChC,YACE,SAAS,KAAK,aAAa,MAAM,YACjC,SAAS,SAAS,QAAQ,WAAW,KACrC,SAAS,SAAS,QAAQ,CAAC,MAAM,MAAM,QACvC;AACA,gBAAM,IAAI,MAAM,wCAAwC;AAAA,QAC1D;AACA,cAAM,MAAM,gBAAgB,KAAK;AACjC,cAAM,WACJ,OAAO,UAAU,MAAM,SAA+B,GAAG,EAAE;AAC7D,YAAI,KAAK,UAAU,QAAQ,MAAM,KAAK,UAAU,QAAQ,GAAG;AACzD,iBAAO,UAAU,MAAM,IAAI,KAAK,UAAU,SAAS,IAAI;AAAA,QACzD;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -1,2 +1,120 @@
1
- function G(v,s,a,d,O,M,T,t,o,C){let m=l=>{let e=s(l??{});return typeof e.lat=="number"&&typeof e.lng=="number"?{lat:e.lat,lng:e.lng}:void 0},f=l=>{let e=s(l);return {pickup:e.pickup===true,delivery:e.delivery===true,dineIn:(e.dine_in??e.dineIn)===true,scheduling:(e.scheduling??e.scheduled)===true}},n=s(v),r=s(n.brand??{}),y=d(n.branches).map(l=>{let e=s(l),k=s(e.pickup_address??{}),_=m(k.coordinates),g={...t("placeId",k.place_id,o),..._?{coordinates:_}:{}},b=typeof e.address=="string"?e.address:e.address?Object.values(s(e.address)).filter(c=>typeof c=="string").join(", "):void 0,F=e.address&&typeof e.address=="object"?s(e.address):{},w=m(F);return {id:a(e.id),slug:a(e.slug??e.id),name:a(e.name),openingTimes:O(e.opening_times??e.hours),isOpen:e.is_open===true,fulfilment:f(e.fulfilment),...b!==void 0?{address:b}:{},...o(e.phone)?{phone:e.phone.trim()}:{},...t("timezone",e.timezone,o),...w?{coordinates:w}:{},...t("closedUntil",e.closed_until,o),...t("nextChangeAt",e.next_change_at,o),...t("isDefault",e.is_default,C),...Object.keys(g).length>0?{pickupAddress:g}:{},...e.social_links!==void 0?{socialLinks:d(e.social_links).flatMap(c=>{let u=s(c);try{let p=new URL(a(u.url));return o(u.type)&&(p.protocol==="https:"||p.protocol==="http:")?[{type:u.type,url:p.href}]:[]}catch{return []}})}:{},...e.minimum_order?{minimumOrder:M(e.minimum_order)}:{},...e.special_hours?{specialHours:d(e.special_hours).map(c=>{let u=s(c);return {date:a(u.date),closed:u.closed===true,...t("opens",u.open,o),...t("closes",u.close,o)}})}:{}}}),j=["card","bank_transfer","wallet","zap","apple_pay","google_pay"],z=d(n.payment_methods).map(a).filter(l=>j.includes(l)?true:(console.warn(`Zappie payment method "${l}" is newer than this SDK and was skipped`),false)),i={pickup:false,delivery:false,dineIn:false,scheduling:false};for(let l of y)for(let e of Object.keys(i))i[e]||(i[e]=l.fulfilment[e]);let h=r.accent??(r.colors?s(r.colors).accent:void 0),I=s(n.template_settings??{});return {id:a(n.id),slug:a(n.slug),name:a(n.name),currency:T(0,a(n.currency)).currency,timezone:a(n.timezone),...t("description",n.description,o),...n.template_settings!==void 0?{templateSettings:I}:{},brand:{...t("logoUrl",r.logo_url,o),...t("coverImageUrl",r.cover_image_url,o),...o(h)?{accent:h}:{}},fulfilment:n.fulfilment?f(n.fulfilment):i,paymentMethods:z,branches:y}}export{G as mapStore};//# sourceMappingURL=store.js.map
2
- //# sourceMappingURL=store.js.map
1
+ // src/transport/store.ts
2
+ function mapStore(value, record, text, list, hours, mapMoney, money, opt, isString, isBoolean) {
3
+ const coordinates = (input) => {
4
+ const coordinates2 = record(input ?? {});
5
+ return typeof coordinates2.lat === "number" && typeof coordinates2.lng === "number" ? { lat: coordinates2.lat, lng: coordinates2.lng } : void 0;
6
+ };
7
+ const fulfilment = (input) => {
8
+ const value2 = record(input);
9
+ return {
10
+ pickup: value2.pickup === true,
11
+ delivery: value2.delivery === true,
12
+ dineIn: (value2.dine_in ?? value2.dineIn) === true,
13
+ scheduling: (value2.scheduling ?? value2.scheduled) === true
14
+ };
15
+ };
16
+ const source = record(value);
17
+ const brand = record(source.brand ?? {});
18
+ const branches = list(source.branches).map((raw) => {
19
+ const branch = record(raw);
20
+ const pickup = record(branch.pickup_address ?? {});
21
+ const pickupCoordinates = coordinates(pickup.coordinates);
22
+ const pickupAddress = {
23
+ ...opt("placeId", pickup.place_id, isString),
24
+ ...pickupCoordinates ? { coordinates: pickupCoordinates } : {}
25
+ };
26
+ const address = typeof branch.address === "string" ? branch.address : branch.address ? Object.values(record(branch.address)).filter((entry) => typeof entry === "string").join(", ") : void 0;
27
+ const addressFields = branch.address && typeof branch.address === "object" ? record(branch.address) : {};
28
+ const branchCoordinates = coordinates(addressFields);
29
+ return {
30
+ id: text(branch.id),
31
+ slug: text(branch.slug ?? branch.id),
32
+ name: text(branch.name),
33
+ openingTimes: hours(branch.opening_times ?? branch.hours),
34
+ isOpen: branch.is_open === true,
35
+ fulfilment: fulfilment(branch.fulfilment),
36
+ ...address !== void 0 ? { address } : {},
37
+ ...isString(branch.phone) ? { phone: branch.phone.trim() } : {},
38
+ ...opt("timezone", branch.timezone, isString),
39
+ ...branchCoordinates ? { coordinates: branchCoordinates } : {},
40
+ ...opt("closedUntil", branch.closed_until, isString),
41
+ ...opt("nextChangeAt", branch.next_change_at, isString),
42
+ ...opt("isDefault", branch.is_default, isBoolean),
43
+ ...Object.keys(pickupAddress).length > 0 ? { pickupAddress } : {},
44
+ ...branch.social_links !== void 0 ? {
45
+ socialLinks: list(branch.social_links).flatMap((rawLink) => {
46
+ const link = record(rawLink);
47
+ try {
48
+ const url = new URL(text(link.url));
49
+ return isString(link.type) && (url.protocol === "https:" || url.protocol === "http:") ? [{ type: link.type, url: url.href }] : [];
50
+ } catch {
51
+ return [];
52
+ }
53
+ })
54
+ } : {},
55
+ ...branch.minimum_order ? { minimumOrder: mapMoney(branch.minimum_order) } : {},
56
+ ...branch.special_hours ? {
57
+ specialHours: list(branch.special_hours).map((rawHours) => {
58
+ const special = record(rawHours);
59
+ return {
60
+ date: text(special.date),
61
+ closed: special.closed === true,
62
+ ...opt("opens", special.open, isString),
63
+ ...opt("closes", special.close, isString)
64
+ };
65
+ })
66
+ } : {}
67
+ };
68
+ });
69
+ const allowed = [
70
+ "card",
71
+ "bank_transfer",
72
+ "wallet",
73
+ "zap",
74
+ "apple_pay",
75
+ "google_pay"
76
+ ];
77
+ const paymentMethods = list(source.payment_methods).map(text).filter((method) => {
78
+ if (allowed.includes(method)) {
79
+ return true;
80
+ }
81
+ console.warn(
82
+ `Zappie payment method "${method}" is newer than this SDK and was skipped`
83
+ );
84
+ return false;
85
+ });
86
+ const aggregate = {
87
+ pickup: false,
88
+ delivery: false,
89
+ dineIn: false,
90
+ scheduling: false
91
+ };
92
+ for (const branch of branches) {
93
+ for (const key of Object.keys(aggregate)) {
94
+ aggregate[key] || (aggregate[key] = branch.fulfilment[key]);
95
+ }
96
+ }
97
+ const accent = brand.accent ?? (brand.colors ? record(brand.colors).accent : void 0);
98
+ const templateSettings = record(source.template_settings ?? {});
99
+ return {
100
+ id: text(source.id),
101
+ slug: text(source.slug),
102
+ name: text(source.name),
103
+ currency: money(0, text(source.currency)).currency,
104
+ timezone: text(source.timezone),
105
+ ...opt("description", source.description, isString),
106
+ ...source.template_settings !== void 0 ? { templateSettings } : {},
107
+ brand: {
108
+ ...opt("logoUrl", brand.logo_url, isString),
109
+ ...opt("coverImageUrl", brand.cover_image_url, isString),
110
+ ...isString(accent) ? { accent } : {}
111
+ },
112
+ fulfilment: source.fulfilment ? fulfilment(source.fulfilment) : aggregate,
113
+ paymentMethods,
114
+ branches
115
+ };
116
+ }
117
+ export {
118
+ mapStore
119
+ };
120
+ //# sourceMappingURL=store.js.map
@@ -1 +1,7 @@
1
- {"version":3,"sources":["../../src/transport/store.ts"],"names":["mapStore","value","record","text","list","hours","mapMoney","money","opt","isString","isBoolean","coordinates","input","fulfilment","source","brand","branches","raw","branch","pickup","pickupCoordinates","pickupAddress","address","entry","addressFields","branchCoordinates","rawLink","link","url","rawHours","special","allowed","paymentMethods","method","aggregate","key","accent","templateSettings"],"mappings":"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","file":"store.js","sourcesContent":["import type { Branch, Fulfilment, OpeningTime, Store } from \"../models\";\nimport type { Currency, Money } from \"../money\";\n\ntype Guard<T> = (value: unknown) => value is T;\ntype Optional = <K extends string, T>(\n key: K,\n value: unknown,\n is: Guard<T>,\n) => { [P in K]?: T };\n\n/** Core parsing helpers are passed in, in this order, so this lazy entry has no runtime import. */\nexport function mapStore(\n value: unknown,\n record: (value: unknown) => Record<string, unknown>,\n text: (value: unknown) => string,\n list: (value: unknown) => unknown[],\n hours: (value: unknown) => OpeningTime[],\n mapMoney: (value: unknown) => Money,\n money: (amountMinor: number, currency: Currency) => Money,\n opt: Optional,\n isString: Guard<string>,\n isBoolean: Guard<boolean>,\n): Store {\n const coordinates = (input: unknown) => {\n const coordinates = record(input ?? {});\n return typeof coordinates.lat === \"number\" &&\n typeof coordinates.lng === \"number\"\n ? { lat: coordinates.lat, lng: coordinates.lng }\n : undefined;\n };\n const fulfilment = (input: unknown): Fulfilment => {\n const value = record(input);\n return {\n pickup: value.pickup === true,\n delivery: value.delivery === true,\n dineIn: (value.dine_in ?? value.dineIn) === true,\n scheduling: (value.scheduling ?? value.scheduled) === true,\n };\n };\n const source = record(value);\n const brand = record(source.brand ?? {});\n const branches: Branch[] = list(source.branches).map((raw) => {\n const branch = record(raw);\n const pickup = record(branch.pickup_address ?? {});\n const pickupCoordinates = coordinates(pickup.coordinates);\n const pickupAddress = {\n ...opt(\"placeId\", pickup.place_id, isString),\n ...(pickupCoordinates ? { coordinates: pickupCoordinates } : {}),\n };\n const address =\n typeof branch.address === \"string\"\n ? branch.address\n : branch.address\n ? Object.values(record(branch.address))\n .filter((entry) => typeof entry === \"string\")\n .join(\", \")\n : undefined;\n const addressFields =\n branch.address && typeof branch.address === \"object\"\n ? record(branch.address)\n : {};\n const branchCoordinates = coordinates(addressFields);\n return {\n id: text(branch.id),\n slug: text(branch.slug ?? branch.id),\n name: text(branch.name),\n openingTimes: hours(branch.opening_times ?? branch.hours),\n isOpen: branch.is_open === true,\n fulfilment: fulfilment(branch.fulfilment),\n ...(address !== undefined ? { address } : {}),\n ...(isString(branch.phone) ? { phone: branch.phone.trim() } : {}),\n ...opt(\"timezone\", branch.timezone, isString),\n ...(branchCoordinates ? { coordinates: branchCoordinates } : {}),\n ...opt(\"closedUntil\", branch.closed_until, isString),\n ...opt(\"nextChangeAt\", branch.next_change_at, isString),\n ...opt(\"isDefault\", branch.is_default, isBoolean),\n ...(Object.keys(pickupAddress).length > 0 ? { pickupAddress } : {}),\n ...(branch.social_links !== undefined\n ? {\n socialLinks: list(branch.social_links).flatMap((rawLink) => {\n const link = record(rawLink);\n // Templates render these as links; only http(s) URLs are kept.\n try {\n const url = new URL(text(link.url));\n return isString(link.type) &&\n (url.protocol === \"https:\" || url.protocol === \"http:\")\n ? [{ type: link.type, url: url.href }]\n : [];\n } catch {\n return [];\n }\n }),\n }\n : {}),\n ...(branch.minimum_order\n ? { minimumOrder: mapMoney(branch.minimum_order) }\n : {}),\n ...(branch.special_hours\n ? {\n specialHours: list(branch.special_hours).map((rawHours) => {\n const special = record(rawHours);\n return {\n date: text(special.date),\n closed: special.closed === true,\n ...opt(\"opens\", special.open, isString),\n ...opt(\"closes\", special.close, isString),\n };\n }),\n }\n : {}),\n };\n });\n const allowed = [\n \"card\",\n \"bank_transfer\",\n \"wallet\",\n \"zap\",\n \"apple_pay\",\n \"google_pay\",\n ];\n const paymentMethods = list(source.payment_methods)\n .map(text)\n .filter((method) => {\n if (allowed.includes(method)) {\n return true;\n }\n console.warn(\n `Zappie payment method \"${method}\" is newer than this SDK and was skipped`,\n );\n return false;\n });\n const aggregate = {\n pickup: false,\n delivery: false,\n dineIn: false,\n scheduling: false,\n };\n for (const branch of branches) {\n for (const key of Object.keys(aggregate) as (keyof Fulfilment)[]) {\n aggregate[key] ||= branch.fulfilment[key];\n }\n }\n const accent =\n brand.accent ?? (brand.colors ? record(brand.colors).accent : undefined);\n const templateSettings = record(source.template_settings ?? {}) as Record<\n string,\n string | number | boolean\n >;\n return {\n id: text(source.id),\n slug: text(source.slug),\n name: text(source.name),\n currency: money(0, text(source.currency) as Currency).currency,\n timezone: text(source.timezone),\n ...opt(\"description\", source.description, isString),\n ...(source.template_settings !== undefined ? { templateSettings } : {}),\n brand: {\n ...opt(\"logoUrl\", brand.logo_url, isString),\n ...opt(\"coverImageUrl\", brand.cover_image_url, isString),\n ...(isString(accent) ? { accent } : {}),\n },\n fulfilment: source.fulfilment ? fulfilment(source.fulfilment) : aggregate,\n paymentMethods: paymentMethods as Store[\"paymentMethods\"],\n branches,\n };\n}\n"]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/transport/store.ts"],
4
+ "sourcesContent": ["import type { Branch, Fulfilment, OpeningTime, Store } from \"../models\";\nimport type { Currency, Money } from \"../money\";\n\ntype Guard<T> = (value: unknown) => value is T;\ntype Optional = <K extends string, T>(\n key: K,\n value: unknown,\n is: Guard<T>,\n) => { [P in K]?: T };\n\n/** Core parsing helpers are passed in, in this order, so this lazy entry has no runtime import. */\nexport function mapStore(\n value: unknown,\n record: (value: unknown) => Record<string, unknown>,\n text: (value: unknown) => string,\n list: (value: unknown) => unknown[],\n hours: (value: unknown) => OpeningTime[],\n mapMoney: (value: unknown) => Money,\n money: (amountMinor: number, currency: Currency) => Money,\n opt: Optional,\n isString: Guard<string>,\n isBoolean: Guard<boolean>,\n): Store {\n const coordinates = (input: unknown) => {\n const coordinates = record(input ?? {});\n return typeof coordinates.lat === \"number\" &&\n typeof coordinates.lng === \"number\"\n ? { lat: coordinates.lat, lng: coordinates.lng }\n : undefined;\n };\n const fulfilment = (input: unknown): Fulfilment => {\n const value = record(input);\n return {\n pickup: value.pickup === true,\n delivery: value.delivery === true,\n dineIn: (value.dine_in ?? value.dineIn) === true,\n scheduling: (value.scheduling ?? value.scheduled) === true,\n };\n };\n const source = record(value);\n const brand = record(source.brand ?? {});\n const branches: Branch[] = list(source.branches).map((raw) => {\n const branch = record(raw);\n const pickup = record(branch.pickup_address ?? {});\n const pickupCoordinates = coordinates(pickup.coordinates);\n const pickupAddress = {\n ...opt(\"placeId\", pickup.place_id, isString),\n ...(pickupCoordinates ? { coordinates: pickupCoordinates } : {}),\n };\n const address =\n typeof branch.address === \"string\"\n ? branch.address\n : branch.address\n ? Object.values(record(branch.address))\n .filter((entry) => typeof entry === \"string\")\n .join(\", \")\n : undefined;\n const addressFields =\n branch.address && typeof branch.address === \"object\"\n ? record(branch.address)\n : {};\n const branchCoordinates = coordinates(addressFields);\n return {\n id: text(branch.id),\n slug: text(branch.slug ?? branch.id),\n name: text(branch.name),\n openingTimes: hours(branch.opening_times ?? branch.hours),\n isOpen: branch.is_open === true,\n fulfilment: fulfilment(branch.fulfilment),\n ...(address !== undefined ? { address } : {}),\n ...(isString(branch.phone) ? { phone: branch.phone.trim() } : {}),\n ...opt(\"timezone\", branch.timezone, isString),\n ...(branchCoordinates ? { coordinates: branchCoordinates } : {}),\n ...opt(\"closedUntil\", branch.closed_until, isString),\n ...opt(\"nextChangeAt\", branch.next_change_at, isString),\n ...opt(\"isDefault\", branch.is_default, isBoolean),\n ...(Object.keys(pickupAddress).length > 0 ? { pickupAddress } : {}),\n ...(branch.social_links !== undefined\n ? {\n socialLinks: list(branch.social_links).flatMap((rawLink) => {\n const link = record(rawLink);\n // Templates render these as links; only http(s) URLs are kept.\n try {\n const url = new URL(text(link.url));\n return isString(link.type) &&\n (url.protocol === \"https:\" || url.protocol === \"http:\")\n ? [{ type: link.type, url: url.href }]\n : [];\n } catch {\n return [];\n }\n }),\n }\n : {}),\n ...(branch.minimum_order\n ? { minimumOrder: mapMoney(branch.minimum_order) }\n : {}),\n ...(branch.special_hours\n ? {\n specialHours: list(branch.special_hours).map((rawHours) => {\n const special = record(rawHours);\n return {\n date: text(special.date),\n closed: special.closed === true,\n ...opt(\"opens\", special.open, isString),\n ...opt(\"closes\", special.close, isString),\n };\n }),\n }\n : {}),\n };\n });\n const allowed = [\n \"card\",\n \"bank_transfer\",\n \"wallet\",\n \"zap\",\n \"apple_pay\",\n \"google_pay\",\n ];\n const paymentMethods = list(source.payment_methods)\n .map(text)\n .filter((method) => {\n if (allowed.includes(method)) {\n return true;\n }\n console.warn(\n `Zappie payment method \"${method}\" is newer than this SDK and was skipped`,\n );\n return false;\n });\n const aggregate = {\n pickup: false,\n delivery: false,\n dineIn: false,\n scheduling: false,\n };\n for (const branch of branches) {\n for (const key of Object.keys(aggregate) as (keyof Fulfilment)[]) {\n aggregate[key] ||= branch.fulfilment[key];\n }\n }\n const accent =\n brand.accent ?? (brand.colors ? record(brand.colors).accent : undefined);\n const templateSettings = record(source.template_settings ?? {}) as Record<\n string,\n string | number | boolean\n >;\n return {\n id: text(source.id),\n slug: text(source.slug),\n name: text(source.name),\n currency: money(0, text(source.currency) as Currency).currency,\n timezone: text(source.timezone),\n ...opt(\"description\", source.description, isString),\n ...(source.template_settings !== undefined ? { templateSettings } : {}),\n brand: {\n ...opt(\"logoUrl\", brand.logo_url, isString),\n ...opt(\"coverImageUrl\", brand.cover_image_url, isString),\n ...(isString(accent) ? { accent } : {}),\n },\n fulfilment: source.fulfilment ? fulfilment(source.fulfilment) : aggregate,\n paymentMethods: paymentMethods as Store[\"paymentMethods\"],\n branches,\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["coordinates", "value"]
7
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
package/dist/url/index.js CHANGED
@@ -1,2 +1,16 @@
1
- var u="review-menu",m="payment",E="send-otp",R=new Set([E,"verify-otp","update-profile"]),h=t=>t.contract!=="v1"&&t.installation!==void 0,k=t=>({type:"order-menu",business:t.business,...t.branch!==void 0?{branch:t.branch}:{},state:t.state});var S=["ref","utm_source","payment_id","context","prefetch","business_tag","pay_point_id","dine_in_order_id","no_context","payment_context_id","ws","preview","device","auto_scroll","pickup","branch_closed","order_id","modal_id","lightbox","menu_id","payment_method","beacon_id","menu_group_id","category_id","menu_layout","can_schedule","refresh","success","grant","portal","can_download_receipt","auth_modal_id","experimental_otp","branch","business","env","switched_branch","from","template","catalog_rendering","catalogue_search","catalogue_categories"],b=[...S,"return","session"];var Y="https://storefront.invalid",l="product_",v=t=>{try{return decodeURIComponent(t)}catch{return t}},a=t=>encodeURIComponent(t),d=t=>{if(t instanceof URL)return new URL(t.toString());let e=typeof t=="string"?t:t.url;return new URL(e,Y)},G=(t,e)=>{let r={};return t.forEach((o,s)=>{(e==="v2"?b:S).includes(s)&&(r[s]=o);}),r},I=(t,e="v2")=>{let r=G(t.searchParams,e),o=t.searchParams.get("pickup");return {query:r,...t.searchParams.has("menu_id")?{menuId:t.searchParams.get("menu_id")??""}:{},...t.searchParams.has("category_id")?{categoryId:t.searchParams.get("category_id")??""}:{},...t.searchParams.has("menu_layout")?{menuLayout:t.searchParams.get("menu_layout")??""}:{},...o==="true"?{mode:"pickup"}:o==="false"?{mode:"delivery"}:{},...t.searchParams.has("modal_id")?{modalId:t.searchParams.get("modal_id")??""}:{},...t.searchParams.has("auth_modal_id")?{authModalId:t.searchParams.get("auth_modal_id")??""}:{},...t.searchParams.has("payment_id")?{paymentId:t.searchParams.get("payment_id")??""}:{},...t.searchParams.has("lightbox")?{lightbox:t.searchParams.get("lightbox")??""}:{},...t.searchParams.has("catalogue_search")?{catalogueSearch:t.searchParams.get("catalogue_search")??""}:{},...t.searchParams.has("catalogue_categories")?{catalogueCategories:t.searchParams.get("catalogue_categories")??""}:{}}};var y=t=>t.replace(/\/+$/,"")||"/",A=(t,e)=>{if(!e)return t;let r=`/order/${a(e.business)}`;if(t==="/")return r;if(t==="/order")return e.defaultBranch?`${r}/${a(e.defaultBranch)}`:r;if(t.startsWith("/pages/"))return `${r}${t}`;if(!t.startsWith("/order/")||t===r||t.startsWith(`${r}/`))return t;let o=t.slice(6);return e.defaultBranch&&(o==="/products"||o.startsWith("/products/")||o.startsWith("/pages/"))?`${r}/${a(e.defaultBranch)}${o}`:`${r}${o}`},M=(t,e,r)=>{if(!r||!("business"in e)||e.business!==r.business)return t;if(e.type==="content-page"&&!e.branch)return `/pages/${a(e.slug)}`;if(e.type==="order-menu"&&!e.branch)return "/";let o=`/order/${a(e.business)}/${a(e.branch??"")}`,s=t.slice(o.length);return e.branch===r.defaultBranch?`/order${s}`:`/order/${a(e.branch??"")}${s}`},p=(t,e)=>v(t[e]??"");var L=t=>{let e=new URLSearchParams(t.state.query),r=t.state;return [["menu_id",r.menuId],["category_id",r.categoryId],["menu_layout",r.menuLayout],["pickup",r.mode?String(r.mode==="pickup"):void 0],["modal_id",r.modalId],["auth_modal_id",r.authModalId],["payment_id",r.paymentId],["lightbox",r.lightbox],["catalogue_search",r.catalogueSearch],["catalogue_categories",r.catalogueCategories]].forEach(([s,n])=>{n!==void 0&&e.set(s,n);}),e},W=t=>{let e=L(t);return t.type==="item"?e.delete("modal_id"):t.type==="cart"?e.set("modal_id",u):t.type==="checkout"?e.set("modal_id",m):t.type==="sign-in"?(e.set("auth_modal_id",E),t.returnTo!==void 0&&e.set("return",t.returnTo)):t.type==="checkout-return"&&t.session!==void 0&&e.set("session",t.session),e.sort(),e},U=(t,e)=>{let r=L(t);return (t.type==="order-menu"||t.type==="item"||t.type==="cart"||t.type==="checkout"||t.type==="checkout-return"||t.type==="sign-in"||t.type==="content-page")&&(t.branch&&t.branch!==e.defaultBranch?r.set("branch",t.branch):r.delete("branch")),(t.type==="item"||t.type==="cart"||t.type==="checkout"||t.type==="checkout-return")&&r.delete("modal_id"),t.type==="sign-in"&&(r.delete("auth_modal_id"),t.returnTo!==void 0&&r.set("return",t.returnTo)),t.type==="checkout-return"&&t.session!==void 0&&r.set("session",t.session),r.sort(),r};var P=(t,e={})=>{switch(t.type){case "order-menu":return `/order/${a(t.business)}${t.branch?`/${a(t.branch)}`:""}${t.cataloguePath?"/products":""}`;case "item":{let r=t.branch??e.installation?.defaultBranch;return r?`/order/${a(t.business)}/${a(r)}/products/${a(t.item)}`:`/order/${a(t.business)}`}case "cart":case "checkout":case "checkout-return":case "sign-in":return P(k(t),e);case "content-page":return `/order/${a(t.business)}${t.branch?`/${a(t.branch)}`:""}/pages/${a(t.slug)}`;case "dine-in":return `/dine-in/${a(t.order)}`;case "dine-in-menus":return "/dine-in/menus";case "self-service-menus":return "/self-service/menus";case "pay-point":return `/pay-point/${a(t.payPoint)}`;case "beacon":return `/beacons/${a(t.beacon)}`;case "link":return `/links/${a(t.link)}`;case "collect-payment":return "/collect-payment";case "reservation":return "/reservation";case "pay-session":return `/pay/${a(t.session)}`;case "payment-step":return `/payment/${a(t.payment)}${t.step==="payment"?"":`/${t.step}`}`;case "payment-card":return `/payment/card/${a(t.transaction)}`;case "profile":return `/profile/${t.page}${t.order?`/${a(t.order)}`:""}`;case "explore":return t.home?"/":"/explore";case "unknown":return t.pathname||"/"}},w=(t,e={})=>{let r=P(t,e),o=t.type==="item"&&t.branch===void 0&&e.installation?.defaultBranch?{...t,branch:e.installation.defaultBranch}:t,s=M(r,o,e.installation),n=W(t).toString(),c=`${s}${n?`?${n}`:""}`;if(!e.origin)return c;try{return new URL(c,e.origin).toString()}catch{return c}};var O=(t,e)=>{let r=U(t,e);r.delete("auth_modal_id");let o=r.toString();return {type:"sign-in",business:t.business,state:{query:{}},returnTo:`/${o?`?${o}`:""}`}};var K=(t,e)=>{if(t.type!=="order-menu")return t;let r={business:t.business,...t.branch!==void 0?{branch:t.branch}:{},state:t.state};return t.state.authModalId&&R.has(t.state.authModalId)?O(t,e):t.state.modalId?.startsWith(l)?{type:"item",...r,item:t.state.modalId.slice(l.length)}:t.state.modalId===u?{type:"cart",...r}:t.state.modalId===m?{type:"checkout",...r}:t},X=t=>t.page==="orders"?`/orders${t.order?`/${a(t.order)}`:""}`:t.page==="edit"?"/account":`/account/${t.page==="add-store-credit"?"store-credit":t.page}`,z=(t,e)=>{switch(t.type){case "order-menu":return "/";case "item":return `/item/${a(t.item)}`;case "cart":return "/cart";case "checkout":return "/checkout";case "checkout-return":return "/checkout/return";case "sign-in":return "/sign-in";case "content-page":return `/pages/${a(t.slug)}`;case "profile":return X(t);default:return P(t,e)}},N=(t,e)=>{let r=e.installation;if(!r)return "";let o=K(t,r),s=z(o,e),n=U(o,r).toString();return `${s}${n?`?${n}`:""}`};var x=(t,e={})=>{let r=h(e)?N(t,e):w(t,e);if(!e.origin)return r;try{return new URL(r,e.origin).toString()}catch{return r}};var V={"/dine-in/menus":"dine-in-menus","/self-service/menus":"self-service-menus","/collect-payment":"collect-payment","/reservation":"reservation"},D={"dine-in":(t,e)=>({type:"dine-in",order:t,state:e}),"pay-point":(t,e)=>({type:"pay-point",payPoint:t,state:e}),beacons:(t,e)=>({type:"beacon",beacon:t,state:e}),links:(t,e)=>({type:"link",link:t,state:e}),pay:(t,e)=>({type:"pay-session",session:t,state:e})},C=(t,e)=>Object.hasOwn(t,e),_=(t,e={})=>{try{let r=d(t),o=I(r,"v1"),s=A(y(r.pathname),e.installation),n=s.split("/").filter(Boolean);if(n[0]==="order"&&n[1]){let i=p(n,1);if(n[2]==="pages"&&n.length===4)return {type:"content-page",business:i,slug:p(n,3),state:o};let f=n[2]?p(n,2):void 0;if(f&&n[3]==="pages"&&n.length===5)return {type:"content-page",business:i,branch:f,slug:p(n,4),state:o};if(f&&n[3]==="products"&&n[4]&&n.length===5)return {type:"item",business:i,branch:f,item:p(n,4),state:o};if(n.length<=3||n.length===4&&n[3]==="products"){let T=o.modalId?.startsWith(l)?o.modalId.slice(l.length):"";return f&&T?{type:"item",business:i,branch:f,item:T,state:o}:{type:"order-menu",business:i,...f?{branch:f}:{},...n[3]==="products"?{cataloguePath:!0}:{},state:o}}}if(C(V,s))return {type:V[s],state:o};let[c="",g]=n;if(n.length===2&&g&&C(D,c))return D[c](p(n,1),o);if(n[0]==="payment"&&n[1]==="card"&&n[2]&&n.length===3)return {type:"payment-card",transaction:p(n,2),state:o};if(n[0]==="payment"&&n[1]&&n.length<=3){let i=n[2];if(!i||i==="successful"||i==="failed"||i==="refunded")return {type:"payment-step",payment:p(n,1),step:i==="successful"||i==="failed"||i==="refunded"?i:"payment",state:o}}if(n[0]==="orders"&&n.length<=2)return {type:"profile",page:"orders",...n[1]?{order:p(n,1)}:{},state:o};if(n[0]==="profile"&&n[1]&&n.length<=3){let i=n[1];if(i==="add-store-credit"||i==="edit"||i==="payment-methods"||i==="transactions")return {type:"profile",page:i,state:o};if(i==="orders")return {type:"profile",page:i,...n[2]?{order:p(n,2)}:{},state:o}}return s==="/"||s==="/explore"?{type:"explore",...s==="/"?{home:!0}:{},state:o}:{type:"unknown",pathname:s,state:o}}catch{return {type:"unknown",pathname:"",state:{query:{}}}}};var H=t=>t.searchParams.has("branch")?{branch:t.searchParams.get("branch")??""}:{},j=(t,e,r)=>{let o=y(t.pathname),s=o.split("/").filter(Boolean),n=H(t);if(o==="/")return {type:"order-menu",business:r,...n,state:e};if(s[0]==="item"&&s[1]&&s.length===2)return {type:"item",business:r,...n,item:p(s,1),state:e};if(o==="/cart"||o==="/checkout")return {type:o==="/cart"?"cart":"checkout",business:r,...n,state:e};if(o==="/checkout/return"){let c=t.searchParams.get("session");return {type:"checkout-return",business:r,...n,...c!==null?{session:c}:{},state:e}}if(o==="/sign-in"){let c=t.searchParams.get("return");return {type:"sign-in",business:r,...n,...c!==null?{returnTo:c}:{},state:e}}if(s[0]==="pages"&&s[1]&&s.length===2)return {type:"content-page",business:r,...n,slug:p(s,1),state:e};if(s[0]==="orders"&&s.length<=2)return {type:"profile",page:"orders",...s[1]?{order:p(s,1)}:{},state:e};if(s[0]==="account"&&s.length<=2){let c={"payment-methods":"payment-methods",transactions:"transactions","store-credit":"add-store-credit"};if(s.length===1)return {type:"profile",page:"edit",state:e};let g=s[1];if(g&&Object.hasOwn(c,g))return {type:"profile",page:c[g],state:e}}return null},F=(t,e)=>{if(t.type!=="order-menu")return t;let{authModalId:r,modalId:o}=t.state;return r&&R.has(r)?O(t,e):o?.startsWith(l)?{type:"item",business:t.business,...t.branch!==void 0?{branch:t.branch}:{},item:o.slice(l.length),state:t.state}:o===u||o===m?{type:o===u?"cart":"checkout",business:t.business,...t.branch!==void 0?{branch:t.branch}:{},state:t.state}:t},B=(t,e)=>{try{let r=d(t),o=I(r),s=e.installation;if(!s)return _(t,e);let n=j(r,o,s.business);return n?n.type==="order-menu"?F(n,s):n:F(_(t,{...e,contract:"v1"}),s)}catch{return {type:"unknown",pathname:"",state:{query:{}}}}};var $=(t,e={})=>h(e)?B(t,e):_(t,e);var Q=t=>{let e=d(t);return e.searchParams.sort(),`${y(e.pathname)}${e.search}`},q=(t,e={})=>{if(!h(e))return null;try{let r=$(t,e);if(r.type==="unknown")return null;let o=x(r,e);return Q(d(t))===Q(o)?null:o}catch{return null}};
2
- export{b as STOREFRONT_QUERY_PARAMETERS,S as STOREFRONT_V1_QUERY_PARAMETERS,x as buildStorefrontUrl,$ as parseStorefrontUrl,q as storefrontRedirect};//# sourceMappingURL=index.js.map
1
+ // src/url/index.ts
2
+ import {
3
+ STOREFRONT_QUERY_PARAMETERS,
4
+ STOREFRONT_V1_QUERY_PARAMETERS,
5
+ buildStorefrontUrl,
6
+ parseStorefrontUrl,
7
+ storefrontRedirect
8
+ } from "../server/storefront-url/index.js";
9
+ export {
10
+ STOREFRONT_QUERY_PARAMETERS,
11
+ STOREFRONT_V1_QUERY_PARAMETERS,
12
+ buildStorefrontUrl,
13
+ parseStorefrontUrl,
14
+ storefrontRedirect
15
+ };
16
+ //# sourceMappingURL=index.js.map