@zappie/sdk 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/cart/errors.js +13 -0
- package/dist/cart/errors.js.map +7 -0
- package/dist/cart/index.js +768 -0
- package/dist/cart/index.js.map +7 -0
- package/dist/cart/item.js +12 -1
- package/dist/cart/item.js.map +7 -1
- package/dist/cart/preview.js +32 -0
- package/dist/cart/preview.js.map +7 -0
- package/dist/cart/price.js +25 -0
- package/dist/cart/price.js.map +7 -0
- package/dist/cart/quote-client.js +76 -0
- package/dist/cart/quote-client.js.map +7 -0
- package/dist/cart/quote-response.js +178 -0
- package/dist/cart/quote-response.js.map +7 -0
- package/dist/cart/reconcile.js +108 -0
- package/dist/cart/reconcile.js.map +7 -0
- package/dist/cart/source-menu.js +21 -0
- package/dist/cart/source-menu.js.map +7 -0
- package/dist/cart/storage.js +174 -0
- package/dist/cart/storage.js.map +7 -0
- package/dist/cart/types.js +1 -0
- package/dist/cart/types.js.map +7 -0
- package/dist/cart/validate.js +265 -0
- package/dist/cart/validate.js.map +7 -0
- package/dist/cart/wire.js +42 -0
- package/dist/cart/wire.js.map +7 -0
- package/dist/cart/working-set.js +80 -0
- package/dist/cart/working-set.js.map +7 -0
- package/dist/checkout/client.js +102 -0
- package/dist/checkout/client.js.map +7 -0
- package/dist/checkout/error.js +21 -0
- package/dist/checkout/error.js.map +7 -0
- package/dist/checkout/index.js +13 -1
- package/dist/checkout/index.js.map +7 -1
- package/dist/checkout/readiness.js +36 -0
- package/dist/checkout/readiness.js.map +7 -0
- package/dist/checkout/sdk.js +9 -0
- package/dist/checkout/sdk.js.map +7 -0
- package/dist/checkout/session.js +58 -0
- package/dist/checkout/session.js.map +7 -0
- package/dist/checkout/types.js +1 -0
- package/dist/checkout/types.js.map +7 -0
- package/dist/client.js +253 -0
- package/dist/client.js.map +7 -0
- package/dist/config/index.js +13 -1
- package/dist/config/index.js.map +7 -0
- package/dist/config.js +28 -0
- package/dist/config.js.map +7 -0
- package/dist/customer/client.js +149 -0
- package/dist/customer/client.js.map +7 -0
- package/dist/customer/error.js +20 -0
- package/dist/customer/error.js.map +7 -0
- package/dist/customer/index.js +8 -3
- package/dist/customer/index.js.map +7 -1
- package/dist/customer/navigation.js +45 -0
- package/dist/customer/navigation.js.map +7 -0
- package/dist/customer/react.js +67 -2
- package/dist/customer/react.js.map +7 -1
- package/dist/customer/request.js +37 -0
- package/dist/customer/request.js.map +7 -0
- package/dist/customer/sdk.js +6 -0
- package/dist/customer/sdk.js.map +7 -0
- package/dist/customer/types.js +1 -0
- package/dist/customer/types.js.map +7 -0
- package/dist/customer/watch-order.js +80 -0
- package/dist/customer/watch-order.js.map +7 -0
- package/dist/debug.js +78 -1
- package/dist/debug.js.map +7 -1
- package/dist/errors.js +69 -0
- package/dist/errors.js.map +7 -0
- package/dist/index.js +29 -1
- package/dist/index.js.map +7 -1
- package/dist/internal/abort.js +29 -0
- package/dist/internal/abort.js.map +7 -0
- package/dist/internal/cache.js +142 -0
- package/dist/internal/cache.js.map +7 -0
- package/dist/internal/customer-http.js +74 -0
- package/dist/internal/customer-http.js.map +7 -0
- package/dist/internal/digest.js +15 -0
- package/dist/internal/digest.js.map +7 -0
- package/dist/internal/emitter.js +27 -0
- package/dist/internal/emitter.js.map +7 -0
- package/dist/internal/money-math.js +30 -0
- package/dist/internal/money-math.js.map +7 -0
- package/dist/internal.js +9 -1
- package/dist/internal.js.map +7 -1
- package/dist/models.js +1 -0
- package/dist/models.js.map +7 -0
- package/dist/money.js +58 -0
- package/dist/money.js.map +7 -0
- package/dist/persist/catalogue.js +206 -2
- package/dist/persist/catalogue.js.map +7 -1
- package/dist/places/client.js +97 -0
- package/dist/places/client.js.map +7 -0
- package/dist/places/error.js +20 -0
- package/dist/places/error.js.map +7 -0
- package/dist/places/index.js +8 -1
- package/dist/places/index.js.map +7 -1
- package/dist/places/request.js +40 -0
- package/dist/places/request.js.map +7 -0
- package/dist/places/sdk.js +10 -0
- package/dist/places/sdk.js.map +7 -0
- package/dist/places/search.js +80 -0
- package/dist/places/search.js.map +7 -0
- package/dist/places/types.js +1 -0
- package/dist/places/types.js.map +7 -0
- package/dist/react/cart.js +30 -0
- package/dist/react/cart.js.map +7 -0
- package/dist/react/hooks.js +91 -0
- package/dist/react/hooks.js.map +7 -0
- package/dist/react/index.js +18 -1
- package/dist/react/index.js.map +7 -1
- package/dist/react/provider.js +34 -0
- package/dist/react/provider.js.map +7 -0
- package/dist/server/index.js +32 -2
- package/dist/server/index.js.map +7 -1
- package/dist/server/storefront-url/build-v1.js +75 -0
- package/dist/server/storefront-url/build-v1.js.map +7 -0
- package/dist/server/storefront-url/build-v2.js +79 -0
- package/dist/server/storefront-url/build-v2.js.map +7 -0
- package/dist/server/storefront-url/build.js +19 -0
- package/dist/server/storefront-url/build.js.map +7 -0
- package/dist/server/storefront-url/contract.js +25 -0
- package/dist/server/storefront-url/contract.js.map +7 -0
- package/dist/server/storefront-url/index.js +16 -0
- package/dist/server/storefront-url/index.js.map +7 -0
- package/dist/server/storefront-url/installation.js +58 -0
- package/dist/server/storefront-url/installation.js.map +7 -0
- package/dist/server/storefront-url/params.js +72 -0
- package/dist/server/storefront-url/params.js.map +7 -0
- package/dist/server/storefront-url/parse-v1.js +135 -0
- package/dist/server/storefront-url/parse-v1.js.map +7 -0
- package/dist/server/storefront-url/parse-v2.js +139 -0
- package/dist/server/storefront-url/parse-v2.js.map +7 -0
- package/dist/server/storefront-url/parse.js +9 -0
- package/dist/server/storefront-url/parse.js.map +7 -0
- package/dist/server/storefront-url/redirect.js +30 -0
- package/dist/server/storefront-url/redirect.js.map +7 -0
- package/dist/server/storefront-url/sign-in.js +17 -0
- package/dist/server/storefront-url/sign-in.js.map +7 -0
- package/dist/server/storefront-url/types.js +55 -0
- package/dist/server/storefront-url/types.js.map +7 -0
- package/dist/server/storefront-url/url.js +61 -0
- package/dist/server/storefront-url/url.js.map +7 -0
- package/dist/server/webhook.js +96 -0
- package/dist/server/webhook.js.map +7 -0
- package/dist/site-config/helpers.js +59 -0
- package/dist/site-config/helpers.js.map +7 -0
- package/dist/site-config/sections.js +105 -0
- package/dist/site-config/sections.js.map +7 -0
- package/dist/site-config/types.js +31 -0
- package/dist/site-config/types.js.map +7 -0
- package/dist/site-config/validate.js +165 -0
- package/dist/site-config/validate.js.map +7 -0
- package/dist/template/index.js +46 -3
- package/dist/template/index.js.map +7 -1
- package/dist/template/react.js +81 -2
- package/dist/template/react.js.map +7 -1
- package/dist/testing/index.js +451 -2
- package/dist/testing/index.js.map +7 -1
- package/dist/transport/category-page.js +21 -2
- package/dist/transport/category-page.js.map +7 -1
- package/dist/transport/mappers.js +336 -0
- package/dist/transport/mappers.js.map +7 -0
- package/dist/transport/rest.js +313 -0
- package/dist/transport/rest.js.map +7 -0
- package/dist/transport/search.js +32 -2
- package/dist/transport/search.js.map +7 -1
- package/dist/transport/selected-menu.js +79 -2
- package/dist/transport/selected-menu.js.map +7 -1
- package/dist/transport/store.js +118 -2
- package/dist/transport/store.js.map +7 -1
- package/dist/transport/types.js +1 -0
- package/dist/transport/types.js.map +7 -0
- package/dist/url/index.js +16 -2
- package/dist/url/index.js.map +7 -1
- package/dist/visits/index.js +62 -1
- package/dist/visits/index.js.map +7 -1
- package/dist/visits/page-views.js +103 -0
- package/dist/visits/page-views.js.map +7 -0
- package/package.json +3 -3
- package/dist/cart/quote.js +0 -1
- package/dist/cart/quote.js.map +0 -1
- package/dist/chunk-I55A5QXJ.js +0 -2
- package/dist/chunk-I55A5QXJ.js.map +0 -1
- package/dist/chunk-LFBQICYU.js +0 -2
- package/dist/chunk-LFBQICYU.js.map +0 -1
|
@@ -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":"AAWO,SAASA,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACO,CACP,IAAMC,CAAAA,CAAeC,CAAAA,EAAmB,CACtC,IAAMD,CAAAA,CAAcT,CAAAA,CAAOU,CAAAA,EAAS,EAAE,CAAA,CACtC,OAAO,OAAOD,CAAAA,CAAY,GAAA,EAAQ,QAAA,EAChC,OAAOA,CAAAA,CAAY,KAAQ,QAAA,CACzB,CAAE,GAAA,CAAKA,CAAAA,CAAY,GAAA,CAAK,GAAA,CAAKA,CAAAA,CAAY,GAAI,EAC7C,MACN,CAAA,CACME,CAAAA,CAAcD,CAAAA,EAA+B,CACjD,IAAMX,CAAAA,CAAQC,CAAAA,CAAOU,CAAK,CAAA,CAC1B,OAAO,CACL,MAAA,CAAQX,CAAAA,CAAM,MAAA,GAAW,IAAA,CACzB,QAAA,CAAUA,EAAM,QAAA,GAAa,IAAA,CAC7B,MAAA,CAAA,CAASA,CAAAA,CAAM,OAAA,EAAWA,CAAAA,CAAM,MAAA,IAAY,IAAA,CAC5C,YAAaA,CAAAA,CAAM,UAAA,EAAcA,CAAAA,CAAM,SAAA,IAAe,IACxD,CACF,CAAA,CACMa,CAAAA,CAASZ,EAAOD,CAAK,CAAA,CACrBc,CAAAA,CAAQb,CAAAA,CAAOY,CAAAA,CAAO,KAAA,EAAS,EAAE,EACjCE,CAAAA,CAAqBZ,CAAAA,CAAKU,CAAAA,CAAO,QAAQ,CAAA,CAAE,GAAA,CAAKG,CAAAA,EAAQ,CAC5D,IAAMC,CAAAA,CAAShB,CAAAA,CAAOe,CAAG,CAAA,CACnBE,CAAAA,CAASjB,CAAAA,CAAOgB,CAAAA,CAAO,cAAA,EAAkB,EAAE,CAAA,CAC3CE,CAAAA,CAAoBT,CAAAA,CAAYQ,CAAAA,CAAO,WAAW,CAAA,CAClDE,CAAAA,CAAgB,CACpB,GAAGb,CAAAA,CAAI,SAAA,CAAWW,CAAAA,CAAO,QAAA,CAAUV,CAAQ,CAAA,CAC3C,GAAIW,EAAoB,CAAE,WAAA,CAAaA,CAAkB,CAAA,CAAI,EAC/D,CAAA,CACME,CAAAA,CACJ,OAAOJ,CAAAA,CAAO,OAAA,EAAY,QAAA,CACtBA,CAAAA,CAAO,OAAA,CACPA,CAAAA,CAAO,OAAA,CACL,MAAA,CAAO,OAAOhB,CAAAA,CAAOgB,CAAAA,CAAO,OAAO,CAAC,CAAA,CACjC,MAAA,CAAQK,CAAAA,EAAU,OAAOA,GAAU,QAAQ,CAAA,CAC3C,IAAA,CAAK,IAAI,CAAA,CACZ,MAAA,CACFC,CAAAA,CACJN,CAAAA,CAAO,SAAW,OAAOA,CAAAA,CAAO,OAAA,EAAY,QAAA,CACxChB,CAAAA,CAAOgB,CAAAA,CAAO,OAAO,CAAA,CACrB,EAAC,CACDO,CAAAA,CAAoBd,CAAAA,CAAYa,CAAa,CAAA,CACnD,OAAO,CACL,EAAA,CAAIrB,EAAKe,CAAAA,CAAO,EAAE,CAAA,CAClB,IAAA,CAAMf,CAAAA,CAAKe,CAAAA,CAAO,IAAA,EAAQA,CAAAA,CAAO,EAAE,CAAA,CACnC,IAAA,CAAMf,CAAAA,CAAKe,CAAAA,CAAO,IAAI,CAAA,CACtB,YAAA,CAAcb,CAAAA,CAAMa,EAAO,aAAA,EAAiBA,CAAAA,CAAO,KAAK,CAAA,CACxD,MAAA,CAAQA,CAAAA,CAAO,OAAA,GAAY,IAAA,CAC3B,WAAYL,CAAAA,CAAWK,CAAAA,CAAO,UAAU,CAAA,CACxC,GAAII,CAAAA,GAAY,MAAA,CAAY,CAAE,QAAAA,CAAQ,CAAA,CAAI,EAAC,CAC3C,GAAIb,CAAAA,CAASS,CAAAA,CAAO,KAAK,EAAI,CAAE,KAAA,CAAOA,CAAAA,CAAO,KAAA,CAAM,IAAA,EAAO,CAAA,CAAI,GAC9D,GAAGV,CAAAA,CAAI,UAAA,CAAYU,CAAAA,CAAO,QAAA,CAAUT,CAAQ,CAAA,CAC5C,GAAIgB,EAAoB,CAAE,WAAA,CAAaA,CAAkB,CAAA,CAAI,EAAC,CAC9D,GAAGjB,CAAAA,CAAI,cAAeU,CAAAA,CAAO,YAAA,CAAcT,CAAQ,CAAA,CACnD,GAAGD,CAAAA,CAAI,cAAA,CAAgBU,CAAAA,CAAO,eAAgBT,CAAQ,CAAA,CACtD,GAAGD,CAAAA,CAAI,WAAA,CAAaU,CAAAA,CAAO,UAAA,CAAYR,CAAS,EAChD,GAAI,MAAA,CAAO,IAAA,CAAKW,CAAa,CAAA,CAAE,MAAA,CAAS,CAAA,CAAI,CAAE,cAAAA,CAAc,CAAA,CAAI,EAAC,CACjE,GAAIH,CAAAA,CAAO,YAAA,GAAiB,MAAA,CACxB,CACE,WAAA,CAAad,CAAAA,CAAKc,CAAAA,CAAO,YAAY,CAAA,CAAE,OAAA,CAASQ,CAAAA,EAAY,CAC1D,IAAMC,CAAAA,CAAOzB,CAAAA,CAAOwB,CAAO,CAAA,CAE3B,GAAI,CACF,IAAME,EAAM,IAAI,GAAA,CAAIzB,CAAAA,CAAKwB,CAAAA,CAAK,GAAG,CAAC,CAAA,CAClC,OAAOlB,EAASkB,CAAAA,CAAK,IAAI,CAAA,GACtBC,CAAAA,CAAI,QAAA,GAAa,QAAA,EAAYA,CAAAA,CAAI,QAAA,GAAa,SAC7C,CAAC,CAAE,IAAA,CAAMD,CAAAA,CAAK,IAAA,CAAM,GAAA,CAAKC,CAAAA,CAAI,IAAK,CAAC,CAAA,CACnC,EACN,CAAA,KAAQ,CACN,OAAO,EACT,CACF,CAAC,CACH,CAAA,CACA,EAAC,CACL,GAAIV,CAAAA,CAAO,aAAA,CACP,CAAE,YAAA,CAAcZ,CAAAA,CAASY,CAAAA,CAAO,aAAa,CAAE,CAAA,CAC/C,EAAC,CACL,GAAIA,CAAAA,CAAO,aAAA,CACP,CACE,YAAA,CAAcd,CAAAA,CAAKc,CAAAA,CAAO,aAAa,CAAA,CAAE,IAAKW,CAAAA,EAAa,CACzD,IAAMC,CAAAA,CAAU5B,CAAAA,CAAO2B,CAAQ,CAAA,CAC/B,OAAO,CACL,IAAA,CAAM1B,CAAAA,CAAK2B,CAAAA,CAAQ,IAAI,CAAA,CACvB,MAAA,CAAQA,CAAAA,CAAQ,MAAA,GAAW,KAC3B,GAAGtB,CAAAA,CAAI,OAAA,CAASsB,CAAAA,CAAQ,IAAA,CAAMrB,CAAQ,CAAA,CACtC,GAAGD,EAAI,QAAA,CAAUsB,CAAAA,CAAQ,KAAA,CAAOrB,CAAQ,CAC1C,CACF,CAAC,CACH,EACA,EACN,CACF,CAAC,CAAA,CACKsB,CAAAA,CAAU,CACd,MAAA,CACA,gBACA,QAAA,CACA,KAAA,CACA,WAAA,CACA,YACF,CAAA,CACMC,CAAAA,CAAiB5B,CAAAA,CAAKU,CAAAA,CAAO,eAAe,CAAA,CAC/C,GAAA,CAAIX,CAAI,CAAA,CACR,MAAA,CAAQ8B,CAAAA,EACHF,CAAAA,CAAQ,QAAA,CAASE,CAAM,CAAA,CAClB,IAAA,EAET,OAAA,CAAQ,IAAA,CACN,CAAA,uBAAA,EAA0BA,CAAM,CAAA,wCAAA,CAClC,CAAA,CACO,MACR,CAAA,CACGC,CAAAA,CAAY,CAChB,MAAA,CAAQ,KAAA,CACR,QAAA,CAAU,KAAA,CACV,MAAA,CAAQ,MACR,UAAA,CAAY,KACd,CAAA,CACA,IAAA,IAAWhB,CAAAA,IAAUF,CAAAA,CACnB,IAAA,IAAWmB,CAAAA,IAAO,OAAO,IAAA,CAAKD,CAAS,CAAA,CACrCA,CAAAA,CAAAC,CAAAA,CAAAA,GAAAD,CAAAA,CAAAC,CAAAA,CAAAA,CAAmBjB,CAAAA,CAAO,WAAWiB,CAAG,CAAA,CAAA,CAG5C,IAAMC,CAAAA,CACJrB,CAAAA,CAAM,MAAA,GAAWA,CAAAA,CAAM,MAAA,CAASb,EAAOa,CAAAA,CAAM,MAAM,CAAA,CAAE,MAAA,CAAS,MAAA,CAAA,CAC1DsB,CAAAA,CAAmBnC,CAAAA,CAAOY,CAAAA,CAAO,mBAAqB,EAAE,CAAA,CAI9D,OAAO,CACL,EAAA,CAAIX,CAAAA,CAAKW,CAAAA,CAAO,EAAE,CAAA,CAClB,IAAA,CAAMX,CAAAA,CAAKW,CAAAA,CAAO,IAAI,CAAA,CACtB,IAAA,CAAMX,CAAAA,CAAKW,EAAO,IAAI,CAAA,CACtB,QAAA,CAAUP,CAAAA,CAAM,CAAA,CAAGJ,CAAAA,CAAKW,CAAAA,CAAO,QAAQ,CAAa,CAAA,CAAE,QAAA,CACtD,QAAA,CAAUX,CAAAA,CAAKW,CAAAA,CAAO,QAAQ,CAAA,CAC9B,GAAGN,EAAI,aAAA,CAAeM,CAAAA,CAAO,WAAA,CAAaL,CAAQ,CAAA,CAClD,GAAIK,CAAAA,CAAO,iBAAA,GAAsB,OAAY,CAAE,gBAAA,CAAAuB,CAAiB,CAAA,CAAI,EAAC,CACrE,KAAA,CAAO,CACL,GAAG7B,CAAAA,CAAI,SAAA,CAAWO,CAAAA,CAAM,QAAA,CAAUN,CAAQ,CAAA,CAC1C,GAAGD,CAAAA,CAAI,gBAAiBO,CAAAA,CAAM,eAAA,CAAiBN,CAAQ,CAAA,CACvD,GAAIA,CAAAA,CAAS2B,CAAM,CAAA,CAAI,CAAE,MAAA,CAAAA,CAAO,CAAA,CAAI,EACtC,CAAA,CACA,UAAA,CAAYtB,CAAAA,CAAO,WAAaD,CAAAA,CAAWC,CAAAA,CAAO,UAAU,CAAA,CAAIoB,CAAAA,CAChE,cAAA,CAAgBF,CAAAA,CAChB,QAAA,CAAAhB,CACF,CACF","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 === true,\n 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 ? text(record(branch.address).line1).trim()\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.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 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 },\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
|
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
|
-
|
|
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
|
package/dist/url/index.js.map
CHANGED
|
@@ -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
|
+
}
|
package/dist/visits/index.js
CHANGED
|
@@ -1 +1,62 @@
|
|
|
1
|
-
|
|
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
|
package/dist/visits/index.js.map
CHANGED
|
@@ -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.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Typed, framework-agnostic client for Zappie menus, carts, checkout, auth and events.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -101,8 +101,8 @@
|
|
|
101
101
|
"url": "https://github.com/zappie/storefront/issues"
|
|
102
102
|
},
|
|
103
103
|
"scripts": {
|
|
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",
|
|
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",
|
|
105
105
|
"test": "vitest run --root ../.. packages/sdk/test",
|
|
106
|
-
"size": "size-limit"
|
|
106
|
+
"size": "node ../../scripts/release-packages/size-sdk.mjs && size-limit"
|
|
107
107
|
}
|
|
108
108
|
}
|
package/dist/cart/quote.js
DELETED
|
@@ -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
|
package/dist/cart/quote.js.map
DELETED
|
@@ -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"]}
|