@shopify/hydrogen-react 2022.10.4 → 2022.10.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/browser-dev/CartProvider.mjs +5 -109
  2. package/dist/browser-dev/CartProvider.mjs.map +1 -1
  3. package/dist/browser-dev/Money.mjs.map +1 -1
  4. package/dist/browser-dev/cart-queries.mjs +207 -59
  5. package/dist/browser-dev/cart-queries.mjs.map +1 -1
  6. package/dist/browser-dev/storefront-client.mjs +12 -5
  7. package/dist/browser-dev/storefront-client.mjs.map +1 -1
  8. package/dist/browser-dev/useCartAPIStateMachine.mjs +6 -3
  9. package/dist/browser-dev/useCartAPIStateMachine.mjs.map +1 -1
  10. package/dist/browser-prod/CartProvider.mjs +5 -109
  11. package/dist/browser-prod/CartProvider.mjs.map +1 -1
  12. package/dist/browser-prod/Money.mjs.map +1 -1
  13. package/dist/browser-prod/cart-queries.mjs +207 -59
  14. package/dist/browser-prod/cart-queries.mjs.map +1 -1
  15. package/dist/browser-prod/storefront-client.mjs +8 -1
  16. package/dist/browser-prod/storefront-client.mjs.map +1 -1
  17. package/dist/browser-prod/useCartAPIStateMachine.mjs +6 -3
  18. package/dist/browser-prod/useCartAPIStateMachine.mjs.map +1 -1
  19. package/dist/node-dev/CartProvider.js +6 -110
  20. package/dist/node-dev/CartProvider.js.map +1 -1
  21. package/dist/node-dev/CartProvider.mjs +5 -109
  22. package/dist/node-dev/CartProvider.mjs.map +1 -1
  23. package/dist/node-dev/Money.js.map +1 -1
  24. package/dist/node-dev/Money.mjs.map +1 -1
  25. package/dist/node-dev/cart-queries.js +206 -58
  26. package/dist/node-dev/cart-queries.js.map +1 -1
  27. package/dist/node-dev/cart-queries.mjs +207 -59
  28. package/dist/node-dev/cart-queries.mjs.map +1 -1
  29. package/dist/node-dev/storefront-client.js +12 -5
  30. package/dist/node-dev/storefront-client.js.map +1 -1
  31. package/dist/node-dev/storefront-client.mjs +12 -5
  32. package/dist/node-dev/storefront-client.mjs.map +1 -1
  33. package/dist/node-dev/useCartAPIStateMachine.js +6 -3
  34. package/dist/node-dev/useCartAPIStateMachine.js.map +1 -1
  35. package/dist/node-dev/useCartAPIStateMachine.mjs +6 -3
  36. package/dist/node-dev/useCartAPIStateMachine.mjs.map +1 -1
  37. package/dist/node-prod/CartProvider.js +6 -110
  38. package/dist/node-prod/CartProvider.js.map +1 -1
  39. package/dist/node-prod/CartProvider.mjs +5 -109
  40. package/dist/node-prod/CartProvider.mjs.map +1 -1
  41. package/dist/node-prod/Money.js.map +1 -1
  42. package/dist/node-prod/Money.mjs.map +1 -1
  43. package/dist/node-prod/cart-queries.js +206 -58
  44. package/dist/node-prod/cart-queries.js.map +1 -1
  45. package/dist/node-prod/cart-queries.mjs +207 -59
  46. package/dist/node-prod/cart-queries.mjs.map +1 -1
  47. package/dist/node-prod/storefront-client.js +8 -1
  48. package/dist/node-prod/storefront-client.js.map +1 -1
  49. package/dist/node-prod/storefront-client.mjs +8 -1
  50. package/dist/node-prod/storefront-client.mjs.map +1 -1
  51. package/dist/node-prod/useCartAPIStateMachine.js +6 -3
  52. package/dist/node-prod/useCartAPIStateMachine.js.map +1 -1
  53. package/dist/node-prod/useCartAPIStateMachine.mjs +6 -3
  54. package/dist/node-prod/useCartAPIStateMachine.mjs.map +1 -1
  55. package/dist/types/CartProvider.d.ts +0 -1
  56. package/dist/types/Money.d.ts +1 -1
  57. package/dist/types/cart-queries.d.ts +1 -1
  58. package/dist/umd/hydrogen-react.dev.js +228 -175
  59. package/dist/umd/hydrogen-react.dev.js.map +1 -1
  60. package/dist/umd/hydrogen-react.prod.js +200 -153
  61. package/dist/umd/hydrogen-react.prod.js.map +1 -1
  62. package/package.json +10 -14
@@ -1 +1 @@
1
- {"version":3,"file":"cart-queries.mjs","sources":["../../src/cart-queries.ts"],"sourcesContent":["export const CartLineAdd = (cartFragment: string) => `\nmutation CartLineAdd($cartId: ID!, $lines: [CartLineInput!]!, $numCartLines: Int = 250, $country: CountryCode = ZZ) @inContext(country: $country) {\n cartLinesAdd(cartId: $cartId, lines: $lines) {\n cart {\n ...CartFragment\n }\n }\n}\n\n${cartFragment}\n`;\n\nexport const CartCreate = (cartFragment: string) => `\nmutation CartCreate($input: CartInput!, $numCartLines: Int = 250, $country: CountryCode = ZZ) @inContext(country: $country) {\n cartCreate(input: $input) {\n cart {\n ...CartFragment\n }\n }\n}\n\n${cartFragment}\n`;\n\nexport const CartLineRemove = (cartFragment: string) => `\nmutation CartLineRemove($cartId: ID!, $lines: [ID!]!, $numCartLines: Int = 250, $country: CountryCode = ZZ) @inContext(country: $country) {\n cartLinesRemove(cartId: $cartId, lineIds: $lines) {\n cart {\n ...CartFragment\n }\n }\n}\n\n${cartFragment}\n`;\n\nexport const CartLineUpdate = (cartFragment: string) => `\nmutation CartLineUpdate($cartId: ID!, $lines: [CartLineUpdateInput!]!, $numCartLines: Int = 250, $country: CountryCode = ZZ) @inContext(country: $country) {\n cartLinesUpdate(cartId: $cartId, lines: $lines) {\n cart {\n ...CartFragment\n }\n }\n}\n\n${cartFragment}\n`;\n\nexport const CartNoteUpdate = (cartFragment: string) => `\nmutation CartNoteUpdate($cartId: ID!, $note: String, $numCartLines: Int = 250, $country: CountryCode = ZZ) @inContext(country: $country) {\n cartNoteUpdate(cartId: $cartId, note: $note) {\n cart {\n ...CartFragment\n }\n }\n}\n\n${cartFragment}\n`;\n\nexport const CartBuyerIdentityUpdate = (cartFragment: string) => `\nmutation CartBuyerIdentityUpdate(\n $cartId: ID!\n $buyerIdentity: CartBuyerIdentityInput!\n $numCartLines: Int = 250\n $country: CountryCode = ZZ\n) @inContext(country: $country) {\n cartBuyerIdentityUpdate(cartId: $cartId, buyerIdentity: $buyerIdentity) {\n cart {\n ...CartFragment\n }\n }\n}\n\n${cartFragment}\n`;\n\nexport const CartAttributesUpdate = (cartFragment: string) => `\nmutation CartAttributesUpdate($attributes: [AttributeInput!]!, $cartId: ID!, $numCartLines: Int = 250, $country: CountryCode = ZZ) @inContext(country: $country) {\n cartAttributesUpdate(attributes: $attributes, cartId: $cartId) {\n cart {\n ...CartFragment\n }\n }\n}\n\n${cartFragment}\n`;\n\nexport const CartDiscountCodesUpdate = (cartFragment: string) => `\nmutation CartDiscountCodesUpdate($cartId: ID!, $discountCodes: [String!], $numCartLines: Int = 250, $country: CountryCode = ZZ) @inContext(country: $country) {\n cartDiscountCodesUpdate(cartId: $cartId, discountCodes: $discountCodes) {\n cart {\n ...CartFragment\n }\n }\n}\n\n${cartFragment}\n`;\n\nexport const CartQuery = (cartFragment: string) => `\nquery CartQuery($id: ID!, $numCartLines: Int = 250, $country: CountryCode = ZZ) @inContext(country: $country) {\n cart(id: $id) {\n ...CartFragment\n }\n}\n\n${cartFragment}\n`;\n\nexport const defaultCartFragment = `\nfragment CartFragment on Cart {\n id\n checkoutUrl\n totalQuantity\n buyerIdentity {\n countryCode\n customer {\n id\n email\n firstName\n lastName\n displayName\n }\n email\n phone\n }\n lines(first: $numCartLines) {\n edges {\n node {\n id\n quantity\n attributes {\n key\n value\n }\n cost {\n totalAmount {\n amount\n currencyCode\n }\n compareAtAmountPerQuantity {\n amount\n currencyCode\n }\n }\n merchandise {\n ... on ProductVariant {\n id\n availableForSale\n compareAtPriceV2 {\n ...MoneyFragment\n }\n priceV2 {\n ...MoneyFragment\n }\n requiresShipping\n title\n image {\n ...ImageFragment\n }\n product {\n handle\n title\n id\n }\n selectedOptions {\n name\n value\n }\n }\n }\n }\n }\n }\n cost {\n subtotalAmount {\n ...MoneyFragment\n }\n totalAmount {\n ...MoneyFragment\n }\n totalDutyAmount {\n ...MoneyFragment\n }\n totalTaxAmount {\n ...MoneyFragment\n }\n }\n note\n attributes {\n key\n value\n }\n discountCodes {\n code\n }\n}\n\nfragment MoneyFragment on MoneyV2 {\n currencyCode\n amount\n}\nfragment ImageFragment on Image {\n id\n url\n altText\n width\n height\n}\n`;\n"],"names":[],"mappings":"AAAa,MAAA,cAAc,CAAC,iBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASnD;AAAA;AAGW,MAAA,aAAa,CAAC,iBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASlD;AAAA;AAGW,MAAA,iBAAiB,CAAC,iBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAStD;AAAA;AAGW,MAAA,iBAAiB,CAAC,iBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAStD;AAAA;AAGW,MAAA,iBAAiB,CAAC,iBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAStD;AAAA;AAGW,MAAA,0BAA0B,CAAC,iBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAc/D;AAAA;AAGW,MAAA,uBAAuB,CAAC,iBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS5D;AAAA;AAGW,MAAA,0BAA0B,CAAC,iBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS/D;AAAA;AAGW,MAAA,YAAY,CAAC,iBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjD;AAAA;"}
1
+ {"version":3,"file":"cart-queries.mjs","sources":["../../src/cart-queries.ts"],"sourcesContent":["export const CartLineAdd = (cartFragment: string) => /* GraphQL */ `\n mutation CartLineAdd(\n $cartId: ID!\n $lines: [CartLineInput!]!\n $numCartLines: Int = 250\n $country: CountryCode = ZZ\n ) @inContext(country: $country) {\n cartLinesAdd(cartId: $cartId, lines: $lines) {\n cart {\n ...CartFragment\n }\n }\n }\n\n ${cartFragment}\n`;\n\nexport const CartCreate = (cartFragment: string) => /* GraphQL */ `\n mutation CartCreate(\n $input: CartInput!\n $numCartLines: Int = 250\n $country: CountryCode = ZZ\n ) @inContext(country: $country) {\n cartCreate(input: $input) {\n cart {\n ...CartFragment\n }\n }\n }\n\n ${cartFragment}\n`;\n\nexport const CartLineRemove = (cartFragment: string) => /* GraphQL */ `\n mutation CartLineRemove(\n $cartId: ID!\n $lines: [ID!]!\n $numCartLines: Int = 250\n $country: CountryCode = ZZ\n ) @inContext(country: $country) {\n cartLinesRemove(cartId: $cartId, lineIds: $lines) {\n cart {\n ...CartFragment\n }\n }\n }\n\n ${cartFragment}\n`;\n\nexport const CartLineUpdate = (cartFragment: string) => /* GraphQL */ `\n mutation CartLineUpdate(\n $cartId: ID!\n $lines: [CartLineUpdateInput!]!\n $numCartLines: Int = 250\n $country: CountryCode = ZZ\n ) @inContext(country: $country) {\n cartLinesUpdate(cartId: $cartId, lines: $lines) {\n cart {\n ...CartFragment\n }\n }\n }\n\n ${cartFragment}\n`;\n\nexport const CartNoteUpdate = (cartFragment: string) => /* GraphQL */ `\n mutation CartNoteUpdate(\n $cartId: ID!\n $note: String\n $numCartLines: Int = 250\n $country: CountryCode = ZZ\n ) @inContext(country: $country) {\n cartNoteUpdate(cartId: $cartId, note: $note) {\n cart {\n ...CartFragment\n }\n }\n }\n\n ${cartFragment}\n`;\n\nexport const CartBuyerIdentityUpdate = (cartFragment: string) => /* GraphQL */ `\n mutation CartBuyerIdentityUpdate(\n $cartId: ID!\n $buyerIdentity: CartBuyerIdentityInput!\n $numCartLines: Int = 250\n $country: CountryCode = ZZ\n ) @inContext(country: $country) {\n cartBuyerIdentityUpdate(cartId: $cartId, buyerIdentity: $buyerIdentity) {\n cart {\n ...CartFragment\n }\n }\n }\n\n ${cartFragment}\n`;\n\nexport const CartAttributesUpdate = (cartFragment: string) => /* GraphQL */ `\n mutation CartAttributesUpdate(\n $attributes: [AttributeInput!]!\n $cartId: ID!\n $numCartLines: Int = 250\n $country: CountryCode = ZZ\n ) @inContext(country: $country) {\n cartAttributesUpdate(attributes: $attributes, cartId: $cartId) {\n cart {\n ...CartFragment\n }\n }\n }\n\n ${cartFragment}\n`;\n\nexport const CartDiscountCodesUpdate = (cartFragment: string) => /* GraphQL */ `\n mutation CartDiscountCodesUpdate(\n $cartId: ID!\n $discountCodes: [String!]\n $numCartLines: Int = 250\n $country: CountryCode = ZZ\n ) @inContext(country: $country) {\n cartDiscountCodesUpdate(cartId: $cartId, discountCodes: $discountCodes) {\n cart {\n ...CartFragment\n }\n }\n }\n\n ${cartFragment}\n`;\n\nexport const CartQuery = (cartFragment: string) => /* GraphQL */ `\n query CartQuery(\n $id: ID!\n $numCartLines: Int = 250\n $country: CountryCode = ZZ\n ) @inContext(country: $country) {\n cart(id: $id) {\n ...CartFragment\n }\n }\n\n ${cartFragment}\n`;\n\nexport const defaultCartFragment = /* GraphQL */ `\n fragment CartFragment on Cart {\n id\n checkoutUrl\n totalQuantity\n buyerIdentity {\n countryCode\n customer {\n id\n email\n firstName\n lastName\n displayName\n }\n email\n phone\n }\n lines(first: $numCartLines) {\n edges {\n node {\n id\n quantity\n attributes {\n key\n value\n }\n cost {\n totalAmount {\n amount\n currencyCode\n }\n compareAtAmountPerQuantity {\n amount\n currencyCode\n }\n }\n merchandise {\n ... on ProductVariant {\n id\n availableForSale\n compareAtPrice {\n ...MoneyFragment\n }\n # @deprecated remove in next major\n compareAtPriceV2 {\n ...MoneyFragment\n }\n price {\n ...MoneyFragment\n }\n # @deprecated remove in next major\n priceV2 {\n ...MoneyFragment\n }\n requiresShipping\n title\n image {\n ...ImageFragment\n }\n product {\n handle\n title\n id\n }\n selectedOptions {\n name\n value\n }\n }\n }\n }\n }\n }\n cost {\n subtotalAmount {\n ...MoneyFragment\n }\n totalAmount {\n ...MoneyFragment\n }\n totalDutyAmount {\n ...MoneyFragment\n }\n totalTaxAmount {\n ...MoneyFragment\n }\n }\n note\n attributes {\n key\n value\n }\n discountCodes {\n code\n }\n }\n\n fragment MoneyFragment on MoneyV2 {\n currencyCode\n amount\n }\n fragment ImageFragment on Image {\n id\n url\n altText\n width\n height\n }\n`;\n"],"names":[],"mappings":"AAAa,MAAA,cAAc,CAAC,iBAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAc/D;AAAA;AAGS,MAAA,aAAa,CAAC,iBAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAa9D;AAAA;AAGS,MAAA,iBAAiB,CAAC,iBAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAclE;AAAA;AAGS,MAAA,iBAAiB,CAAC,iBAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAclE;AAAA;AAGS,MAAA,iBAAiB,CAAC,iBAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAclE;AAAA;AAGS,MAAA,0BAA0B,CAAC,iBAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAc3E;AAAA;AAGS,MAAA,uBAAuB,CAAC,iBAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAcxE;AAAA;AAGS,MAAA,0BAA0B,CAAC,iBAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAc3E;AAAA;AAGS,MAAA,YAAY,CAAC,iBAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAW7D;AAAA;AAGG,MAAM,sBAAoC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}
@@ -1,4 +1,11 @@
1
1
  import { SFAPI_VERSION } from "./storefront-api-constants.mjs";
2
+ const warnings = /* @__PURE__ */ new Set();
3
+ const warnOnce = (string) => {
4
+ if (!warnings.has(string)) {
5
+ console.warn(string);
6
+ warnings.add(string);
7
+ }
8
+ };
2
9
  function createStorefrontClient({
3
10
  storeDomain,
4
11
  privateStorefrontToken,
@@ -7,17 +14,17 @@ function createStorefrontClient({
7
14
  contentType
8
15
  }) {
9
16
  if (storefrontApiVersion !== SFAPI_VERSION) {
10
- console.warn(
17
+ warnOnce(
11
18
  `StorefrontClient: The Storefront API version that you're using is different than the version this build of Hydrogen-UI is targeting. You may run into unexpected errors if these versions don't match. Received verion: "${storefrontApiVersion}"; expected version "${SFAPI_VERSION}"`
12
19
  );
13
20
  }
14
21
  if (!privateStorefrontToken && !globalThis.document) {
15
- console.warn(
16
- `StorefrontClient: Using a private storefront token is recommended for server environments. Refer to the authentication https://shopify.dev/api/storefront#authentication documentation for more details. `
22
+ warnOnce(
23
+ `StorefrontClient: Using a private storefront token is recommended for server environments. Refer to the authentication https://shopify.dev/api/storefront#authentication documentation for more details.`
17
24
  );
18
25
  }
19
26
  if (privateStorefrontToken && globalThis) {
20
- console.warn(
27
+ warnOnce(
21
28
  `StorefrontClient: You are attempting to use a private token in an environment where it can be easily accessed by anyone. This is a security risk; please use the public token and the 'publicStorefrontToken' prop`
22
29
  );
23
30
  }
@@ -38,7 +45,7 @@ function createStorefrontClient({
38
45
  );
39
46
  }
40
47
  if (!(overrideProps == null ? void 0 : overrideProps.buyerIp)) {
41
- console.warn(
48
+ warnOnce(
42
49
  `StorefrontClient: it is recommended to pass in the 'buyerIp' property which improves analytics and data in the admin.`
43
50
  );
44
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"storefront-client.mjs","sources":["../../src/storefront-client.ts"],"sourcesContent":["import {SFAPI_VERSION} from './storefront-api-constants.js';\n\n/**\n * The `createStorefrontClient()` function creates helpers that enable you to quickly query the Shopify Storefront API.\n *\n * When used on the server, it is recommended to use the `privateStorefrontToken` prop. When used on the client, it is recommended to use the `publicStorefrontToken` prop.\n */\nexport function createStorefrontClient({\n storeDomain,\n privateStorefrontToken,\n publicStorefrontToken,\n storefrontApiVersion,\n contentType,\n}: StorefrontClientProps): StorefrontClientReturn {\n if (storefrontApiVersion !== SFAPI_VERSION) {\n console.warn(\n `StorefrontClient: The Storefront API version that you're using is different than the version this build of Hydrogen-UI is targeting. You may run into unexpected errors if these versions don't match. Received verion: \"${storefrontApiVersion}\"; expected version \"${SFAPI_VERSION}\"`\n );\n }\n\n // only warn if not in a browser environment\n if (__HYDROGEN_DEV__ && !privateStorefrontToken && !globalThis.document) {\n console.warn(\n `StorefrontClient: Using a private storefront token is recommended for server environments. Refer to the authentication https://shopify.dev/api/storefront#authentication documentation for more details. `\n );\n }\n\n // only warn if in a browser environment and you're using the privateStorefrontToken\n if (__HYDROGEN_DEV__ && privateStorefrontToken && globalThis) {\n console.warn(\n `StorefrontClient: You are attempting to use a private token in an environment where it can be easily accessed by anyone. This is a security risk; please use the public token and the 'publicStorefrontToken' prop`\n );\n }\n\n return {\n getShopifyDomain(overrideProps) {\n return `https://${\n overrideProps?.storeDomain ?? storeDomain\n }.myshopify.com`;\n },\n getStorefrontApiUrl(overrideProps) {\n return `https://${\n overrideProps?.storeDomain ?? storeDomain\n }.myshopify.com/api/${\n overrideProps?.storefrontApiVersion ?? storefrontApiVersion\n }/graphql.json`;\n },\n getPrivateTokenHeaders(overrideProps) {\n if (!privateStorefrontToken && !overrideProps?.privateStorefrontToken) {\n throw new Error(\n `StorefrontClient: You did not pass in a 'privateStorefrontToken' while using 'getPrivateTokenHeaders()'`\n );\n }\n\n if (__HYDROGEN_DEV__ && !overrideProps?.buyerIp) {\n console.warn(\n `StorefrontClient: it is recommended to pass in the 'buyerIp' property which improves analytics and data in the admin.`\n );\n }\n\n const finalContentType = overrideProps?.contentType ?? contentType;\n\n return {\n // default to json\n 'content-type':\n finalContentType === 'graphql'\n ? 'application/graphql'\n : 'application/json',\n 'X-SDK-Variant': 'hydrogen-ui',\n 'X-SDK-Variant-Source': 'react',\n 'X-SDK-Version': storefrontApiVersion,\n 'Shopify-Storefront-Private-Token':\n overrideProps?.privateStorefrontToken ?? privateStorefrontToken ?? '',\n ...(overrideProps?.buyerIp\n ? {'Shopify-Storefront-Buyer-IP': overrideProps.buyerIp}\n : {}),\n };\n },\n getPublicTokenHeaders(overrideProps) {\n if (!publicStorefrontToken && !overrideProps?.publicStorefrontToken) {\n throw new Error(\n `StorefrontClient: You did not pass in a 'publicStorefrontToken' while using 'getPublicTokenHeaders()'`\n );\n }\n\n const finalContentType =\n overrideProps?.contentType ?? contentType ?? 'json';\n\n return getPublicTokenHeadersRaw(\n finalContentType,\n storefrontApiVersion,\n overrideProps?.publicStorefrontToken ?? publicStorefrontToken ?? ''\n );\n },\n };\n}\n\nexport function getPublicTokenHeadersRaw(\n contentType: 'graphql' | 'json',\n storefrontApiVersion: string,\n accessToken: string\n) {\n return {\n // default to json\n 'content-type':\n contentType === 'graphql' ? 'application/graphql' : 'application/json',\n 'X-SDK-Variant': 'hydrogen-ui',\n 'X-SDK-Variant-Source': 'react',\n 'X-SDK-Version': storefrontApiVersion,\n 'X-Shopify-Storefront-Access-Token': accessToken,\n };\n}\n\ntype StorefrontClientProps = {\n /** The host name of the domain (eg: `{shop}.myshopify.com`). */\n storeDomain: string;\n /** The Storefront API delegate access token. Refer to the [authentication](https://shopify.dev/api/storefront#authentication) and [delegate access token](https://shopify.dev/apps/auth/oauth/delegate-access-tokens) documentation for more details. */\n privateStorefrontToken?: string;\n /** The Storefront API access token. Refer to the [authentication](https://shopify.dev/api/storefront#authentication) documentation for more details. */\n publicStorefrontToken?: string;\n /** The Storefront API version. This should almost always be the same as the version Hydrogen-UI was built for. Learn more about Shopify [API versioning](https://shopify.dev/api/usage/versioning) for more details. */\n storefrontApiVersion: string;\n /**\n * Customizes which `\"content-type\"` header is added when using `getPrivateTokenHeaders()` and `getPublicTokenHeaders()`. When fetching with a `JSON.stringify()`-ed `body`, use `\"json\"`. When fetching with a `body` that is a plain string, use `\"graphql\"`. Defaults to `\"json\"`\n *\n * Can also be customized on a call-by-call basis by passing in `'contentType'` to both `getPrivateTokenHeaders({...})` and `getPublicTokenHeaders({...})`, for example: `getPublicTokenHeaders({contentType: 'graphql'})`\n */\n contentType?: 'json' | 'graphql';\n};\n\ntype OverrideTokenHeaderProps = Partial<\n Pick<StorefrontClientProps, 'contentType'>\n>;\n\ntype StorefrontClientReturn = {\n /**\n * Creates the fully-qualified URL to your myshopify.com domain.\n *\n * By default, it will use the config you passed in when calling `createStorefrontClient()`. However, you can override the following settings on each invocation of `getShopifyDomain({...})`:\n *\n * - `storeDomain`\n */\n getShopifyDomain: (\n props?: Partial<Pick<StorefrontClientProps, 'storeDomain'>>\n ) => string;\n /**\n * Creates the fully-qualified URL to your store's GraphQL endpoint.\n *\n * By default, it will use the config you passed in when calling `createStorefrontClient()`. However, you can override the following settings on each invocation of `getStorefrontApiUrl({...})`:\n *\n * - `storeDomain`\n * - `storefrontApiVersion`\n */\n getStorefrontApiUrl: (\n props?: Partial<\n Pick<StorefrontClientProps, 'storeDomain' | 'storefrontApiVersion'>\n >\n ) => string;\n /**\n * Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint. This method uses the private Server-to-Server token which reduces the chance of throttling but must not be exposed to clients. Server-side calls should prefer using this over `getPublicTokenHeaders()`.\n *\n * By default, it will use the config you passed in when calling `createStorefrontClient()`. However, you can override the following settings on each invocation of `getPrivateTokenHeaders({...})`:\n *\n * - `contentType`\n * - `privateStorefrontToken`\n * - `buyerIp`\n *\n * Note that `contentType` defaults to what you configured in `createStorefrontClient({...})` and defaults to `'json'`, but a specific call may require using `graphql`. When using `JSON.stringify()` on the `body`, use `'json'`; otherwise, use `'graphql'`.\n */\n getPrivateTokenHeaders: (\n props?: OverrideTokenHeaderProps &\n Pick<StorefrontClientProps, 'privateStorefrontToken'> & {\n /**\n * The client's IP address. Passing this to the Storefront API when using a server-to-server token will help improve your store's analytics data.\n */\n buyerIp?: string;\n }\n ) => Record<string, string>;\n /**\n * Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint. This method uses the public token which increases the chance of throttling but also can be exposed to clients. Server-side calls should prefer using `getPublicTokenHeaders()`.\n *\n * By default, it will use the config you passed in when calling `createStorefrontClient()`. However, you can override the following settings on each invocation of `getPublicTokenHeaders({...})`:\n *\n * - `contentType`\n * - `publicStorefrontToken`\n *\n * Note that `contentType` defaults to what you configured in `createStorefrontClient({...})` and defaults to `'json'`, but a specific call may require using `graphql`. When using `JSON.stringify()` on the `body`, use `'json'`; otherwise, use `'graphql'`.\n */\n getPublicTokenHeaders: (\n props?: OverrideTokenHeaderProps &\n Pick<StorefrontClientProps, 'publicStorefrontToken'>\n ) => Record<string, string>;\n};\n"],"names":[],"mappings":";AAOO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkD;AAChD,MAAI,yBAAyB,eAAe;AAClC,YAAA;AAAA,MACN,4NAA4N,4CAA4C;AAAA,IAAA;AAAA,EAE5Q;AAGA,MAAwB,CAAC,0BAA0B,CAAC,WAAW,UAAU;AAC/D,YAAA;AAAA,MACN;AAAA,IAAA;AAAA,EAEJ;AAGI,MAAoB,0BAA0B,YAAY;AACpD,YAAA;AAAA,MACN;AAAA,IAAA;AAAA,EAEJ;AAEO,SAAA;AAAA,IACL,iBAAiB,eAAe;;AACvB,aAAA,YACL,oDAAe,gBAAf,YAA8B;AAAA,IAElC;AAAA,IACA,oBAAoB,eAAe;;AACjC,aAAO,YACL,oDAAe,gBAAf,YAA8B,kCAE9B,oDAAe,yBAAf,YAAuC;AAAA,IAE3C;AAAA,IACA,uBAAuB,eAAe;;AACpC,UAAI,CAAC,0BAA0B,EAAC,+CAAe,yBAAwB;AACrE,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAAA,MAEJ;AAEI,UAAoB,EAAC,+CAAe,UAAS;AACvC,gBAAA;AAAA,UACN;AAAA,QAAA;AAAA,MAEJ;AAEM,YAAA,oBAAmB,oDAAe,gBAAf,YAA8B;AAEhD,aAAA;AAAA,QAEL,gBACE,qBAAqB,YACjB,wBACA;AAAA,QACN,iBAAiB;AAAA,QACjB,wBAAwB;AAAA,QACxB,iBAAiB;AAAA,QACjB,qCACE,0DAAe,2BAAf,YAAyC,2BAAzC,YAAmE;AAAA,QACrE,IAAI,+CAAe,WACf,EAAC,+BAA+B,cAAc,QAAA,IAC9C,CAAC;AAAA,MAAA;AAAA,IAET;AAAA,IACA,sBAAsB,eAAe;;AACnC,UAAI,CAAC,yBAAyB,EAAC,+CAAe,wBAAuB;AACnE,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAAA,MAEJ;AAEM,YAAA,oBACJ,0DAAe,gBAAf,YAA8B,gBAA9B,YAA6C;AAExC,aAAA;AAAA,QACL;AAAA,QACA;AAAA,SACA,0DAAe,0BAAf,YAAwC,0BAAxC,YAAiE;AAAA,MAAA;AAAA,IAErE;AAAA,EAAA;AAEJ;AAEgB,SAAA,yBACd,aACA,sBACA,aACA;AACO,SAAA;AAAA,IAEL,gBACE,gBAAgB,YAAY,wBAAwB;AAAA,IACtD,iBAAiB;AAAA,IACjB,wBAAwB;AAAA,IACxB,iBAAiB;AAAA,IACjB,qCAAqC;AAAA,EAAA;AAEzC;"}
1
+ {"version":3,"file":"storefront-client.mjs","sources":["../../src/storefront-client.ts"],"sourcesContent":["import {SFAPI_VERSION} from './storefront-api-constants.js';\n\nconst warnings = new Set<string>();\nconst warnOnce = (string: string) => {\n if (!warnings.has(string)) {\n console.warn(string);\n warnings.add(string);\n }\n};\n\n/**\n * The `createStorefrontClient()` function creates helpers that enable you to quickly query the Shopify Storefront API.\n *\n * When used on the server, it is recommended to use the `privateStorefrontToken` prop. When used on the client, it is recommended to use the `publicStorefrontToken` prop.\n */\nexport function createStorefrontClient({\n storeDomain,\n privateStorefrontToken,\n publicStorefrontToken,\n storefrontApiVersion,\n contentType,\n}: StorefrontClientProps): StorefrontClientReturn {\n if (storefrontApiVersion !== SFAPI_VERSION) {\n warnOnce(\n `StorefrontClient: The Storefront API version that you're using is different than the version this build of Hydrogen-UI is targeting. You may run into unexpected errors if these versions don't match. Received verion: \"${storefrontApiVersion}\"; expected version \"${SFAPI_VERSION}\"`\n );\n }\n\n // only warn if not in a browser environment\n if (__HYDROGEN_DEV__ && !privateStorefrontToken && !globalThis.document) {\n warnOnce(\n `StorefrontClient: Using a private storefront token is recommended for server environments. Refer to the authentication https://shopify.dev/api/storefront#authentication documentation for more details.`\n );\n }\n\n // only warn if in a browser environment and you're using the privateStorefrontToken\n if (__HYDROGEN_DEV__ && privateStorefrontToken && globalThis) {\n warnOnce(\n `StorefrontClient: You are attempting to use a private token in an environment where it can be easily accessed by anyone. This is a security risk; please use the public token and the 'publicStorefrontToken' prop`\n );\n }\n\n return {\n getShopifyDomain(overrideProps) {\n return `https://${\n overrideProps?.storeDomain ?? storeDomain\n }.myshopify.com`;\n },\n getStorefrontApiUrl(overrideProps) {\n return `https://${\n overrideProps?.storeDomain ?? storeDomain\n }.myshopify.com/api/${\n overrideProps?.storefrontApiVersion ?? storefrontApiVersion\n }/graphql.json`;\n },\n getPrivateTokenHeaders(overrideProps) {\n if (!privateStorefrontToken && !overrideProps?.privateStorefrontToken) {\n throw new Error(\n `StorefrontClient: You did not pass in a 'privateStorefrontToken' while using 'getPrivateTokenHeaders()'`\n );\n }\n\n if (__HYDROGEN_DEV__ && !overrideProps?.buyerIp) {\n warnOnce(\n `StorefrontClient: it is recommended to pass in the 'buyerIp' property which improves analytics and data in the admin.`\n );\n }\n\n const finalContentType = overrideProps?.contentType ?? contentType;\n\n return {\n // default to json\n 'content-type':\n finalContentType === 'graphql'\n ? 'application/graphql'\n : 'application/json',\n 'X-SDK-Variant': 'hydrogen-ui',\n 'X-SDK-Variant-Source': 'react',\n 'X-SDK-Version': storefrontApiVersion,\n 'Shopify-Storefront-Private-Token':\n overrideProps?.privateStorefrontToken ?? privateStorefrontToken ?? '',\n ...(overrideProps?.buyerIp\n ? {'Shopify-Storefront-Buyer-IP': overrideProps.buyerIp}\n : {}),\n };\n },\n getPublicTokenHeaders(overrideProps) {\n if (!publicStorefrontToken && !overrideProps?.publicStorefrontToken) {\n throw new Error(\n `StorefrontClient: You did not pass in a 'publicStorefrontToken' while using 'getPublicTokenHeaders()'`\n );\n }\n\n const finalContentType =\n overrideProps?.contentType ?? contentType ?? 'json';\n\n return getPublicTokenHeadersRaw(\n finalContentType,\n storefrontApiVersion,\n overrideProps?.publicStorefrontToken ?? publicStorefrontToken ?? ''\n );\n },\n };\n}\n\nexport function getPublicTokenHeadersRaw(\n contentType: 'graphql' | 'json',\n storefrontApiVersion: string,\n accessToken: string\n) {\n return {\n // default to json\n 'content-type':\n contentType === 'graphql' ? 'application/graphql' : 'application/json',\n 'X-SDK-Variant': 'hydrogen-ui',\n 'X-SDK-Variant-Source': 'react',\n 'X-SDK-Version': storefrontApiVersion,\n 'X-Shopify-Storefront-Access-Token': accessToken,\n };\n}\n\ntype StorefrontClientProps = {\n /** The host name of the domain (eg: `{shop}.myshopify.com`). */\n storeDomain: string;\n /** The Storefront API delegate access token. Refer to the [authentication](https://shopify.dev/api/storefront#authentication) and [delegate access token](https://shopify.dev/apps/auth/oauth/delegate-access-tokens) documentation for more details. */\n privateStorefrontToken?: string;\n /** The Storefront API access token. Refer to the [authentication](https://shopify.dev/api/storefront#authentication) documentation for more details. */\n publicStorefrontToken?: string;\n /** The Storefront API version. This should almost always be the same as the version Hydrogen-UI was built for. Learn more about Shopify [API versioning](https://shopify.dev/api/usage/versioning) for more details. */\n storefrontApiVersion: string;\n /**\n * Customizes which `\"content-type\"` header is added when using `getPrivateTokenHeaders()` and `getPublicTokenHeaders()`. When fetching with a `JSON.stringify()`-ed `body`, use `\"json\"`. When fetching with a `body` that is a plain string, use `\"graphql\"`. Defaults to `\"json\"`\n *\n * Can also be customized on a call-by-call basis by passing in `'contentType'` to both `getPrivateTokenHeaders({...})` and `getPublicTokenHeaders({...})`, for example: `getPublicTokenHeaders({contentType: 'graphql'})`\n */\n contentType?: 'json' | 'graphql';\n};\n\ntype OverrideTokenHeaderProps = Partial<\n Pick<StorefrontClientProps, 'contentType'>\n>;\n\ntype StorefrontClientReturn = {\n /**\n * Creates the fully-qualified URL to your myshopify.com domain.\n *\n * By default, it will use the config you passed in when calling `createStorefrontClient()`. However, you can override the following settings on each invocation of `getShopifyDomain({...})`:\n *\n * - `storeDomain`\n */\n getShopifyDomain: (\n props?: Partial<Pick<StorefrontClientProps, 'storeDomain'>>\n ) => string;\n /**\n * Creates the fully-qualified URL to your store's GraphQL endpoint.\n *\n * By default, it will use the config you passed in when calling `createStorefrontClient()`. However, you can override the following settings on each invocation of `getStorefrontApiUrl({...})`:\n *\n * - `storeDomain`\n * - `storefrontApiVersion`\n */\n getStorefrontApiUrl: (\n props?: Partial<\n Pick<StorefrontClientProps, 'storeDomain' | 'storefrontApiVersion'>\n >\n ) => string;\n /**\n * Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint. This method uses the private Server-to-Server token which reduces the chance of throttling but must not be exposed to clients. Server-side calls should prefer using this over `getPublicTokenHeaders()`.\n *\n * By default, it will use the config you passed in when calling `createStorefrontClient()`. However, you can override the following settings on each invocation of `getPrivateTokenHeaders({...})`:\n *\n * - `contentType`\n * - `privateStorefrontToken`\n * - `buyerIp`\n *\n * Note that `contentType` defaults to what you configured in `createStorefrontClient({...})` and defaults to `'json'`, but a specific call may require using `graphql`. When using `JSON.stringify()` on the `body`, use `'json'`; otherwise, use `'graphql'`.\n */\n getPrivateTokenHeaders: (\n props?: OverrideTokenHeaderProps &\n Pick<StorefrontClientProps, 'privateStorefrontToken'> & {\n /**\n * The client's IP address. Passing this to the Storefront API when using a server-to-server token will help improve your store's analytics data.\n */\n buyerIp?: string;\n }\n ) => Record<string, string>;\n /**\n * Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint. This method uses the public token which increases the chance of throttling but also can be exposed to clients. Server-side calls should prefer using `getPublicTokenHeaders()`.\n *\n * By default, it will use the config you passed in when calling `createStorefrontClient()`. However, you can override the following settings on each invocation of `getPublicTokenHeaders({...})`:\n *\n * - `contentType`\n * - `publicStorefrontToken`\n *\n * Note that `contentType` defaults to what you configured in `createStorefrontClient({...})` and defaults to `'json'`, but a specific call may require using `graphql`. When using `JSON.stringify()` on the `body`, use `'json'`; otherwise, use `'graphql'`.\n */\n getPublicTokenHeaders: (\n props?: OverrideTokenHeaderProps &\n Pick<StorefrontClientProps, 'publicStorefrontToken'>\n ) => Record<string, string>;\n};\n"],"names":[],"mappings":";AAEA,MAAM,+BAAe;AACrB,MAAM,WAAW,CAAC,WAAmB;AACnC,MAAI,CAAC,SAAS,IAAI,MAAM,GAAG;AACzB,YAAQ,KAAK,MAAM;AACnB,aAAS,IAAI,MAAM;AAAA,EACrB;AACF;AAOO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkD;AAChD,MAAI,yBAAyB,eAAe;AAC1C;AAAA,MACE,4NAA4N,4CAA4C;AAAA,IAAA;AAAA,EAE5Q;AAGA,MAAwB,CAAC,0BAA0B,CAAC,WAAW,UAAU;AACvE;AAAA,MACE;AAAA,IAAA;AAAA,EAEJ;AAGI,MAAoB,0BAA0B,YAAY;AAC5D;AAAA,MACE;AAAA,IAAA;AAAA,EAEJ;AAEO,SAAA;AAAA,IACL,iBAAiB,eAAe;;AACvB,aAAA,YACL,oDAAe,gBAAf,YAA8B;AAAA,IAElC;AAAA,IACA,oBAAoB,eAAe;;AACjC,aAAO,YACL,oDAAe,gBAAf,YAA8B,kCAE9B,oDAAe,yBAAf,YAAuC;AAAA,IAE3C;AAAA,IACA,uBAAuB,eAAe;;AACpC,UAAI,CAAC,0BAA0B,EAAC,+CAAe,yBAAwB;AACrE,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAAA,MAEJ;AAEI,UAAoB,EAAC,+CAAe,UAAS;AAC/C;AAAA,UACE;AAAA,QAAA;AAAA,MAEJ;AAEM,YAAA,oBAAmB,oDAAe,gBAAf,YAA8B;AAEhD,aAAA;AAAA,QAEL,gBACE,qBAAqB,YACjB,wBACA;AAAA,QACN,iBAAiB;AAAA,QACjB,wBAAwB;AAAA,QACxB,iBAAiB;AAAA,QACjB,qCACE,0DAAe,2BAAf,YAAyC,2BAAzC,YAAmE;AAAA,QACrE,IAAI,+CAAe,WACf,EAAC,+BAA+B,cAAc,QAAA,IAC9C,CAAC;AAAA,MAAA;AAAA,IAET;AAAA,IACA,sBAAsB,eAAe;;AACnC,UAAI,CAAC,yBAAyB,EAAC,+CAAe,wBAAuB;AACnE,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAAA,MAEJ;AAEM,YAAA,oBACJ,0DAAe,gBAAf,YAA8B,gBAA9B,YAA6C;AAExC,aAAA;AAAA,QACL;AAAA,QACA;AAAA,SACA,0DAAe,0BAAf,YAAwC,0BAAxC,YAAiE;AAAA,MAAA;AAAA,IAErE;AAAA,EAAA;AAEJ;AAEgB,SAAA,yBACd,aACA,sBACA,aACA;AACO,SAAA;AAAA,IAEL,gBACE,gBAAgB,YAAY,wBAAwB;AAAA,IACtD,iBAAiB;AAAA,IACjB,wBAAwB;AAAA,IACxB,iBAAiB;AAAA,IACjB,qCAAqC;AAAA,EAAA;AAEzC;"}
@@ -5,12 +5,14 @@ import { useCartActions } from "./useCartActions.mjs";
5
5
  import { useMemo } from "react";
6
6
  function invokeCart(action, options) {
7
7
  return {
8
- entry: [...(options == null ? void 0 : options.entryActions) || [], "onCartActionEntry", "onCartActionOptimisticUI", action],
8
+ entry: [...(options == null ? void 0 : options.entryActions) || [], i({
9
+ lastValidCart: (context) => context == null ? void 0 : context.cart
10
+ }), "onCartActionEntry", "onCartActionOptimisticUI", action],
9
11
  on: {
10
12
  RESOLVE: {
11
13
  target: (options == null ? void 0 : options.resolveTarget) || "idle",
12
14
  actions: [i({
13
- prevCart: (context) => context == null ? void 0 : context.cart,
15
+ prevCart: (context) => context == null ? void 0 : context.lastValidCart,
14
16
  cart: (_, event) => {
15
17
  var _a;
16
18
  return (_a = event == null ? void 0 : event.payload) == null ? void 0 : _a.cart;
@@ -25,7 +27,7 @@ function invokeCart(action, options) {
25
27
  ERROR: {
26
28
  target: (options == null ? void 0 : options.errorTarget) || "error",
27
29
  actions: [i({
28
- prevCart: (context) => context == null ? void 0 : context.cart,
30
+ prevCart: (context) => context == null ? void 0 : context.lastValidCart,
29
31
  cart: (context) => context == null ? void 0 : context.lastValidCart,
30
32
  errors: (_, event) => {
31
33
  var _a;
@@ -39,6 +41,7 @@ function invokeCart(action, options) {
39
41
  prevCart: (_) => void 0,
40
42
  cart: (_) => void 0,
41
43
  lastValidCart: (_) => void 0,
44
+ rawCartResult: (_) => void 0,
42
45
  errors: (_) => void 0
43
46
  })
44
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useCartAPIStateMachine.mjs","sources":["../../src/useCartAPIStateMachine.tsx"],"sourcesContent":["import {useMachine} from '@xstate/react/fsm';\nimport {createMachine, assign, StateMachine} from '@xstate/fsm';\nimport {\n Cart,\n CartMachineActionEvent,\n CartMachineActions,\n CartMachineContext,\n CartMachineEvent,\n CartMachineFetchResultEvent,\n CartMachineTypeState,\n} from './cart-types.js';\nimport {flattenConnection} from './flatten-connection.js';\nimport {useCartActions} from './useCartActions.js';\nimport {useMemo} from 'react';\nimport {InitEvent} from '@xstate/fsm/lib/types.js';\nimport {CountryCode, Cart as CartType} from './storefront-api-types.js';\nimport type {PartialDeep} from 'type-fest';\n\nfunction invokeCart(\n action: keyof CartMachineActions,\n options?: {\n entryActions?: [keyof CartMachineActions];\n resolveTarget?: CartMachineTypeState['value'];\n errorTarget?: CartMachineTypeState['value'];\n exitActions?: [keyof CartMachineActions];\n }\n): StateMachine.Config<CartMachineContext, CartMachineEvent>['states']['on'] {\n return {\n entry: [\n ...(options?.entryActions || []),\n 'onCartActionEntry',\n 'onCartActionOptimisticUI',\n action,\n ],\n on: {\n RESOLVE: {\n target: options?.resolveTarget || 'idle',\n actions: [\n assign({\n prevCart: (context) => context?.cart,\n cart: (_, event) => event?.payload?.cart,\n rawCartResult: (_, event) => event?.payload?.rawCartResult,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n errors: (_) => undefined,\n }),\n ],\n },\n ERROR: {\n target: options?.errorTarget || 'error',\n actions: [\n assign({\n prevCart: (context) => context?.cart,\n cart: (context) => context?.lastValidCart,\n errors: (_, event) => event?.payload?.errors,\n }),\n ],\n },\n CART_COMPLETED: {\n target: 'cartCompleted',\n actions: assign({\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n prevCart: (_) => undefined,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n cart: (_) => undefined,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n lastValidCart: (_) => undefined,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n errors: (_) => undefined,\n }),\n },\n },\n exit: ['onCartActionComplete', ...(options?.exitActions || [])],\n };\n}\n\nconst INITIALIZING_CART_EVENTS: StateMachine.Machine<\n CartMachineContext,\n CartMachineEvent,\n CartMachineTypeState\n>['config']['states']['uninitialized']['on'] = {\n CART_FETCH: {\n target: 'cartFetching',\n },\n CART_CREATE: {\n target: 'cartCreating',\n },\n CART_SET: {\n target: 'idle',\n actions: [\n assign({\n rawCartResult: (_, event) => event.payload.cart,\n cart: (_, event) => cartFromGraphQL(event.payload.cart),\n }),\n ],\n },\n};\n\nconst UPDATING_CART_EVENTS: StateMachine.Machine<\n CartMachineContext,\n CartMachineEvent,\n CartMachineTypeState\n>['config']['states']['idle']['on'] = {\n CARTLINE_ADD: {\n target: 'cartLineAdding',\n },\n CARTLINE_UPDATE: {\n target: 'cartLineUpdating',\n },\n CARTLINE_REMOVE: {\n target: 'cartLineRemoving',\n },\n NOTE_UPDATE: {\n target: 'noteUpdating',\n },\n BUYER_IDENTITY_UPDATE: {\n target: 'buyerIdentityUpdating',\n },\n CART_ATTRIBUTES_UPDATE: {\n target: 'cartAttributesUpdating',\n },\n DISCOUNT_CODES_UPDATE: {\n target: 'discountCodesUpdating',\n },\n};\n\nfunction createCartMachine(\n initialCart?: PartialDeep<CartType, {recurseIntoArrays: true}>\n) {\n return createMachine<\n CartMachineContext,\n CartMachineEvent,\n CartMachineTypeState\n >({\n id: 'Cart',\n initial: initialCart ? 'idle' : 'uninitialized',\n context: {\n cart: initialCart && cartFromGraphQL(initialCart),\n },\n states: {\n uninitialized: {\n on: INITIALIZING_CART_EVENTS,\n },\n cartCompleted: {\n on: INITIALIZING_CART_EVENTS,\n },\n initializationError: {\n on: INITIALIZING_CART_EVENTS,\n },\n idle: {\n on: {...INITIALIZING_CART_EVENTS, ...UPDATING_CART_EVENTS},\n },\n error: {\n on: {...INITIALIZING_CART_EVENTS, ...UPDATING_CART_EVENTS},\n },\n cartFetching: invokeCart('cartFetchAction', {\n errorTarget: 'initializationError',\n }),\n cartCreating: invokeCart('cartCreateAction', {\n errorTarget: 'initializationError',\n }),\n cartLineRemoving: invokeCart('cartLineRemoveAction'),\n cartLineUpdating: invokeCart('cartLineUpdateAction'),\n cartLineAdding: invokeCart('cartLineAddAction'),\n noteUpdating: invokeCart('noteUpdateAction'),\n buyerIdentityUpdating: invokeCart('buyerIdentityUpdateAction'),\n cartAttributesUpdating: invokeCart('cartAttributesUpdateAction'),\n discountCodesUpdating: invokeCart('discountCodesUpdateAction'),\n },\n });\n}\n\nexport function useCartAPIStateMachine({\n numCartLines,\n onCartActionEntry,\n onCartActionOptimisticUI,\n onCartActionComplete,\n data: cart,\n cartFragment,\n countryCode,\n}: {\n /** Maximum number of cart lines to fetch. Defaults to 250 cart lines. */\n numCartLines?: number;\n /** A callback that is invoked just before a Cart API action executes. */\n onCartActionEntry?: (\n context: CartMachineContext,\n event: CartMachineActionEvent\n ) => void;\n /** A callback that is invoked after executing the entry actions for optimistic UI changes. */\n onCartActionOptimisticUI?: (\n context: CartMachineContext,\n event: CartMachineEvent\n ) => Partial<CartMachineContext>;\n /** A callback that is invoked after a Cart API completes. */\n onCartActionComplete?: (\n context: CartMachineContext,\n event: CartMachineFetchResultEvent\n ) => void;\n /** An object with fields that correspond to the Storefront API's [Cart object](https://shopify.dev/api/storefront/latest/objects/cart). */\n data?: PartialDeep<CartType, {recurseIntoArrays: true}>;\n /** A fragment used to query the Storefront API's [Cart object](https://shopify.dev/api/storefront/latest/objects/cart) for all queries and mutations. A default value is used if no argument is provided. */\n cartFragment: string;\n /** The ISO country code for i18n. */\n countryCode?: CountryCode;\n}) {\n const {\n cartFetch,\n cartCreate,\n cartLineAdd,\n cartLineUpdate,\n cartLineRemove,\n noteUpdate,\n buyerIdentityUpdate,\n cartAttributesUpdate,\n discountCodesUpdate,\n } = useCartActions({\n numCartLines,\n cartFragment,\n countryCode,\n });\n\n const cartMachine = useMemo(() => createCartMachine(cart), [cart]);\n\n const [state, send, service] = useMachine(cartMachine, {\n actions: {\n cartFetchAction: async (_, event): Promise<void> => {\n if (event.type !== 'CART_FETCH') return;\n\n const {data, errors} = await cartFetch(event?.payload?.cartId);\n const resultEvent = eventFromFetchResult(event, data?.cart, errors);\n send(resultEvent);\n },\n cartCreateAction: async (_, event): Promise<void> => {\n if (event.type !== 'CART_CREATE') return;\n\n const {data, errors} = await cartCreate(event?.payload);\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartCreate?.cart,\n errors\n );\n send(resultEvent);\n },\n cartLineAddAction: async (context, event): Promise<void> => {\n if (event.type !== 'CARTLINE_ADD' || !context?.cart?.id) return;\n\n const {data, errors} = await cartLineAdd(\n context.cart.id,\n event.payload.lines\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartLinesAdd?.cart,\n errors\n );\n\n send(resultEvent);\n },\n cartLineUpdateAction: async (context, event): Promise<void> => {\n if (event.type !== 'CARTLINE_UPDATE' || !context?.cart?.id) return;\n const {data, errors} = await cartLineUpdate(\n context.cart.id,\n event.payload.lines\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartLinesUpdate?.cart,\n errors\n );\n\n send(resultEvent);\n },\n cartLineRemoveAction: async (context, event): Promise<void> => {\n if (event.type !== 'CARTLINE_REMOVE' || !context?.cart?.id) return;\n const {data, errors} = await cartLineRemove(\n context.cart.id,\n event.payload.lines\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartLinesRemove?.cart,\n errors\n );\n\n send(resultEvent);\n },\n noteUpdateAction: async (context, event): Promise<void> => {\n if (event.type !== 'NOTE_UPDATE' || !context?.cart?.id) return;\n const {data, errors} = await noteUpdate(\n context.cart.id,\n event.payload.note\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartNoteUpdate?.cart,\n errors\n );\n\n send(resultEvent);\n },\n buyerIdentityUpdateAction: async (context, event): Promise<void> => {\n if (event.type !== 'BUYER_IDENTITY_UPDATE' || !context?.cart?.id)\n return;\n const {data, errors} = await buyerIdentityUpdate(\n context.cart.id,\n event.payload.buyerIdentity\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartBuyerIdentityUpdate?.cart,\n errors\n );\n\n send(resultEvent);\n },\n cartAttributesUpdateAction: async (context, event): Promise<void> => {\n if (event.type !== 'CART_ATTRIBUTES_UPDATE' || !context?.cart?.id)\n return;\n const {data, errors} = await cartAttributesUpdate(\n context.cart.id,\n event.payload.attributes\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartAttributesUpdate?.cart,\n errors\n );\n\n send(resultEvent);\n },\n discountCodesUpdateAction: async (context, event): Promise<void> => {\n if (event.type !== 'DISCOUNT_CODES_UPDATE' || !context?.cart?.id)\n return;\n const {data, errors} = await discountCodesUpdate(\n context.cart.id,\n event.payload.discountCodes\n );\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartDiscountCodesUpdate?.cart,\n errors\n );\n\n send(resultEvent);\n },\n ...(onCartActionEntry && {\n onCartActionEntry: (context, event) => {\n if (isCartActionEvent(event)) {\n onCartActionEntry(context, event);\n }\n },\n }),\n ...(onCartActionOptimisticUI && {\n onCartActionOptimisticUI: assign((context, event) => {\n return onCartActionOptimisticUI(context, event);\n }),\n }),\n ...(onCartActionComplete && {\n onCartActionComplete: (context, event) => {\n if (isCartFetchResultEvent(event)) {\n onCartActionComplete(context, event);\n }\n },\n }),\n } as CartMachineActions,\n });\n\n return useMemo(() => [state, send, service] as const, [state, send, service]);\n}\n\nexport function cartFromGraphQL(\n cart: PartialDeep<CartType, {recurseIntoArrays: true}>\n): Cart {\n return {\n ...cart,\n lines: flattenConnection(cart?.lines),\n note: cart.note ?? undefined,\n };\n}\n\nfunction eventFromFetchResult(\n cartActionEvent: CartMachineActionEvent,\n cart?: PartialDeep<CartType, {recurseIntoArrays: true}> | null,\n errors?: unknown\n): CartMachineFetchResultEvent {\n if (errors) {\n return {type: 'ERROR', payload: {errors, cartActionEvent}};\n }\n\n if (!cart) {\n return {\n type: 'CART_COMPLETED',\n payload: {\n cartActionEvent,\n },\n };\n }\n\n return {\n type: 'RESOLVE',\n payload: {\n cart: cartFromGraphQL(cart),\n rawCartResult: cart,\n cartActionEvent,\n },\n };\n}\n\nfunction isCartActionEvent(\n event: CartMachineEvent | InitEvent\n): event is CartMachineActionEvent {\n return (\n event.type === 'CART_CREATE' ||\n event.type === 'CARTLINE_ADD' ||\n event.type === 'CARTLINE_UPDATE' ||\n event.type === 'CARTLINE_REMOVE' ||\n event.type === 'NOTE_UPDATE' ||\n event.type === 'BUYER_IDENTITY_UPDATE' ||\n event.type === 'CART_ATTRIBUTES_UPDATE' ||\n event.type === 'DISCOUNT_CODES_UPDATE'\n );\n}\n\nfunction isCartFetchResultEvent(\n event: CartMachineEvent | InitEvent\n): event is CartMachineFetchResultEvent {\n return (\n event.type === 'RESOLVE' ||\n event.type === 'ERROR' ||\n event.type === 'CART_COMPLETED'\n );\n}\n"],"names":["invokeCart","action","options","entry","entryActions","on","RESOLVE","target","resolveTarget","actions","assign","prevCart","context","cart","_","event","payload","rawCartResult","errors","undefined","ERROR","errorTarget","lastValidCart","CART_COMPLETED","exit","exitActions","INITIALIZING_CART_EVENTS","CART_FETCH","CART_CREATE","CART_SET","cartFromGraphQL","UPDATING_CART_EVENTS","CARTLINE_ADD","CARTLINE_UPDATE","CARTLINE_REMOVE","NOTE_UPDATE","BUYER_IDENTITY_UPDATE","CART_ATTRIBUTES_UPDATE","DISCOUNT_CODES_UPDATE","createCartMachine","initialCart","createMachine","id","initial","states","uninitialized","cartCompleted","initializationError","idle","error","cartFetching","cartCreating","cartLineRemoving","cartLineUpdating","cartLineAdding","noteUpdating","buyerIdentityUpdating","cartAttributesUpdating","discountCodesUpdating","useCartAPIStateMachine","numCartLines","onCartActionEntry","onCartActionOptimisticUI","onCartActionComplete","data","cartFragment","countryCode","cartFetch","cartCreate","cartLineAdd","cartLineUpdate","cartLineRemove","noteUpdate","buyerIdentityUpdate","cartAttributesUpdate","discountCodesUpdate","useCartActions","cartMachine","useMemo","state","send","service","useMachine","cartFetchAction","type","cartId","resultEvent","eventFromFetchResult","cartCreateAction","cartLineAddAction","lines","cartLinesAdd","cartLineUpdateAction","cartLinesUpdate","cartLineRemoveAction","cartLinesRemove","noteUpdateAction","note","cartNoteUpdate","buyerIdentityUpdateAction","buyerIdentity","cartBuyerIdentityUpdate","cartAttributesUpdateAction","attributes","discountCodesUpdateAction","discountCodes","cartDiscountCodesUpdate","isCartActionEvent","isCartFetchResultEvent","flattenConnection","cartActionEvent"],"mappings":"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"}
1
+ {"version":3,"file":"useCartAPIStateMachine.mjs","sources":["../../src/useCartAPIStateMachine.tsx"],"sourcesContent":["import {useMachine} from '@xstate/react/fsm';\nimport {createMachine, assign, StateMachine} from '@xstate/fsm';\nimport {\n Cart,\n CartMachineActionEvent,\n CartMachineActions,\n CartMachineContext,\n CartMachineEvent,\n CartMachineFetchResultEvent,\n CartMachineTypeState,\n} from './cart-types.js';\nimport {flattenConnection} from './flatten-connection.js';\nimport {useCartActions} from './useCartActions.js';\nimport {useMemo} from 'react';\nimport {InitEvent} from '@xstate/fsm/lib/types.js';\nimport {CountryCode, Cart as CartType} from './storefront-api-types.js';\nimport type {PartialDeep} from 'type-fest';\n\nfunction invokeCart(\n action: keyof CartMachineActions,\n options?: {\n entryActions?: [keyof CartMachineActions];\n resolveTarget?: CartMachineTypeState['value'];\n errorTarget?: CartMachineTypeState['value'];\n exitActions?: [keyof CartMachineActions];\n }\n): StateMachine.Config<CartMachineContext, CartMachineEvent>['states']['on'] {\n return {\n entry: [\n ...(options?.entryActions || []),\n assign({\n lastValidCart: (context) => context?.cart,\n }),\n 'onCartActionEntry',\n 'onCartActionOptimisticUI',\n action,\n ],\n on: {\n RESOLVE: {\n target: options?.resolveTarget || 'idle',\n actions: [\n assign({\n prevCart: (context) => context?.lastValidCart,\n cart: (_, event) => event?.payload?.cart,\n rawCartResult: (_, event) => event?.payload?.rawCartResult,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n errors: (_) => undefined,\n }),\n ],\n },\n ERROR: {\n target: options?.errorTarget || 'error',\n actions: [\n assign({\n prevCart: (context) => context?.lastValidCart,\n cart: (context) => context?.lastValidCart,\n errors: (_, event) => event?.payload?.errors,\n }),\n ],\n },\n CART_COMPLETED: {\n target: 'cartCompleted',\n actions: assign({\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n prevCart: (_) => undefined,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n cart: (_) => undefined,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n lastValidCart: (_) => undefined,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n rawCartResult: (_) => undefined,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n errors: (_) => undefined,\n }),\n },\n },\n exit: ['onCartActionComplete', ...(options?.exitActions || [])],\n };\n}\n\nconst INITIALIZING_CART_EVENTS: StateMachine.Machine<\n CartMachineContext,\n CartMachineEvent,\n CartMachineTypeState\n>['config']['states']['uninitialized']['on'] = {\n CART_FETCH: {\n target: 'cartFetching',\n },\n CART_CREATE: {\n target: 'cartCreating',\n },\n CART_SET: {\n target: 'idle',\n actions: [\n assign({\n rawCartResult: (_, event) => event.payload.cart,\n cart: (_, event) => cartFromGraphQL(event.payload.cart),\n }),\n ],\n },\n};\n\nconst UPDATING_CART_EVENTS: StateMachine.Machine<\n CartMachineContext,\n CartMachineEvent,\n CartMachineTypeState\n>['config']['states']['idle']['on'] = {\n CARTLINE_ADD: {\n target: 'cartLineAdding',\n },\n CARTLINE_UPDATE: {\n target: 'cartLineUpdating',\n },\n CARTLINE_REMOVE: {\n target: 'cartLineRemoving',\n },\n NOTE_UPDATE: {\n target: 'noteUpdating',\n },\n BUYER_IDENTITY_UPDATE: {\n target: 'buyerIdentityUpdating',\n },\n CART_ATTRIBUTES_UPDATE: {\n target: 'cartAttributesUpdating',\n },\n DISCOUNT_CODES_UPDATE: {\n target: 'discountCodesUpdating',\n },\n};\n\nfunction createCartMachine(\n initialCart?: PartialDeep<CartType, {recurseIntoArrays: true}>\n) {\n return createMachine<\n CartMachineContext,\n CartMachineEvent,\n CartMachineTypeState\n >({\n id: 'Cart',\n initial: initialCart ? 'idle' : 'uninitialized',\n context: {\n cart: initialCart && cartFromGraphQL(initialCart),\n },\n states: {\n uninitialized: {\n on: INITIALIZING_CART_EVENTS,\n },\n cartCompleted: {\n on: INITIALIZING_CART_EVENTS,\n },\n initializationError: {\n on: INITIALIZING_CART_EVENTS,\n },\n idle: {\n on: {...INITIALIZING_CART_EVENTS, ...UPDATING_CART_EVENTS},\n },\n error: {\n on: {...INITIALIZING_CART_EVENTS, ...UPDATING_CART_EVENTS},\n },\n cartFetching: invokeCart('cartFetchAction', {\n errorTarget: 'initializationError',\n }),\n cartCreating: invokeCart('cartCreateAction', {\n errorTarget: 'initializationError',\n }),\n cartLineRemoving: invokeCart('cartLineRemoveAction'),\n cartLineUpdating: invokeCart('cartLineUpdateAction'),\n cartLineAdding: invokeCart('cartLineAddAction'),\n noteUpdating: invokeCart('noteUpdateAction'),\n buyerIdentityUpdating: invokeCart('buyerIdentityUpdateAction'),\n cartAttributesUpdating: invokeCart('cartAttributesUpdateAction'),\n discountCodesUpdating: invokeCart('discountCodesUpdateAction'),\n },\n });\n}\n\nexport function useCartAPIStateMachine({\n numCartLines,\n onCartActionEntry,\n onCartActionOptimisticUI,\n onCartActionComplete,\n data: cart,\n cartFragment,\n countryCode,\n}: {\n /** Maximum number of cart lines to fetch. Defaults to 250 cart lines. */\n numCartLines?: number;\n /** A callback that is invoked just before a Cart API action executes. */\n onCartActionEntry?: (\n context: CartMachineContext,\n event: CartMachineActionEvent\n ) => void;\n /** A callback that is invoked after executing the entry actions for optimistic UI changes. */\n onCartActionOptimisticUI?: (\n context: CartMachineContext,\n event: CartMachineEvent\n ) => Partial<CartMachineContext>;\n /** A callback that is invoked after a Cart API completes. */\n onCartActionComplete?: (\n context: CartMachineContext,\n event: CartMachineFetchResultEvent\n ) => void;\n /** An object with fields that correspond to the Storefront API's [Cart object](https://shopify.dev/api/storefront/latest/objects/cart). */\n data?: PartialDeep<CartType, {recurseIntoArrays: true}>;\n /** A fragment used to query the Storefront API's [Cart object](https://shopify.dev/api/storefront/latest/objects/cart) for all queries and mutations. A default value is used if no argument is provided. */\n cartFragment: string;\n /** The ISO country code for i18n. */\n countryCode?: CountryCode;\n}) {\n const {\n cartFetch,\n cartCreate,\n cartLineAdd,\n cartLineUpdate,\n cartLineRemove,\n noteUpdate,\n buyerIdentityUpdate,\n cartAttributesUpdate,\n discountCodesUpdate,\n } = useCartActions({\n numCartLines,\n cartFragment,\n countryCode,\n });\n\n const cartMachine = useMemo(() => createCartMachine(cart), [cart]);\n\n const [state, send, service] = useMachine(cartMachine, {\n actions: {\n cartFetchAction: async (_, event): Promise<void> => {\n if (event.type !== 'CART_FETCH') return;\n\n const {data, errors} = await cartFetch(event?.payload?.cartId);\n const resultEvent = eventFromFetchResult(event, data?.cart, errors);\n send(resultEvent);\n },\n cartCreateAction: async (_, event): Promise<void> => {\n if (event.type !== 'CART_CREATE') return;\n\n const {data, errors} = await cartCreate(event?.payload);\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartCreate?.cart,\n errors\n );\n send(resultEvent);\n },\n cartLineAddAction: async (context, event): Promise<void> => {\n if (event.type !== 'CARTLINE_ADD' || !context?.cart?.id) return;\n\n const {data, errors} = await cartLineAdd(\n context.cart.id,\n event.payload.lines\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartLinesAdd?.cart,\n errors\n );\n\n send(resultEvent);\n },\n cartLineUpdateAction: async (context, event): Promise<void> => {\n if (event.type !== 'CARTLINE_UPDATE' || !context?.cart?.id) return;\n const {data, errors} = await cartLineUpdate(\n context.cart.id,\n event.payload.lines\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartLinesUpdate?.cart,\n errors\n );\n\n send(resultEvent);\n },\n cartLineRemoveAction: async (context, event): Promise<void> => {\n if (event.type !== 'CARTLINE_REMOVE' || !context?.cart?.id) return;\n const {data, errors} = await cartLineRemove(\n context.cart.id,\n event.payload.lines\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartLinesRemove?.cart,\n errors\n );\n\n send(resultEvent);\n },\n noteUpdateAction: async (context, event): Promise<void> => {\n if (event.type !== 'NOTE_UPDATE' || !context?.cart?.id) return;\n const {data, errors} = await noteUpdate(\n context.cart.id,\n event.payload.note\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartNoteUpdate?.cart,\n errors\n );\n\n send(resultEvent);\n },\n buyerIdentityUpdateAction: async (context, event): Promise<void> => {\n if (event.type !== 'BUYER_IDENTITY_UPDATE' || !context?.cart?.id)\n return;\n const {data, errors} = await buyerIdentityUpdate(\n context.cart.id,\n event.payload.buyerIdentity\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartBuyerIdentityUpdate?.cart,\n errors\n );\n\n send(resultEvent);\n },\n cartAttributesUpdateAction: async (context, event): Promise<void> => {\n if (event.type !== 'CART_ATTRIBUTES_UPDATE' || !context?.cart?.id)\n return;\n const {data, errors} = await cartAttributesUpdate(\n context.cart.id,\n event.payload.attributes\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartAttributesUpdate?.cart,\n errors\n );\n\n send(resultEvent);\n },\n discountCodesUpdateAction: async (context, event): Promise<void> => {\n if (event.type !== 'DISCOUNT_CODES_UPDATE' || !context?.cart?.id)\n return;\n const {data, errors} = await discountCodesUpdate(\n context.cart.id,\n event.payload.discountCodes\n );\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartDiscountCodesUpdate?.cart,\n errors\n );\n\n send(resultEvent);\n },\n ...(onCartActionEntry && {\n onCartActionEntry: (context, event) => {\n if (isCartActionEvent(event)) {\n onCartActionEntry(context, event);\n }\n },\n }),\n ...(onCartActionOptimisticUI && {\n onCartActionOptimisticUI: assign((context, event) => {\n return onCartActionOptimisticUI(context, event);\n }),\n }),\n ...(onCartActionComplete && {\n onCartActionComplete: (context, event) => {\n if (isCartFetchResultEvent(event)) {\n onCartActionComplete(context, event);\n }\n },\n }),\n } as CartMachineActions,\n });\n\n return useMemo(() => [state, send, service] as const, [state, send, service]);\n}\n\nexport function cartFromGraphQL(\n cart: PartialDeep<CartType, {recurseIntoArrays: true}>\n): Cart {\n return {\n ...cart,\n lines: flattenConnection(cart?.lines),\n note: cart.note ?? undefined,\n };\n}\n\nfunction eventFromFetchResult(\n cartActionEvent: CartMachineActionEvent,\n cart?: PartialDeep<CartType, {recurseIntoArrays: true}> | null,\n errors?: unknown\n): CartMachineFetchResultEvent {\n if (errors) {\n return {type: 'ERROR', payload: {errors, cartActionEvent}};\n }\n\n if (!cart) {\n return {\n type: 'CART_COMPLETED',\n payload: {\n cartActionEvent,\n },\n };\n }\n\n return {\n type: 'RESOLVE',\n payload: {\n cart: cartFromGraphQL(cart),\n rawCartResult: cart,\n cartActionEvent,\n },\n };\n}\n\nfunction isCartActionEvent(\n event: CartMachineEvent | InitEvent\n): event is CartMachineActionEvent {\n return (\n event.type === 'CART_CREATE' ||\n event.type === 'CARTLINE_ADD' ||\n event.type === 'CARTLINE_UPDATE' ||\n event.type === 'CARTLINE_REMOVE' ||\n event.type === 'NOTE_UPDATE' ||\n event.type === 'BUYER_IDENTITY_UPDATE' ||\n event.type === 'CART_ATTRIBUTES_UPDATE' ||\n event.type === 'DISCOUNT_CODES_UPDATE'\n );\n}\n\nfunction isCartFetchResultEvent(\n event: CartMachineEvent | InitEvent\n): event is CartMachineFetchResultEvent {\n return (\n event.type === 'RESOLVE' ||\n event.type === 'ERROR' ||\n event.type === 'CART_COMPLETED'\n );\n}\n"],"names":["invokeCart","action","options","entry","entryActions","assign","lastValidCart","context","cart","on","RESOLVE","target","resolveTarget","actions","prevCart","_","event","payload","rawCartResult","errors","undefined","ERROR","errorTarget","CART_COMPLETED","exit","exitActions","INITIALIZING_CART_EVENTS","CART_FETCH","CART_CREATE","CART_SET","cartFromGraphQL","UPDATING_CART_EVENTS","CARTLINE_ADD","CARTLINE_UPDATE","CARTLINE_REMOVE","NOTE_UPDATE","BUYER_IDENTITY_UPDATE","CART_ATTRIBUTES_UPDATE","DISCOUNT_CODES_UPDATE","createCartMachine","initialCart","createMachine","id","initial","states","uninitialized","cartCompleted","initializationError","idle","error","cartFetching","cartCreating","cartLineRemoving","cartLineUpdating","cartLineAdding","noteUpdating","buyerIdentityUpdating","cartAttributesUpdating","discountCodesUpdating","useCartAPIStateMachine","numCartLines","onCartActionEntry","onCartActionOptimisticUI","onCartActionComplete","data","cartFragment","countryCode","cartFetch","cartCreate","cartLineAdd","cartLineUpdate","cartLineRemove","noteUpdate","buyerIdentityUpdate","cartAttributesUpdate","discountCodesUpdate","useCartActions","cartMachine","useMemo","state","send","service","useMachine","cartFetchAction","type","cartId","resultEvent","eventFromFetchResult","cartCreateAction","cartLineAddAction","lines","cartLinesAdd","cartLineUpdateAction","cartLinesUpdate","cartLineRemoveAction","cartLinesRemove","noteUpdateAction","note","cartNoteUpdate","buyerIdentityUpdateAction","buyerIdentity","cartBuyerIdentityUpdate","cartAttributesUpdateAction","attributes","discountCodesUpdateAction","discountCodes","cartDiscountCodesUpdate","isCartActionEvent","isCartFetchResultEvent","flattenConnection","cartActionEvent"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { createContext, useContext, useState, useRef, useEffect, useCallback, useMemo, useTransition } from "react";
2
2
  import { useCartAPIStateMachine } from "./useCartAPIStateMachine.mjs";
3
3
  import { CART_ID_STORAGE_KEY } from "./cart-constants.mjs";
4
+ import { defaultCartFragment } from "./cart-queries.mjs";
4
5
  import { jsx } from "react/jsx-runtime";
5
6
  const CartContext = createContext(null);
6
7
  function useCart() {
@@ -50,7 +51,7 @@ function CartProvider({
50
51
  data: cart,
51
52
  cartFragment,
52
53
  countryCode,
53
- onCartActionEntry(context, event) {
54
+ onCartActionEntry(_, event) {
54
55
  try {
55
56
  switch (event.type) {
56
57
  case "CART_CREATE":
@@ -76,15 +77,14 @@ function CartProvider({
76
77
  },
77
78
  onCartActionOptimisticUI(context, event) {
78
79
  var _a2, _b2, _c2, _d2;
79
- if (!(context == null ? void 0 : context.cart))
80
+ if (!context.cart)
80
81
  return {
81
- cart: void 0
82
+ ...context
82
83
  };
83
84
  switch (event.type) {
84
85
  case "CARTLINE_REMOVE":
85
86
  return {
86
87
  ...context,
87
- lastValidCart: context.cart,
88
88
  cart: {
89
89
  ...context.cart,
90
90
  lines: (_b2 = (_a2 = context == null ? void 0 : context.cart) == null ? void 0 : _a2.lines) == null ? void 0 : _b2.filter((line) => (line == null ? void 0 : line.id) && !event.payload.lines.includes(line == null ? void 0 : line.id))
@@ -93,7 +93,6 @@ function CartProvider({
93
93
  case "CARTLINE_UPDATE":
94
94
  return {
95
95
  ...context,
96
- lastValidCart: context.cart,
97
96
  cart: {
98
97
  ...context.cart,
99
98
  lines: (_d2 = (_c2 = context == null ? void 0 : context.cart) == null ? void 0 : _c2.lines) == null ? void 0 : _d2.map((line) => {
@@ -112,9 +111,7 @@ function CartProvider({
112
111
  };
113
112
  }
114
113
  return {
115
- cart: context.cart ? {
116
- ...context.cart
117
- } : void 0
114
+ ...context
118
115
  };
119
116
  },
120
117
  onCartActionComplete(context, event) {
@@ -375,110 +372,9 @@ function countryCodeNotUpdated(context, event) {
375
372
  var _a, _b;
376
373
  return event.payload.buyerIdentity.countryCode && ((_b = (_a = context.cart) == null ? void 0 : _a.buyerIdentity) == null ? void 0 : _b.countryCode) !== event.payload.buyerIdentity.countryCode;
377
374
  }
378
- const defaultCartFragment = `
379
- fragment CartFragment on Cart {
380
- id
381
- checkoutUrl
382
- totalQuantity
383
- buyerIdentity {
384
- countryCode
385
- customer {
386
- id
387
- email
388
- firstName
389
- lastName
390
- displayName
391
- }
392
- email
393
- phone
394
- }
395
- lines(first: $numCartLines) {
396
- edges {
397
- node {
398
- id
399
- quantity
400
- attributes {
401
- key
402
- value
403
- }
404
- cost {
405
- totalAmount {
406
- amount
407
- currencyCode
408
- }
409
- compareAtAmountPerQuantity {
410
- amount
411
- currencyCode
412
- }
413
- }
414
- merchandise {
415
- ... on ProductVariant {
416
- id
417
- availableForSale
418
- compareAtPriceV2 {
419
- ...MoneyFragment
420
- }
421
- priceV2 {
422
- ...MoneyFragment
423
- }
424
- requiresShipping
425
- title
426
- image {
427
- ...ImageFragment
428
- }
429
- product {
430
- handle
431
- title
432
- }
433
- selectedOptions {
434
- name
435
- value
436
- }
437
- }
438
- }
439
- }
440
- }
441
- }
442
- cost {
443
- subtotalAmount {
444
- ...MoneyFragment
445
- }
446
- totalAmount {
447
- ...MoneyFragment
448
- }
449
- totalDutyAmount {
450
- ...MoneyFragment
451
- }
452
- totalTaxAmount {
453
- ...MoneyFragment
454
- }
455
- }
456
- note
457
- attributes {
458
- key
459
- value
460
- }
461
- discountCodes {
462
- code
463
- }
464
- }
465
-
466
- fragment MoneyFragment on MoneyV2 {
467
- currencyCode
468
- amount
469
- }
470
- fragment ImageFragment on Image {
471
- id
472
- url
473
- altText
474
- width
475
- height
476
- }
477
- `;
478
375
  export {
479
376
  CartContext,
480
377
  CartProvider,
481
- defaultCartFragment,
482
378
  storageAvailable,
483
379
  useCart
484
380
  };
@@ -1 +1 @@
1
- {"version":3,"file":"CartProvider.mjs","sources":["../../src/CartProvider.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useTransition,\n createContext,\n useContext,\n} from 'react';\nimport {\n AttributeInput,\n CartBuyerIdentityInput,\n CartInput,\n CartLineInput,\n CartLineUpdateInput,\n CountryCode,\n Cart as CartType,\n MutationCartNoteUpdateArgs,\n} from './storefront-api-types.js';\nimport {\n BuyerIdentityUpdateEvent,\n CartMachineContext,\n CartMachineEvent,\n CartMachineTypeState,\n CartWithActions,\n} from './cart-types.js';\nimport {useCartAPIStateMachine} from './useCartAPIStateMachine.js';\nimport {CART_ID_STORAGE_KEY} from './cart-constants.js';\nimport {PartialDeep} from 'type-fest';\n\nexport const CartContext = createContext<CartWithActions | null>(null);\n\n/**\n * The `useCart` hook provides access to the cart object. It must be a descendent of a `CartProvider` component.\n */\nexport function useCart() {\n const context = useContext(CartContext);\n\n if (!context) {\n throw new Error('Expected a Cart Context, but no Cart Context was found');\n }\n\n return context;\n}\n\nexport function CartProvider({\n children,\n numCartLines,\n onCreate,\n onLineAdd,\n onLineRemove,\n onLineUpdate,\n onNoteUpdate,\n onBuyerIdentityUpdate,\n onAttributesUpdate,\n onDiscountCodesUpdate,\n onCreateComplete,\n onLineAddComplete,\n onLineRemoveComplete,\n onLineUpdateComplete,\n onNoteUpdateComplete,\n onBuyerIdentityUpdateComplete,\n onAttributesUpdateComplete,\n onDiscountCodesUpdateComplete,\n data: cart,\n cartFragment = defaultCartFragment,\n customerAccessToken,\n countryCode = 'US',\n}: {\n /** Any `ReactNode` elements. */\n children: React.ReactNode;\n /** Maximum number of cart lines to fetch. Defaults to 250 cart lines. */\n numCartLines?: number;\n /** A callback that is invoked when the process to create a cart begins, but before the cart is created in the Storefront API. */\n onCreate?: () => void;\n /** A callback that is invoked when the process to add a line item to the cart begins, but before the line item is added to the Storefront API. */\n onLineAdd?: () => void;\n /** A callback that is invoked when the process to remove a line item to the cart begins, but before the line item is removed from the Storefront API. */\n onLineRemove?: () => void;\n /** A callback that is invoked when the process to update a line item in the cart begins, but before the line item is updated in the Storefront API. */\n onLineUpdate?: () => void;\n /** A callback that is invoked when the process to add or update a note in the cart begins, but before the note is added or updated in the Storefront API. */\n onNoteUpdate?: () => void;\n /** A callback that is invoked when the process to update the buyer identity begins, but before the buyer identity is updated in the Storefront API. */\n onBuyerIdentityUpdate?: () => void;\n /** A callback that is invoked when the process to update the cart attributes begins, but before the attributes are updated in the Storefront API. */\n onAttributesUpdate?: () => void;\n /** A callback that is invoked when the process to update the cart discount codes begins, but before the discount codes are updated in the Storefront API. */\n onDiscountCodesUpdate?: () => void;\n /** A callback that is invoked when the process to create a cart completes */\n onCreateComplete?: () => void;\n /** A callback that is invoked when the process to add a line item to the cart completes */\n onLineAddComplete?: () => void;\n /** A callback that is invoked when the process to remove a line item to the cart completes */\n onLineRemoveComplete?: () => void;\n /** A callback that is invoked when the process to update a line item in the cart completes */\n onLineUpdateComplete?: () => void;\n /** A callback that is invoked when the process to add or update a note in the cart completes */\n onNoteUpdateComplete?: () => void;\n /** A callback that is invoked when the process to update the buyer identity completes */\n onBuyerIdentityUpdateComplete?: () => void;\n /** A callback that is invoked when the process to update the cart attributes completes */\n onAttributesUpdateComplete?: () => void;\n /** A callback that is invoked when the process to update the cart discount codes completes */\n onDiscountCodesUpdateComplete?: () => void;\n /** An object with fields that correspond to the Storefront API's [Cart object](https://shopify.dev/api/storefront/latest/objects/cart). */\n data?: PartialDeep<CartType, {recurseIntoArrays: true}>;\n /** A fragment used to query the Storefront API's [Cart object](https://shopify.dev/api/storefront/latest/objects/cart) for all queries and mutations. A default value is used if no argument is provided. */\n cartFragment?: string;\n /** A customer access token that's accessible on the server if there's a customer login. */\n customerAccessToken?: CartBuyerIdentityInput['customerAccessToken'];\n /** The ISO country code for i18n. */\n countryCode?: CountryCode;\n}) {\n if (countryCode) countryCode = countryCode.toUpperCase() as CountryCode;\n const [prevCountryCode, setPrevCountryCode] = useState(countryCode);\n const [prevCustomerAccessToken, setPrevCustomerAccessToken] =\n useState(customerAccessToken);\n const customerOverridesCountryCode = useRef(false);\n\n if (\n prevCountryCode !== countryCode ||\n prevCustomerAccessToken !== customerAccessToken\n ) {\n setPrevCountryCode(countryCode);\n setPrevCustomerAccessToken(customerAccessToken);\n customerOverridesCountryCode.current = false;\n }\n\n const [cartState, cartSend] = useCartAPIStateMachine({\n numCartLines,\n data: cart,\n cartFragment,\n countryCode,\n onCartActionEntry(context, event) {\n try {\n switch (event.type) {\n case 'CART_CREATE':\n return onCreate?.();\n case 'CARTLINE_ADD':\n return onLineAdd?.();\n case 'CARTLINE_REMOVE':\n return onLineRemove?.();\n case 'CARTLINE_UPDATE':\n return onLineUpdate?.();\n case 'NOTE_UPDATE':\n return onNoteUpdate?.();\n case 'BUYER_IDENTITY_UPDATE':\n return onBuyerIdentityUpdate?.();\n case 'CART_ATTRIBUTES_UPDATE':\n return onAttributesUpdate?.();\n case 'DISCOUNT_CODES_UPDATE':\n return onDiscountCodesUpdate?.();\n }\n } catch (error) {\n console.error('Cart entry action failed', error);\n }\n },\n onCartActionOptimisticUI(context, event) {\n if (!context?.cart) return {cart: undefined};\n switch (event.type) {\n case 'CARTLINE_REMOVE':\n return {\n ...context,\n lastValidCart: context.cart,\n cart: {\n ...context.cart,\n lines: context?.cart?.lines?.filter(\n (line) => line?.id && !event.payload.lines.includes(line?.id)\n ),\n },\n };\n case 'CARTLINE_UPDATE':\n return {\n ...context,\n lastValidCart: context.cart,\n cart: {\n ...context.cart,\n lines: context?.cart?.lines?.map((line) => {\n const updatedLine = event.payload.lines.find(\n ({id}) => id === line?.id\n );\n\n if (updatedLine && updatedLine.quantity) {\n return {\n ...line,\n quantity: updatedLine.quantity,\n };\n }\n\n return line;\n }),\n },\n };\n }\n return {cart: context.cart ? {...context.cart} : undefined};\n },\n onCartActionComplete(context, event) {\n const cartActionEvent = event.payload.cartActionEvent;\n try {\n switch (event.type) {\n case 'RESOLVE':\n switch (cartActionEvent.type) {\n case 'CART_CREATE':\n return onCreateComplete?.();\n case 'CARTLINE_ADD':\n return onLineAddComplete?.();\n case 'CARTLINE_REMOVE':\n return onLineRemoveComplete?.();\n case 'CARTLINE_UPDATE':\n return onLineUpdateComplete?.();\n case 'NOTE_UPDATE':\n return onNoteUpdateComplete?.();\n case 'BUYER_IDENTITY_UPDATE':\n if (countryCodeNotUpdated(context, cartActionEvent)) {\n customerOverridesCountryCode.current = true;\n }\n return onBuyerIdentityUpdateComplete?.();\n case 'CART_ATTRIBUTES_UPDATE':\n return onAttributesUpdateComplete?.();\n case 'DISCOUNT_CODES_UPDATE':\n return onDiscountCodesUpdateComplete?.();\n }\n }\n } catch (error) {\n console.error('onCartActionComplete failed', error);\n }\n },\n });\n\n const cartReady = useRef(false);\n const cartCompleted = cartState.matches('cartCompleted');\n\n const countryChanged =\n (cartState.value === 'idle' ||\n cartState.value === 'error' ||\n cartState.value === 'cartCompleted') &&\n countryCode !== cartState?.context?.cart?.buyerIdentity?.countryCode &&\n !cartState.context.errors;\n\n const fetchingFromStorage = useRef(false);\n\n /**\n * Initializes cart with priority in this order:\n * 1. cart props\n * 2. localStorage cartId\n */\n useEffect(() => {\n if (!cartReady.current && !fetchingFromStorage.current) {\n if (!cart && storageAvailable('localStorage')) {\n fetchingFromStorage.current = true;\n try {\n const cartId = window.localStorage.getItem(CART_ID_STORAGE_KEY);\n if (cartId) {\n cartSend({type: 'CART_FETCH', payload: {cartId}});\n }\n } catch (error) {\n console.warn('error fetching cartId');\n console.warn(error);\n }\n }\n cartReady.current = true;\n }\n }, [cart, cartReady, cartSend]);\n\n // Update cart country code if cart and props countryCode's as different\n useEffect(() => {\n if (!countryChanged || customerOverridesCountryCode.current) return;\n cartSend({\n type: 'BUYER_IDENTITY_UPDATE',\n payload: {buyerIdentity: {countryCode, customerAccessToken}},\n });\n }, [\n countryCode,\n customerAccessToken,\n countryChanged,\n customerOverridesCountryCode,\n cartSend,\n ]);\n\n // send cart events when ready\n const onCartReadySend = useCallback(\n (cartEvent: CartMachineEvent) => {\n if (!cartReady.current) {\n return console.warn(\"Cart isn't ready yet\");\n }\n cartSend(cartEvent);\n },\n [cartSend]\n );\n\n // save cart id to local storage\n useEffect(() => {\n if (cartState?.context?.cart?.id && storageAvailable('localStorage')) {\n try {\n window.localStorage.setItem(\n CART_ID_STORAGE_KEY,\n cartState.context.cart?.id\n );\n } catch (error) {\n console.warn('Failed to save cartId to localStorage', error);\n }\n }\n }, [cartState?.context?.cart?.id]);\n\n // delete cart from local storage if cart fetched has been completed\n useEffect(() => {\n if (cartCompleted && storageAvailable('localStorage')) {\n try {\n window.localStorage.removeItem(CART_ID_STORAGE_KEY);\n } catch (error) {\n console.warn('Failed to delete cartId from localStorage', error);\n }\n }\n }, [cartCompleted]);\n\n const cartCreate = useCallback(\n (cartInput: CartInput) => {\n if (countryCode && !cartInput.buyerIdentity?.countryCode) {\n if (cartInput.buyerIdentity == null) {\n cartInput.buyerIdentity = {};\n }\n cartInput.buyerIdentity.countryCode = countryCode;\n }\n\n if (\n customerAccessToken &&\n !cartInput.buyerIdentity?.customerAccessToken\n ) {\n if (cartInput.buyerIdentity == null) {\n cartInput.buyerIdentity = {};\n }\n cartInput.buyerIdentity.customerAccessToken = customerAccessToken;\n }\n onCartReadySend({\n type: 'CART_CREATE',\n payload: cartInput,\n });\n },\n [countryCode, customerAccessToken, onCartReadySend]\n );\n\n // Delays the cart state in the context if the page is hydrating\n // preventing suspense boundary errors.\n const cartDisplayState = useDelayedStateUntilHydration(cartState);\n\n const cartContextValue = useMemo<CartWithActions>(() => {\n return {\n ...(cartDisplayState?.context?.cart ?? {lines: [], attributes: []}),\n status: transposeStatus(cartDisplayState.value),\n error: cartDisplayState?.context?.errors,\n totalQuantity: cartDisplayState?.context?.cart?.totalQuantity ?? 0,\n cartCreate,\n linesAdd(lines: CartLineInput[]) {\n if (cartDisplayState?.context?.cart?.id) {\n onCartReadySend({\n type: 'CARTLINE_ADD',\n payload: {lines},\n });\n } else {\n cartCreate({lines});\n }\n },\n linesRemove(lines: string[]) {\n onCartReadySend({\n type: 'CARTLINE_REMOVE',\n payload: {\n lines,\n },\n });\n },\n linesUpdate(lines: CartLineUpdateInput[]) {\n onCartReadySend({\n type: 'CARTLINE_UPDATE',\n payload: {\n lines,\n },\n });\n },\n noteUpdate(note: MutationCartNoteUpdateArgs['note']) {\n onCartReadySend({\n type: 'NOTE_UPDATE',\n payload: {\n note,\n },\n });\n },\n buyerIdentityUpdate(buyerIdentity: CartBuyerIdentityInput) {\n onCartReadySend({\n type: 'BUYER_IDENTITY_UPDATE',\n payload: {\n buyerIdentity,\n },\n });\n },\n cartAttributesUpdate(attributes: AttributeInput[]) {\n onCartReadySend({\n type: 'CART_ATTRIBUTES_UPDATE',\n payload: {\n attributes,\n },\n });\n },\n discountCodesUpdate(discountCodes: string[]) {\n onCartReadySend({\n type: 'DISCOUNT_CODES_UPDATE',\n payload: {\n discountCodes,\n },\n });\n },\n cartFragment,\n };\n }, [\n cartCreate,\n cartDisplayState?.context?.cart,\n cartDisplayState?.context?.errors,\n cartDisplayState.value,\n cartFragment,\n onCartReadySend,\n ]);\n\n return (\n <CartContext.Provider value={cartContextValue}>\n {children}\n </CartContext.Provider>\n );\n}\n\nfunction transposeStatus(\n status: CartMachineTypeState['value']\n): CartWithActions['status'] {\n switch (status) {\n case 'uninitialized':\n case 'initializationError':\n return 'uninitialized';\n case 'idle':\n case 'cartCompleted':\n case 'error':\n return 'idle';\n case 'cartFetching':\n return 'fetching';\n case 'cartCreating':\n return 'creating';\n case 'cartLineAdding':\n case 'cartLineRemoving':\n case 'cartLineUpdating':\n case 'noteUpdating':\n case 'buyerIdentityUpdating':\n case 'cartAttributesUpdating':\n case 'discountCodesUpdating':\n return 'updating';\n }\n}\n\n/**\n * Delays a state update until hydration finishes. Useful for preventing suspense boundaries errors when updating a context\n * @remarks this uses startTransition and waits for it to finish.\n */\nfunction useDelayedStateUntilHydration<T>(state: T) {\n const [isPending, startTransition] = useTransition();\n const [delayedState, setDelayedState] = useState(state);\n\n const firstTimePending = useRef(false);\n if (isPending) {\n firstTimePending.current = true;\n }\n\n const firstTimePendingFinished = useRef(false);\n if (!isPending && firstTimePending.current) {\n firstTimePendingFinished.current = true;\n }\n\n useEffect(() => {\n startTransition(() => {\n if (!firstTimePendingFinished.current) {\n setDelayedState(state);\n }\n });\n }, [state]);\n\n const displayState = firstTimePendingFinished.current ? state : delayedState;\n\n return displayState;\n}\n\n/** Check for storage availability funciton obtained from\n * https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API\n */\nexport function storageAvailable(type: 'localStorage' | 'sessionStorage') {\n let storage;\n try {\n storage = window[type];\n const x = '__storage_test__';\n storage.setItem(x, x);\n storage.removeItem(x);\n return true;\n } catch (e) {\n return (\n e instanceof DOMException &&\n // everything except Firefox\n (e.code === 22 ||\n // Firefox\n e.code === 1014 ||\n // test name field too, because code might not be present\n // everything except Firefox\n e.name === 'QuotaExceededError' ||\n // Firefox\n e.name === 'NS_ERROR_DOM_QUOTA_REACHED') &&\n // acknowledge QuotaExceededError only if there's something already stored\n storage &&\n storage.length !== 0\n );\n }\n}\n\nfunction countryCodeNotUpdated(\n context: CartMachineContext,\n event: BuyerIdentityUpdateEvent\n) {\n return (\n event.payload.buyerIdentity.countryCode &&\n context.cart?.buyerIdentity?.countryCode !==\n event.payload.buyerIdentity.countryCode\n );\n}\n\nexport const defaultCartFragment = `\nfragment CartFragment on Cart {\n id\n checkoutUrl\n totalQuantity\n buyerIdentity {\n countryCode\n customer {\n id\n email\n firstName\n lastName\n displayName\n }\n email\n phone\n }\n lines(first: $numCartLines) {\n edges {\n node {\n id\n quantity\n attributes {\n key\n value\n }\n cost {\n totalAmount {\n amount\n currencyCode\n }\n compareAtAmountPerQuantity {\n amount\n currencyCode\n }\n }\n merchandise {\n ... on ProductVariant {\n id\n availableForSale\n compareAtPriceV2 {\n ...MoneyFragment\n }\n priceV2 {\n ...MoneyFragment\n }\n requiresShipping\n title\n image {\n ...ImageFragment\n }\n product {\n handle\n title\n }\n selectedOptions {\n name\n value\n }\n }\n }\n }\n }\n }\n cost {\n subtotalAmount {\n ...MoneyFragment\n }\n totalAmount {\n ...MoneyFragment\n }\n totalDutyAmount {\n ...MoneyFragment\n }\n totalTaxAmount {\n ...MoneyFragment\n }\n }\n note\n attributes {\n key\n value\n }\n discountCodes {\n code\n }\n}\n\nfragment MoneyFragment on MoneyV2 {\n currencyCode\n amount\n}\nfragment ImageFragment on Image {\n id\n url\n altText\n width\n height\n}\n`;\n"],"names":["CartContext","createContext","useCart","context","useContext","Error","CartProvider","children","numCartLines","onCreate","onLineAdd","onLineRemove","onLineUpdate","onNoteUpdate","onBuyerIdentityUpdate","onAttributesUpdate","onDiscountCodesUpdate","onCreateComplete","onLineAddComplete","onLineRemoveComplete","onLineUpdateComplete","onNoteUpdateComplete","onBuyerIdentityUpdateComplete","onAttributesUpdateComplete","onDiscountCodesUpdateComplete","data","cart","cartFragment","defaultCartFragment","customerAccessToken","countryCode","toUpperCase","prevCountryCode","setPrevCountryCode","useState","prevCustomerAccessToken","setPrevCustomerAccessToken","customerOverridesCountryCode","useRef","current","cartState","cartSend","useCartAPIStateMachine","onCartActionEntry","event","type","error","onCartActionOptimisticUI","undefined","lastValidCart","lines","filter","line","id","payload","includes","map","updatedLine","find","quantity","onCartActionComplete","cartActionEvent","countryCodeNotUpdated","cartReady","cartCompleted","matches","countryChanged","value","buyerIdentity","errors","fetchingFromStorage","useEffect","storageAvailable","cartId","window","localStorage","getItem","CART_ID_STORAGE_KEY","console","warn","onCartReadySend","useCallback","cartEvent","setItem","removeItem","cartCreate","cartInput","cartDisplayState","useDelayedStateUntilHydration","cartContextValue","useMemo","attributes","status","transposeStatus","totalQuantity","linesAdd","linesRemove","linesUpdate","noteUpdate","note","buyerIdentityUpdate","cartAttributesUpdate","discountCodesUpdate","discountCodes","_jsx","state","isPending","startTransition","useTransition","delayedState","setDelayedState","firstTimePending","firstTimePendingFinished","displayState","storage","x","e","DOMException","code","name","length"],"mappings":"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"}
1
+ {"version":3,"file":"CartProvider.mjs","sources":["../../src/CartProvider.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useTransition,\n createContext,\n useContext,\n} from 'react';\nimport {\n AttributeInput,\n CartBuyerIdentityInput,\n CartInput,\n CartLineInput,\n CartLineUpdateInput,\n CountryCode,\n Cart as CartType,\n MutationCartNoteUpdateArgs,\n} from './storefront-api-types.js';\nimport {\n BuyerIdentityUpdateEvent,\n CartMachineContext,\n CartMachineEvent,\n CartMachineTypeState,\n CartWithActions,\n} from './cart-types.js';\nimport {useCartAPIStateMachine} from './useCartAPIStateMachine.js';\nimport {CART_ID_STORAGE_KEY} from './cart-constants.js';\nimport {PartialDeep} from 'type-fest';\nimport {defaultCartFragment} from './cart-queries.js';\n\nexport const CartContext = createContext<CartWithActions | null>(null);\n\n/**\n * The `useCart` hook provides access to the cart object. It must be a descendent of a `CartProvider` component.\n */\nexport function useCart() {\n const context = useContext(CartContext);\n\n if (!context) {\n throw new Error('Expected a Cart Context, but no Cart Context was found');\n }\n\n return context;\n}\n\nexport function CartProvider({\n children,\n numCartLines,\n onCreate,\n onLineAdd,\n onLineRemove,\n onLineUpdate,\n onNoteUpdate,\n onBuyerIdentityUpdate,\n onAttributesUpdate,\n onDiscountCodesUpdate,\n onCreateComplete,\n onLineAddComplete,\n onLineRemoveComplete,\n onLineUpdateComplete,\n onNoteUpdateComplete,\n onBuyerIdentityUpdateComplete,\n onAttributesUpdateComplete,\n onDiscountCodesUpdateComplete,\n data: cart,\n cartFragment = defaultCartFragment,\n customerAccessToken,\n countryCode = 'US',\n}: {\n /** Any `ReactNode` elements. */\n children: React.ReactNode;\n /** Maximum number of cart lines to fetch. Defaults to 250 cart lines. */\n numCartLines?: number;\n /** A callback that is invoked when the process to create a cart begins, but before the cart is created in the Storefront API. */\n onCreate?: () => void;\n /** A callback that is invoked when the process to add a line item to the cart begins, but before the line item is added to the Storefront API. */\n onLineAdd?: () => void;\n /** A callback that is invoked when the process to remove a line item to the cart begins, but before the line item is removed from the Storefront API. */\n onLineRemove?: () => void;\n /** A callback that is invoked when the process to update a line item in the cart begins, but before the line item is updated in the Storefront API. */\n onLineUpdate?: () => void;\n /** A callback that is invoked when the process to add or update a note in the cart begins, but before the note is added or updated in the Storefront API. */\n onNoteUpdate?: () => void;\n /** A callback that is invoked when the process to update the buyer identity begins, but before the buyer identity is updated in the Storefront API. */\n onBuyerIdentityUpdate?: () => void;\n /** A callback that is invoked when the process to update the cart attributes begins, but before the attributes are updated in the Storefront API. */\n onAttributesUpdate?: () => void;\n /** A callback that is invoked when the process to update the cart discount codes begins, but before the discount codes are updated in the Storefront API. */\n onDiscountCodesUpdate?: () => void;\n /** A callback that is invoked when the process to create a cart completes */\n onCreateComplete?: () => void;\n /** A callback that is invoked when the process to add a line item to the cart completes */\n onLineAddComplete?: () => void;\n /** A callback that is invoked when the process to remove a line item to the cart completes */\n onLineRemoveComplete?: () => void;\n /** A callback that is invoked when the process to update a line item in the cart completes */\n onLineUpdateComplete?: () => void;\n /** A callback that is invoked when the process to add or update a note in the cart completes */\n onNoteUpdateComplete?: () => void;\n /** A callback that is invoked when the process to update the buyer identity completes */\n onBuyerIdentityUpdateComplete?: () => void;\n /** A callback that is invoked when the process to update the cart attributes completes */\n onAttributesUpdateComplete?: () => void;\n /** A callback that is invoked when the process to update the cart discount codes completes */\n onDiscountCodesUpdateComplete?: () => void;\n /** An object with fields that correspond to the Storefront API's [Cart object](https://shopify.dev/api/storefront/latest/objects/cart). */\n data?: PartialDeep<CartType, {recurseIntoArrays: true}>;\n /** A fragment used to query the Storefront API's [Cart object](https://shopify.dev/api/storefront/latest/objects/cart) for all queries and mutations. A default value is used if no argument is provided. */\n cartFragment?: string;\n /** A customer access token that's accessible on the server if there's a customer login. */\n customerAccessToken?: CartBuyerIdentityInput['customerAccessToken'];\n /** The ISO country code for i18n. */\n countryCode?: CountryCode;\n}) {\n if (countryCode) countryCode = countryCode.toUpperCase() as CountryCode;\n const [prevCountryCode, setPrevCountryCode] = useState(countryCode);\n const [prevCustomerAccessToken, setPrevCustomerAccessToken] =\n useState(customerAccessToken);\n const customerOverridesCountryCode = useRef(false);\n\n if (\n prevCountryCode !== countryCode ||\n prevCustomerAccessToken !== customerAccessToken\n ) {\n setPrevCountryCode(countryCode);\n setPrevCustomerAccessToken(customerAccessToken);\n customerOverridesCountryCode.current = false;\n }\n\n const [cartState, cartSend] = useCartAPIStateMachine({\n numCartLines,\n data: cart,\n cartFragment,\n countryCode,\n onCartActionEntry(_, event) {\n try {\n switch (event.type) {\n case 'CART_CREATE':\n return onCreate?.();\n case 'CARTLINE_ADD':\n return onLineAdd?.();\n case 'CARTLINE_REMOVE':\n return onLineRemove?.();\n case 'CARTLINE_UPDATE':\n return onLineUpdate?.();\n case 'NOTE_UPDATE':\n return onNoteUpdate?.();\n case 'BUYER_IDENTITY_UPDATE':\n return onBuyerIdentityUpdate?.();\n case 'CART_ATTRIBUTES_UPDATE':\n return onAttributesUpdate?.();\n case 'DISCOUNT_CODES_UPDATE':\n return onDiscountCodesUpdate?.();\n }\n } catch (error) {\n console.error('Cart entry action failed', error);\n }\n },\n onCartActionOptimisticUI(context, event) {\n if (!context.cart) return {...context};\n switch (event.type) {\n case 'CARTLINE_REMOVE':\n return {\n ...context,\n cart: {\n ...context.cart,\n lines: context?.cart?.lines?.filter(\n (line) => line?.id && !event.payload.lines.includes(line?.id)\n ),\n },\n };\n case 'CARTLINE_UPDATE':\n return {\n ...context,\n cart: {\n ...context.cart,\n lines: context?.cart?.lines?.map((line) => {\n const updatedLine = event.payload.lines.find(\n ({id}) => id === line?.id\n );\n\n if (updatedLine && updatedLine.quantity) {\n return {\n ...line,\n quantity: updatedLine.quantity,\n };\n }\n\n return line;\n }),\n },\n };\n }\n return {...context};\n },\n onCartActionComplete(context, event) {\n const cartActionEvent = event.payload.cartActionEvent;\n try {\n switch (event.type) {\n case 'RESOLVE':\n switch (cartActionEvent.type) {\n case 'CART_CREATE':\n return onCreateComplete?.();\n case 'CARTLINE_ADD':\n return onLineAddComplete?.();\n case 'CARTLINE_REMOVE':\n return onLineRemoveComplete?.();\n case 'CARTLINE_UPDATE':\n return onLineUpdateComplete?.();\n case 'NOTE_UPDATE':\n return onNoteUpdateComplete?.();\n case 'BUYER_IDENTITY_UPDATE':\n if (countryCodeNotUpdated(context, cartActionEvent)) {\n customerOverridesCountryCode.current = true;\n }\n return onBuyerIdentityUpdateComplete?.();\n case 'CART_ATTRIBUTES_UPDATE':\n return onAttributesUpdateComplete?.();\n case 'DISCOUNT_CODES_UPDATE':\n return onDiscountCodesUpdateComplete?.();\n }\n }\n } catch (error) {\n console.error('onCartActionComplete failed', error);\n }\n },\n });\n\n const cartReady = useRef(false);\n const cartCompleted = cartState.matches('cartCompleted');\n\n const countryChanged =\n (cartState.value === 'idle' ||\n cartState.value === 'error' ||\n cartState.value === 'cartCompleted') &&\n countryCode !== cartState?.context?.cart?.buyerIdentity?.countryCode &&\n !cartState.context.errors;\n\n const fetchingFromStorage = useRef(false);\n\n /**\n * Initializes cart with priority in this order:\n * 1. cart props\n * 2. localStorage cartId\n */\n useEffect(() => {\n if (!cartReady.current && !fetchingFromStorage.current) {\n if (!cart && storageAvailable('localStorage')) {\n fetchingFromStorage.current = true;\n try {\n const cartId = window.localStorage.getItem(CART_ID_STORAGE_KEY);\n if (cartId) {\n cartSend({type: 'CART_FETCH', payload: {cartId}});\n }\n } catch (error) {\n console.warn('error fetching cartId');\n console.warn(error);\n }\n }\n cartReady.current = true;\n }\n }, [cart, cartReady, cartSend]);\n\n // Update cart country code if cart and props countryCode's as different\n useEffect(() => {\n if (!countryChanged || customerOverridesCountryCode.current) return;\n cartSend({\n type: 'BUYER_IDENTITY_UPDATE',\n payload: {buyerIdentity: {countryCode, customerAccessToken}},\n });\n }, [\n countryCode,\n customerAccessToken,\n countryChanged,\n customerOverridesCountryCode,\n cartSend,\n ]);\n\n // send cart events when ready\n const onCartReadySend = useCallback(\n (cartEvent: CartMachineEvent) => {\n if (!cartReady.current) {\n return console.warn(\"Cart isn't ready yet\");\n }\n cartSend(cartEvent);\n },\n [cartSend]\n );\n\n // save cart id to local storage\n useEffect(() => {\n if (cartState?.context?.cart?.id && storageAvailable('localStorage')) {\n try {\n window.localStorage.setItem(\n CART_ID_STORAGE_KEY,\n cartState.context.cart?.id\n );\n } catch (error) {\n console.warn('Failed to save cartId to localStorage', error);\n }\n }\n }, [cartState?.context?.cart?.id]);\n\n // delete cart from local storage if cart fetched has been completed\n useEffect(() => {\n if (cartCompleted && storageAvailable('localStorage')) {\n try {\n window.localStorage.removeItem(CART_ID_STORAGE_KEY);\n } catch (error) {\n console.warn('Failed to delete cartId from localStorage', error);\n }\n }\n }, [cartCompleted]);\n\n const cartCreate = useCallback(\n (cartInput: CartInput) => {\n if (countryCode && !cartInput.buyerIdentity?.countryCode) {\n if (cartInput.buyerIdentity == null) {\n cartInput.buyerIdentity = {};\n }\n cartInput.buyerIdentity.countryCode = countryCode;\n }\n\n if (\n customerAccessToken &&\n !cartInput.buyerIdentity?.customerAccessToken\n ) {\n if (cartInput.buyerIdentity == null) {\n cartInput.buyerIdentity = {};\n }\n cartInput.buyerIdentity.customerAccessToken = customerAccessToken;\n }\n onCartReadySend({\n type: 'CART_CREATE',\n payload: cartInput,\n });\n },\n [countryCode, customerAccessToken, onCartReadySend]\n );\n\n // Delays the cart state in the context if the page is hydrating\n // preventing suspense boundary errors.\n const cartDisplayState = useDelayedStateUntilHydration(cartState);\n\n const cartContextValue = useMemo<CartWithActions>(() => {\n return {\n ...(cartDisplayState?.context?.cart ?? {lines: [], attributes: []}),\n status: transposeStatus(cartDisplayState.value),\n error: cartDisplayState?.context?.errors,\n totalQuantity: cartDisplayState?.context?.cart?.totalQuantity ?? 0,\n cartCreate,\n linesAdd(lines: CartLineInput[]) {\n if (cartDisplayState?.context?.cart?.id) {\n onCartReadySend({\n type: 'CARTLINE_ADD',\n payload: {lines},\n });\n } else {\n cartCreate({lines});\n }\n },\n linesRemove(lines: string[]) {\n onCartReadySend({\n type: 'CARTLINE_REMOVE',\n payload: {\n lines,\n },\n });\n },\n linesUpdate(lines: CartLineUpdateInput[]) {\n onCartReadySend({\n type: 'CARTLINE_UPDATE',\n payload: {\n lines,\n },\n });\n },\n noteUpdate(note: MutationCartNoteUpdateArgs['note']) {\n onCartReadySend({\n type: 'NOTE_UPDATE',\n payload: {\n note,\n },\n });\n },\n buyerIdentityUpdate(buyerIdentity: CartBuyerIdentityInput) {\n onCartReadySend({\n type: 'BUYER_IDENTITY_UPDATE',\n payload: {\n buyerIdentity,\n },\n });\n },\n cartAttributesUpdate(attributes: AttributeInput[]) {\n onCartReadySend({\n type: 'CART_ATTRIBUTES_UPDATE',\n payload: {\n attributes,\n },\n });\n },\n discountCodesUpdate(discountCodes: string[]) {\n onCartReadySend({\n type: 'DISCOUNT_CODES_UPDATE',\n payload: {\n discountCodes,\n },\n });\n },\n cartFragment,\n };\n }, [\n cartCreate,\n cartDisplayState?.context?.cart,\n cartDisplayState?.context?.errors,\n cartDisplayState.value,\n cartFragment,\n onCartReadySend,\n ]);\n\n return (\n <CartContext.Provider value={cartContextValue}>\n {children}\n </CartContext.Provider>\n );\n}\n\nfunction transposeStatus(\n status: CartMachineTypeState['value']\n): CartWithActions['status'] {\n switch (status) {\n case 'uninitialized':\n case 'initializationError':\n return 'uninitialized';\n case 'idle':\n case 'cartCompleted':\n case 'error':\n return 'idle';\n case 'cartFetching':\n return 'fetching';\n case 'cartCreating':\n return 'creating';\n case 'cartLineAdding':\n case 'cartLineRemoving':\n case 'cartLineUpdating':\n case 'noteUpdating':\n case 'buyerIdentityUpdating':\n case 'cartAttributesUpdating':\n case 'discountCodesUpdating':\n return 'updating';\n }\n}\n\n/**\n * Delays a state update until hydration finishes. Useful for preventing suspense boundaries errors when updating a context\n * @remarks this uses startTransition and waits for it to finish.\n */\nfunction useDelayedStateUntilHydration<T>(state: T) {\n const [isPending, startTransition] = useTransition();\n const [delayedState, setDelayedState] = useState(state);\n\n const firstTimePending = useRef(false);\n if (isPending) {\n firstTimePending.current = true;\n }\n\n const firstTimePendingFinished = useRef(false);\n if (!isPending && firstTimePending.current) {\n firstTimePendingFinished.current = true;\n }\n\n useEffect(() => {\n startTransition(() => {\n if (!firstTimePendingFinished.current) {\n setDelayedState(state);\n }\n });\n }, [state]);\n\n const displayState = firstTimePendingFinished.current ? state : delayedState;\n\n return displayState;\n}\n\n/** Check for storage availability funciton obtained from\n * https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API\n */\nexport function storageAvailable(type: 'localStorage' | 'sessionStorage') {\n let storage;\n try {\n storage = window[type];\n const x = '__storage_test__';\n storage.setItem(x, x);\n storage.removeItem(x);\n return true;\n } catch (e) {\n return (\n e instanceof DOMException &&\n // everything except Firefox\n (e.code === 22 ||\n // Firefox\n e.code === 1014 ||\n // test name field too, because code might not be present\n // everything except Firefox\n e.name === 'QuotaExceededError' ||\n // Firefox\n e.name === 'NS_ERROR_DOM_QUOTA_REACHED') &&\n // acknowledge QuotaExceededError only if there's something already stored\n storage &&\n storage.length !== 0\n );\n }\n}\n\nfunction countryCodeNotUpdated(\n context: CartMachineContext,\n event: BuyerIdentityUpdateEvent\n) {\n return (\n event.payload.buyerIdentity.countryCode &&\n context.cart?.buyerIdentity?.countryCode !==\n event.payload.buyerIdentity.countryCode\n );\n}\n"],"names":["CartContext","createContext","useCart","context","useContext","Error","CartProvider","children","numCartLines","onCreate","onLineAdd","onLineRemove","onLineUpdate","onNoteUpdate","onBuyerIdentityUpdate","onAttributesUpdate","onDiscountCodesUpdate","onCreateComplete","onLineAddComplete","onLineRemoveComplete","onLineUpdateComplete","onNoteUpdateComplete","onBuyerIdentityUpdateComplete","onAttributesUpdateComplete","onDiscountCodesUpdateComplete","data","cart","cartFragment","defaultCartFragment","customerAccessToken","countryCode","toUpperCase","prevCountryCode","setPrevCountryCode","useState","prevCustomerAccessToken","setPrevCustomerAccessToken","customerOverridesCountryCode","useRef","current","cartState","cartSend","useCartAPIStateMachine","onCartActionEntry","_","event","type","error","onCartActionOptimisticUI","lines","filter","line","id","payload","includes","map","updatedLine","find","quantity","onCartActionComplete","cartActionEvent","countryCodeNotUpdated","cartReady","cartCompleted","matches","countryChanged","value","buyerIdentity","errors","fetchingFromStorage","useEffect","storageAvailable","cartId","window","localStorage","getItem","CART_ID_STORAGE_KEY","console","warn","onCartReadySend","useCallback","cartEvent","setItem","removeItem","cartCreate","cartInput","cartDisplayState","useDelayedStateUntilHydration","cartContextValue","useMemo","attributes","status","transposeStatus","totalQuantity","linesAdd","linesRemove","linesUpdate","noteUpdate","note","buyerIdentityUpdate","cartAttributesUpdate","discountCodesUpdate","discountCodes","_jsx","state","isPending","startTransition","useTransition","delayedState","setDelayedState","firstTimePending","firstTimePendingFinished","displayState","storage","x","e","DOMException","code","name","length"],"mappings":"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"}