@shopify/hydrogen-react 2024.10.1 → 2025.1.1

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 (164) hide show
  1. package/customer-account.schema.json +1 -1
  2. package/dist/browser-dev/CartCheckoutButton.mjs.map +1 -1
  3. package/dist/browser-dev/CartLineProvider.mjs.map +1 -1
  4. package/dist/browser-dev/CartProvider.mjs.map +1 -1
  5. package/dist/browser-dev/Image.mjs.map +1 -1
  6. package/dist/browser-dev/ModelViewer.mjs.map +1 -1
  7. package/dist/browser-dev/Money.mjs.map +1 -1
  8. package/dist/browser-dev/Video.mjs.map +1 -1
  9. package/dist/browser-dev/analytics-schema-custom-storefront-customer-tracking.mjs +1 -2
  10. package/dist/browser-dev/analytics-schema-custom-storefront-customer-tracking.mjs.map +1 -1
  11. package/dist/browser-dev/analytics.mjs +0 -3
  12. package/dist/browser-dev/analytics.mjs.map +1 -1
  13. package/dist/browser-dev/cart-hooks.mjs.map +1 -1
  14. package/dist/browser-dev/codegen.helpers.mjs.map +1 -1
  15. package/dist/browser-dev/flatten-connection.mjs.map +1 -1
  16. package/dist/browser-dev/getProductOptions.mjs +50 -36
  17. package/dist/browser-dev/getProductOptions.mjs.map +1 -1
  18. package/dist/browser-dev/optionValueDecoder.mjs +10 -8
  19. package/dist/browser-dev/optionValueDecoder.mjs.map +1 -1
  20. package/dist/browser-dev/packages/hydrogen-react/package.json.mjs +1 -1
  21. package/dist/browser-dev/storefront-api-constants.mjs +1 -1
  22. package/dist/browser-dev/storefront-api-constants.mjs.map +1 -1
  23. package/dist/browser-dev/useCartAPIStateMachine.mjs.map +1 -1
  24. package/dist/browser-dev/useCartActions.mjs.map +1 -1
  25. package/dist/browser-dev/useMoney.mjs.map +1 -1
  26. package/dist/browser-prod/CartCheckoutButton.mjs.map +1 -1
  27. package/dist/browser-prod/CartLineProvider.mjs.map +1 -1
  28. package/dist/browser-prod/CartProvider.mjs.map +1 -1
  29. package/dist/browser-prod/Image.mjs.map +1 -1
  30. package/dist/browser-prod/ModelViewer.mjs.map +1 -1
  31. package/dist/browser-prod/Money.mjs.map +1 -1
  32. package/dist/browser-prod/Video.mjs.map +1 -1
  33. package/dist/browser-prod/analytics-schema-custom-storefront-customer-tracking.mjs +1 -2
  34. package/dist/browser-prod/analytics-schema-custom-storefront-customer-tracking.mjs.map +1 -1
  35. package/dist/browser-prod/analytics.mjs +0 -3
  36. package/dist/browser-prod/analytics.mjs.map +1 -1
  37. package/dist/browser-prod/cart-hooks.mjs.map +1 -1
  38. package/dist/browser-prod/codegen.helpers.mjs.map +1 -1
  39. package/dist/browser-prod/flatten-connection.mjs.map +1 -1
  40. package/dist/browser-prod/getProductOptions.mjs +50 -36
  41. package/dist/browser-prod/getProductOptions.mjs.map +1 -1
  42. package/dist/browser-prod/optionValueDecoder.mjs +10 -8
  43. package/dist/browser-prod/optionValueDecoder.mjs.map +1 -1
  44. package/dist/browser-prod/packages/hydrogen-react/package.json.mjs +1 -1
  45. package/dist/browser-prod/storefront-api-constants.mjs +1 -1
  46. package/dist/browser-prod/storefront-api-constants.mjs.map +1 -1
  47. package/dist/browser-prod/useCartAPIStateMachine.mjs.map +1 -1
  48. package/dist/browser-prod/useCartActions.mjs.map +1 -1
  49. package/dist/browser-prod/useMoney.mjs.map +1 -1
  50. package/dist/node-dev/CartCheckoutButton.js.map +1 -1
  51. package/dist/node-dev/CartCheckoutButton.mjs.map +1 -1
  52. package/dist/node-dev/CartLineProvider.js.map +1 -1
  53. package/dist/node-dev/CartLineProvider.mjs.map +1 -1
  54. package/dist/node-dev/CartProvider.js.map +1 -1
  55. package/dist/node-dev/CartProvider.mjs.map +1 -1
  56. package/dist/node-dev/Image.js.map +1 -1
  57. package/dist/node-dev/Image.mjs.map +1 -1
  58. package/dist/node-dev/ModelViewer.js.map +1 -1
  59. package/dist/node-dev/ModelViewer.mjs.map +1 -1
  60. package/dist/node-dev/Money.js.map +1 -1
  61. package/dist/node-dev/Money.mjs.map +1 -1
  62. package/dist/node-dev/Video.js.map +1 -1
  63. package/dist/node-dev/Video.mjs.map +1 -1
  64. package/dist/node-dev/analytics-schema-custom-storefront-customer-tracking.js +1 -2
  65. package/dist/node-dev/analytics-schema-custom-storefront-customer-tracking.js.map +1 -1
  66. package/dist/node-dev/analytics-schema-custom-storefront-customer-tracking.mjs +1 -2
  67. package/dist/node-dev/analytics-schema-custom-storefront-customer-tracking.mjs.map +1 -1
  68. package/dist/node-dev/analytics.js +0 -3
  69. package/dist/node-dev/analytics.js.map +1 -1
  70. package/dist/node-dev/analytics.mjs +0 -3
  71. package/dist/node-dev/analytics.mjs.map +1 -1
  72. package/dist/node-dev/cart-hooks.js.map +1 -1
  73. package/dist/node-dev/cart-hooks.mjs.map +1 -1
  74. package/dist/node-dev/codegen.helpers.js.map +1 -1
  75. package/dist/node-dev/codegen.helpers.mjs.map +1 -1
  76. package/dist/node-dev/flatten-connection.js.map +1 -1
  77. package/dist/node-dev/flatten-connection.mjs.map +1 -1
  78. package/dist/node-dev/getProductOptions.js +50 -36
  79. package/dist/node-dev/getProductOptions.js.map +1 -1
  80. package/dist/node-dev/getProductOptions.mjs +50 -36
  81. package/dist/node-dev/getProductOptions.mjs.map +1 -1
  82. package/dist/node-dev/optionValueDecoder.js +10 -8
  83. package/dist/node-dev/optionValueDecoder.js.map +1 -1
  84. package/dist/node-dev/optionValueDecoder.mjs +10 -8
  85. package/dist/node-dev/optionValueDecoder.mjs.map +1 -1
  86. package/dist/node-dev/packages/hydrogen-react/package.json.js +1 -1
  87. package/dist/node-dev/packages/hydrogen-react/package.json.mjs +1 -1
  88. package/dist/node-dev/storefront-api-constants.js +1 -1
  89. package/dist/node-dev/storefront-api-constants.js.map +1 -1
  90. package/dist/node-dev/storefront-api-constants.mjs +1 -1
  91. package/dist/node-dev/storefront-api-constants.mjs.map +1 -1
  92. package/dist/node-dev/useCartAPIStateMachine.js.map +1 -1
  93. package/dist/node-dev/useCartAPIStateMachine.mjs.map +1 -1
  94. package/dist/node-dev/useCartActions.js.map +1 -1
  95. package/dist/node-dev/useCartActions.mjs.map +1 -1
  96. package/dist/node-dev/useMoney.js.map +1 -1
  97. package/dist/node-dev/useMoney.mjs.map +1 -1
  98. package/dist/node-prod/CartCheckoutButton.js.map +1 -1
  99. package/dist/node-prod/CartCheckoutButton.mjs.map +1 -1
  100. package/dist/node-prod/CartLineProvider.js.map +1 -1
  101. package/dist/node-prod/CartLineProvider.mjs.map +1 -1
  102. package/dist/node-prod/CartProvider.js.map +1 -1
  103. package/dist/node-prod/CartProvider.mjs.map +1 -1
  104. package/dist/node-prod/Image.js.map +1 -1
  105. package/dist/node-prod/Image.mjs.map +1 -1
  106. package/dist/node-prod/ModelViewer.js.map +1 -1
  107. package/dist/node-prod/ModelViewer.mjs.map +1 -1
  108. package/dist/node-prod/Money.js.map +1 -1
  109. package/dist/node-prod/Money.mjs.map +1 -1
  110. package/dist/node-prod/Video.js.map +1 -1
  111. package/dist/node-prod/Video.mjs.map +1 -1
  112. package/dist/node-prod/analytics-schema-custom-storefront-customer-tracking.js +1 -2
  113. package/dist/node-prod/analytics-schema-custom-storefront-customer-tracking.js.map +1 -1
  114. package/dist/node-prod/analytics-schema-custom-storefront-customer-tracking.mjs +1 -2
  115. package/dist/node-prod/analytics-schema-custom-storefront-customer-tracking.mjs.map +1 -1
  116. package/dist/node-prod/analytics.js +0 -3
  117. package/dist/node-prod/analytics.js.map +1 -1
  118. package/dist/node-prod/analytics.mjs +0 -3
  119. package/dist/node-prod/analytics.mjs.map +1 -1
  120. package/dist/node-prod/cart-hooks.js.map +1 -1
  121. package/dist/node-prod/cart-hooks.mjs.map +1 -1
  122. package/dist/node-prod/codegen.helpers.js.map +1 -1
  123. package/dist/node-prod/codegen.helpers.mjs.map +1 -1
  124. package/dist/node-prod/flatten-connection.js.map +1 -1
  125. package/dist/node-prod/flatten-connection.mjs.map +1 -1
  126. package/dist/node-prod/getProductOptions.js +50 -36
  127. package/dist/node-prod/getProductOptions.js.map +1 -1
  128. package/dist/node-prod/getProductOptions.mjs +50 -36
  129. package/dist/node-prod/getProductOptions.mjs.map +1 -1
  130. package/dist/node-prod/optionValueDecoder.js +10 -8
  131. package/dist/node-prod/optionValueDecoder.js.map +1 -1
  132. package/dist/node-prod/optionValueDecoder.mjs +10 -8
  133. package/dist/node-prod/optionValueDecoder.mjs.map +1 -1
  134. package/dist/node-prod/packages/hydrogen-react/package.json.js +1 -1
  135. package/dist/node-prod/packages/hydrogen-react/package.json.mjs +1 -1
  136. package/dist/node-prod/storefront-api-constants.js +1 -1
  137. package/dist/node-prod/storefront-api-constants.js.map +1 -1
  138. package/dist/node-prod/storefront-api-constants.mjs +1 -1
  139. package/dist/node-prod/storefront-api-constants.mjs.map +1 -1
  140. package/dist/node-prod/useCartAPIStateMachine.js.map +1 -1
  141. package/dist/node-prod/useCartAPIStateMachine.mjs.map +1 -1
  142. package/dist/node-prod/useCartActions.js.map +1 -1
  143. package/dist/node-prod/useCartActions.mjs.map +1 -1
  144. package/dist/node-prod/useMoney.js.map +1 -1
  145. package/dist/node-prod/useMoney.mjs.map +1 -1
  146. package/dist/types/CartLineProvider.d.ts +1 -1
  147. package/dist/types/CartProvider.d.ts +2 -2
  148. package/dist/types/Image.d.ts +1 -1
  149. package/dist/types/ModelViewer.d.ts +1 -1
  150. package/dist/types/Money.d.ts +1 -1
  151. package/dist/types/Video.d.ts +1 -1
  152. package/dist/types/codegen.helpers.d.ts +2 -2
  153. package/dist/types/flatten-connection.d.ts +1 -1
  154. package/dist/types/optionValueDecoder.d.ts +2 -2
  155. package/dist/types/storefront-api-constants.d.ts +1 -1
  156. package/dist/types/storefront-api-types.d.ts +641 -127
  157. package/dist/types/useCartAPIStateMachine.d.ts +2 -2
  158. package/dist/types/useCartActions.d.ts +2 -2
  159. package/dist/umd/hydrogen-react.dev.js +63 -51
  160. package/dist/umd/hydrogen-react.dev.js.map +1 -1
  161. package/dist/umd/hydrogen-react.prod.js +7 -7
  162. package/dist/umd/hydrogen-react.prod.js.map +1 -1
  163. package/package.json +7 -15
  164. package/storefront.schema.json +1 -1
@@ -11,11 +11,11 @@ export declare function useCartAPIStateMachine({ numCartLines, onCartActionEntry
11
11
  onCartActionOptimisticUI?: (context: CartMachineContext, event: CartMachineEvent) => Partial<CartMachineContext>;
12
12
  /** A callback that is invoked after a Cart API completes. */
13
13
  onCartActionComplete?: (context: CartMachineContext, event: CartMachineFetchResultEvent) => void;
14
- /** An object with fields that correspond to the Storefront API's [Cart object](https://shopify.dev/api/storefront/2024-10/objects/cart). */
14
+ /** An object with fields that correspond to the Storefront API's [Cart object](https://shopify.dev/api/storefront/2025-01/objects/cart). */
15
15
  data?: PartialDeep<CartType, {
16
16
  recurseIntoArrays: true;
17
17
  }>;
18
- /** A fragment used to query the Storefront API's [Cart object](https://shopify.dev/api/storefront/2024-10/objects/cart) for all queries and mutations. A default value is used if no argument is provided. */
18
+ /** A fragment used to query the Storefront API's [Cart object](https://shopify.dev/api/storefront/2025-01/objects/cart) for all queries and mutations. A default value is used if no argument is provided. */
19
19
  cartFragment: string;
20
20
  /** The ISO country code for i18n. */
21
21
  countryCode?: CountryCode;
@@ -6,12 +6,12 @@ type CartResponse = PartialDeep<CartType, {
6
6
  /**
7
7
  * The `useCartActions` hook returns helper graphql functions for Storefront Cart API
8
8
  *
9
- * See [cart API graphql mutations](https://shopify.dev/api/storefront/2024-10/objects/Cart)
9
+ * See [cart API graphql mutations](https://shopify.dev/api/storefront/2025-01/objects/Cart)
10
10
  */
11
11
  export declare function useCartActions({ numCartLines, cartFragment, countryCode, languageCode, }: {
12
12
  /** Maximum number of cart lines to fetch. Defaults to 250 cart lines. */
13
13
  numCartLines?: number;
14
- /** A fragment used to query the Storefront API's [Cart object](https://shopify.dev/api/storefront/2024-10/objects/cart) for all queries and mutations. A default value is used if no argument is provided. */
14
+ /** A fragment used to query the Storefront API's [Cart object](https://shopify.dev/api/storefront/2025-01/objects/cart) for all queries and mutations. A default value is used if no argument is provided. */
15
15
  cartFragment: string;
16
16
  /** The ISO country code for i18n. Default to `US` */
17
17
  countryCode?: CountryCode;
@@ -796,7 +796,7 @@
796
796
  }
797
797
  `
798
798
  );
799
- const SFAPI_VERSION = "2024-10";
799
+ const SFAPI_VERSION = "2025-01";
800
800
  const MOCK_SHOP_DOMAIN = "mock.shop";
801
801
  const isMockShop = (domain) => domain.includes(MOCK_SHOP_DOMAIN);
802
802
  function createStorefrontClient({
@@ -2405,7 +2405,7 @@ Refer to the authentication https://shopify.dev/api/storefront#authentication do
2405
2405
  }
2406
2406
  return false;
2407
2407
  }
2408
- const version = "2024.10.1";
2408
+ const version = "2025.1.1";
2409
2409
  const SCHEMA_ID = "custom_storefront_customer_tracking/1.2";
2410
2410
  const PAGE_RENDERED_EVENT_NAME = "page_rendered";
2411
2411
  const COLLECTION_PAGE_RENDERED_EVENT_NAME = "collection_page_rendered";
@@ -2560,7 +2560,6 @@ Refer to the authentication https://shopify.dev/api/storefront#authentication do
2560
2560
  function addToCart(payload) {
2561
2561
  const addToCartPayload = payload;
2562
2562
  const cartToken = parseGid(addToCartPayload.cartId);
2563
- const cart_token = (cartToken == null ? void 0 : cartToken.id) ? `${cartToken.id}` : null;
2564
2563
  return [
2565
2564
  schemaWrapper(
2566
2565
  SCHEMA_ID,
@@ -2568,7 +2567,7 @@ Refer to the authentication https://shopify.dev/api/storefront#authentication do
2568
2567
  {
2569
2568
  event_name: PRODUCT_ADDED_TO_CART_EVENT_NAME,
2570
2569
  customerId: addToCartPayload.customerId,
2571
- cart_token,
2570
+ cart_token: (cartToken == null ? void 0 : cartToken.id) ? `${cartToken.id}` : null,
2572
2571
  total_value: addToCartPayload.totalValue,
2573
2572
  products: formatProductPayload(addToCartPayload.products),
2574
2573
  customer_id: parseInt(
@@ -2762,13 +2761,10 @@ Refer to the authentication https://shopify.dev/api/storefront#authentication do
2762
2761
  switch (rawType) {
2763
2762
  case PerformanceNavigation.TYPE_NAVIGATE:
2764
2763
  return "navigate";
2765
- break;
2766
2764
  case PerformanceNavigation.TYPE_RELOAD:
2767
2765
  return "reload";
2768
- break;
2769
2766
  case PerformanceNavigation.TYPE_BACK_FORWARD:
2770
2767
  return "back_forward";
2771
- break;
2772
2768
  default:
2773
2769
  return `unknown: ${rawType}`;
2774
2770
  }
@@ -3203,27 +3199,34 @@ Refer to the authentication https://shopify.dev/api/storefront#authentication do
3203
3199
  }
3204
3200
  index2 = tokenizer.lastIndex;
3205
3201
  }
3206
- const lastRangeStartIndex = encodedVariantField.lastIndexOf("-");
3207
- if (rangeStart != null && lastRangeStartIndex > 0) {
3208
- const finalValueIndex = parseInt(
3209
- encodedVariantField.substring(lastRangeStartIndex + 1)
3210
- );
3211
- for (; rangeStart <= finalValueIndex; rangeStart++) {
3212
- currentOptionValue[depth] = rangeStart;
3213
- options.push([...currentOptionValue]);
3202
+ const encodingEndsWithIndex = encodedVariantField.match(/\d+$/g);
3203
+ if (encodingEndsWithIndex) {
3204
+ const finalValueIndex = parseInt(encodingEndsWithIndex[0]);
3205
+ if (rangeStart != null) {
3206
+ for (; rangeStart <= finalValueIndex; rangeStart++) {
3207
+ currentOptionValue[depth] = rangeStart;
3208
+ options.push([...currentOptionValue]);
3209
+ }
3210
+ } else {
3211
+ options.push([finalValueIndex]);
3214
3212
  }
3215
3213
  }
3216
3214
  return options;
3217
3215
  }
3218
3216
  function mapProductOptions(options) {
3219
- return options.map((option) => {
3220
- return Object.assign(
3221
- {},
3222
- ...(option == null ? void 0 : option.optionValues) ? option.optionValues.map((value, index2) => {
3223
- return { [value.name]: index2 };
3224
- }) : []
3225
- );
3226
- });
3217
+ return Object.assign(
3218
+ {},
3219
+ ...options.map((option) => {
3220
+ return {
3221
+ [option.name]: Object.assign(
3222
+ {},
3223
+ ...(option == null ? void 0 : option.optionValues) ? option.optionValues.map((value, index2) => {
3224
+ return { [value.name]: index2 };
3225
+ }) : []
3226
+ )
3227
+ };
3228
+ })
3229
+ );
3227
3230
  }
3228
3231
  function mapSelectedProductOptionToObject(options) {
3229
3232
  return Object.assign(
@@ -3236,28 +3239,30 @@ Refer to the authentication https://shopify.dev/api/storefront#authentication do
3236
3239
  function mapSelectedProductOptionToObjectAsString(options) {
3237
3240
  return JSON.stringify(mapSelectedProductOptionToObject(options));
3238
3241
  }
3239
- function encodeSelectedProductOptionAsKey(selectedOption, productOptionMappings) {
3242
+ function encodeSelectedProductOptionAsKey(selectedOption) {
3240
3243
  if (Array.isArray(selectedOption)) {
3241
3244
  return JSON.stringify(
3242
- selectedOption.map((key, index2) => {
3243
- return productOptionMappings[index2][key.value];
3244
- })
3245
+ Object.assign(
3246
+ {},
3247
+ ...selectedOption.map((option) => ({ [option.name]: option.value }))
3248
+ )
3245
3249
  );
3246
3250
  } else {
3247
- return JSON.stringify(
3248
- Object.keys(selectedOption).map((key, index2) => {
3249
- return productOptionMappings[index2][selectedOption[key]];
3250
- })
3251
- );
3251
+ return JSON.stringify(selectedOption);
3252
3252
  }
3253
3253
  }
3254
- function mapVariants(variants, productOptionMappings) {
3254
+ function buildEncodingArrayFromSelectedOptions(selectedOption, productOptionMappings) {
3255
+ const encoding = Object.keys(selectedOption).map((key) => {
3256
+ return productOptionMappings[key] ? productOptionMappings[key][selectedOption[key]] : null;
3257
+ });
3258
+ return encoding.filter((code) => code !== null);
3259
+ }
3260
+ function mapVariants(variants) {
3255
3261
  return Object.assign(
3256
3262
  {},
3257
3263
  ...variants.map((variant) => {
3258
3264
  const variantKey = encodeSelectedProductOptionAsKey(
3259
- variant.selectedOptions || [],
3260
- productOptionMappings
3265
+ variant.selectedOptions || []
3261
3266
  );
3262
3267
  return { [variantKey]: variant };
3263
3268
  })
@@ -3294,10 +3299,13 @@ Refer to the authentication https://shopify.dev/api/storefront#authentication do
3294
3299
  validParam = logErrorAndReturnFalse("options.name");
3295
3300
  }
3296
3301
  if ((_a = product == null ? void 0 : product.options[0]) == null ? void 0 : _a.optionValues) {
3297
- const firstOptionValues = product.options[0].optionValues[0];
3302
+ let firstOptionValues = product.options[0].optionValues[0];
3298
3303
  if (checkAll && !(firstOptionValues == null ? void 0 : firstOptionValues.name)) {
3299
3304
  validParam = logErrorAndReturnFalse("options.optionValues.name");
3300
3305
  }
3306
+ firstOptionValues = product.options[0].optionValues.filter(
3307
+ (value) => !!(value == null ? void 0 : value.firstSelectableVariant)
3308
+ )[0];
3301
3309
  if (firstOptionValues == null ? void 0 : firstOptionValues.firstSelectableVariant) {
3302
3310
  validParam = checkProductVariantParam(
3303
3311
  firstOptionValues.firstSelectableVariant,
@@ -3305,10 +3313,6 @@ Refer to the authentication https://shopify.dev/api/storefront#authentication do
3305
3313
  validParam,
3306
3314
  checkAll
3307
3315
  );
3308
- } else {
3309
- validParam = logErrorAndReturnFalse(
3310
- "options.optionValues.firstSelectableVariant"
3311
- );
3312
3316
  }
3313
3317
  } else {
3314
3318
  validParam = logErrorAndReturnFalse("options.optionValues");
@@ -3394,15 +3398,20 @@ Refer to the authentication https://shopify.dev/api/storefront#authentication do
3394
3398
  encodedVariantAvailability,
3395
3399
  handle: productHandle
3396
3400
  } = checkedProduct;
3401
+ const selectedOptionKeys = selectedVariant == null ? void 0 : selectedVariant.selectedOptions.map(
3402
+ (option) => option.name
3403
+ );
3404
+ const filteredOptions = options.filter((option) => {
3405
+ return selectedOptionKeys && selectedOptionKeys.indexOf(option.name) >= 0;
3406
+ });
3397
3407
  const productOptionMappings = mapProductOptions(options);
3398
3408
  const variants = mapVariants(
3399
- selectedVariant ? [selectedVariant, ...adjacentVariants] : adjacentVariants,
3400
- productOptionMappings
3409
+ selectedVariant ? [selectedVariant, ...adjacentVariants] : adjacentVariants
3401
3410
  );
3402
3411
  const selectedOptions = mapSelectedProductOptionToObject(
3403
3412
  selectedVariant ? selectedVariant.selectedOptions : []
3404
3413
  );
3405
- const productOptions = options.map((option, optionIndex) => {
3414
+ const productOptions = filteredOptions.map((option, optionIndex) => {
3406
3415
  return {
3407
3416
  ...option,
3408
3417
  optionValues: option.optionValues.map((value) => {
@@ -3410,13 +3419,13 @@ Refer to the authentication https://shopify.dev/api/storefront#authentication do
3410
3419
  const targetOptionParams = { ...selectedOptions };
3411
3420
  targetOptionParams[option.name] = value.name;
3412
3421
  const targetKey = encodeSelectedProductOptionAsKey(
3422
+ targetOptionParams || []
3423
+ );
3424
+ const encodingKey = buildEncodingArrayFromSelectedOptions(
3413
3425
  targetOptionParams || [],
3414
3426
  productOptionMappings
3415
3427
  );
3416
- const topDownKey = JSON.parse(targetKey).slice(
3417
- 0,
3418
- optionIndex + 1
3419
- );
3428
+ const topDownKey = encodingKey.slice(0, optionIndex + 1);
3420
3429
  const exists = isOptionValueCombinationInEncodedVariant(
3421
3430
  topDownKey,
3422
3431
  encodedVariantExistence || ""
@@ -3426,11 +3435,14 @@ Refer to the authentication https://shopify.dev/api/storefront#authentication do
3426
3435
  encodedVariantAvailability || ""
3427
3436
  );
3428
3437
  const variant = variants[targetKey] || value.firstSelectableVariant;
3429
- const variantOptionParam = mapSelectedProductOptionToObject(
3430
- variant.selectedOptions || []
3431
- );
3438
+ let variantOptionParam = {};
3439
+ if (variant) {
3440
+ variantOptionParam = mapSelectedProductOptionToObject(
3441
+ variant.selectedOptions || []
3442
+ );
3443
+ }
3432
3444
  const searchParams = new URLSearchParams(variantOptionParam);
3433
- const handle = (_a = variant == null ? void 0 : variant.product) == null ? void 0 : _a.handle;
3445
+ const handle = ((_a = variant == null ? void 0 : variant.product) == null ? void 0 : _a.handle) || productHandle;
3434
3446
  return {
3435
3447
  ...value,
3436
3448
  variant,