@shopify/hydrogen-react 0.0.0-next-585a03d → 0.0.0-next-32f1381
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{dev/AddToCartButton.mjs → browser-dev/AddToCartButton.js} +4 -4
- package/dist/{dev → browser-dev}/AddToCartButton.js.map +1 -1
- package/dist/{dev/BaseButton.mjs → browser-dev/BaseButton.js} +1 -1
- package/dist/{dev → browser-dev}/BaseButton.js.map +1 -1
- package/dist/{prod/BuyNowButton.mjs → browser-dev/BuyNowButton.js} +3 -3
- package/dist/{dev → browser-dev}/BuyNowButton.js.map +1 -1
- package/dist/{dev/CartCheckoutButton.mjs → browser-dev/CartCheckoutButton.js} +3 -3
- package/dist/{dev → browser-dev}/CartCheckoutButton.js.map +1 -1
- package/dist/{prod/CartProvider.mjs → browser-dev/CartProvider.js} +3 -3
- package/dist/{prod → browser-dev}/CartProvider.js.map +1 -1
- package/dist/{prod/ExternalVideo.mjs → browser-dev/ExternalVideo.js} +1 -1
- package/dist/{dev → browser-dev}/ExternalVideo.js.map +1 -1
- package/dist/{dev/Image.mjs → browser-dev/Image.js} +2 -2
- package/dist/{dev → browser-dev}/Image.js.map +1 -1
- package/dist/{dev/MediaFile.mjs → browser-dev/MediaFile.js} +5 -5
- package/dist/{dev → browser-dev}/MediaFile.js.map +1 -1
- package/dist/{dev/Metafield.mjs → browser-dev/Metafield.js} +5 -5
- package/dist/{dev → browser-dev}/Metafield.js.map +1 -1
- package/dist/{dev/ModelViewer.mjs → browser-dev/ModelViewer.js} +2 -2
- package/dist/{dev → browser-dev}/ModelViewer.js.map +1 -1
- package/dist/{dev/Money.mjs → browser-dev/Money.js} +2 -2
- package/dist/{dev → browser-dev}/Money.js.map +1 -1
- package/dist/{dev/ProductPrice.mjs → browser-dev/ProductPrice.js} +3 -3
- package/dist/{dev → browser-dev}/ProductPrice.js.map +1 -1
- package/dist/{dev/ProductProvider.mjs → browser-dev/ProductProvider.js} +2 -2
- package/dist/{prod → browser-dev}/ProductProvider.js.map +1 -1
- package/dist/{prod/ShopPayButton.mjs → browser-dev/ShopPayButton.js} +3 -3
- package/dist/{prod → browser-dev}/ShopPayButton.js.map +1 -1
- package/dist/{dev/ShopifyProvider.mjs → browser-dev/ShopifyProvider.js} +2 -2
- package/dist/{prod → browser-dev}/ShopifyProvider.js.map +1 -1
- package/dist/{dev/Video.mjs → browser-dev/Video.js} +2 -2
- package/dist/{prod → browser-dev}/Video.js.map +1 -1
- package/dist/{dev/_virtual/index.mjs → browser-dev/_virtual/index.js} +1 -1
- package/dist/{dev → browser-dev}/_virtual/index.js.map +1 -1
- package/dist/{dev/_virtual/use-sync-external-store-shim.development.mjs → browser-dev/_virtual/use-sync-external-store-shim.development.js} +1 -1
- package/dist/{dev → browser-dev}/_virtual/use-sync-external-store-shim.development.js.map +1 -1
- package/dist/{dev/_virtual/use-sync-external-store-shim.production.min.mjs → browser-dev/_virtual/use-sync-external-store-shim.production.min.js} +1 -1
- package/dist/browser-dev/_virtual/use-sync-external-store-shim.production.min.js.map +1 -0
- package/dist/{prod/_virtual/with-selector.development.mjs → browser-dev/_virtual/with-selector.development.js} +1 -1
- package/dist/{dev → browser-dev}/_virtual/with-selector.development.js.map +1 -1
- package/dist/{prod/_virtual/with-selector.mjs → browser-dev/_virtual/with-selector.js} +1 -1
- package/dist/{dev → browser-dev}/_virtual/with-selector.js.map +1 -1
- package/dist/{dev/_virtual/with-selector.production.min.mjs → browser-dev/_virtual/with-selector.production.min.js} +1 -1
- package/dist/{dev → browser-dev}/_virtual/with-selector.production.min.js.map +1 -1
- package/dist/{prod/cart-constants.mjs → browser-dev/cart-constants.js} +1 -1
- package/dist/{dev → browser-dev}/cart-constants.js.map +1 -1
- package/dist/{dev/cart-hooks.mjs → browser-dev/cart-hooks.js} +3 -3
- package/dist/{prod → browser-dev}/cart-hooks.js.map +1 -1
- package/dist/{dev/cart-queries.mjs → browser-dev/cart-queries.js} +1 -1
- package/dist/{dev → browser-dev}/cart-queries.js.map +1 -1
- package/dist/{dev/flatten-connection.mjs → browser-dev/flatten-connection.js} +1 -1
- package/dist/{dev → browser-dev}/flatten-connection.js.map +1 -1
- package/dist/{prod/image-size.mjs → browser-dev/image-size.js} +1 -1
- package/dist/{dev → browser-dev}/image-size.js.map +1 -1
- package/dist/browser-dev/index.js +46 -0
- package/dist/browser-dev/index.js.map +1 -0
- package/dist/{prod/load-script.mjs → browser-dev/load-script.js} +1 -1
- package/dist/{dev → browser-dev}/load-script.js.map +1 -1
- package/dist/{dev/metafield-parser.mjs → browser-dev/metafield-parser.js} +3 -3
- package/dist/{dev → browser-dev}/metafield-parser.js.map +1 -1
- package/dist/{dev/node_modules/@xstate/fsm/es/index.mjs → browser-dev/node_modules/@xstate/fsm/es/index.js} +1 -1
- package/dist/browser-dev/node_modules/@xstate/fsm/es/index.js.map +1 -0
- package/dist/{prod/node_modules/@xstate/react/es/fsm.mjs → browser-dev/node_modules/@xstate/react/es/fsm.js} +6 -6
- package/dist/{prod → browser-dev}/node_modules/@xstate/react/es/fsm.js.map +1 -1
- package/dist/{dev/node_modules/@xstate/react/es/useConstant.mjs → browser-dev/node_modules/@xstate/react/es/useConstant.js} +1 -1
- package/dist/{dev → browser-dev}/node_modules/@xstate/react/es/useConstant.js.map +1 -1
- package/dist/{dev/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.mjs → browser-dev/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js} +1 -1
- package/dist/{dev → browser-dev}/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js.map +1 -1
- package/dist/{dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs → browser-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js} +3 -3
- package/dist/{prod → browser-dev}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js.map +1 -1
- package/dist/{dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.mjs → browser-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js} +3 -3
- package/dist/browser-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js.map +1 -0
- package/dist/{dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs → browser-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js} +2 -2
- package/dist/{dev → browser-dev}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +1 -1
- package/dist/{dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.mjs → browser-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js} +2 -2
- package/dist/{prod → browser-dev}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js.map +1 -1
- package/dist/{dev/node_modules/use-sync-external-store/shim/index.mjs → browser-dev/node_modules/use-sync-external-store/shim/index.js} +4 -4
- package/dist/{prod → browser-dev}/node_modules/use-sync-external-store/shim/index.js.map +1 -1
- package/dist/{prod/node_modules/use-sync-external-store/shim/with-selector.mjs → browser-dev/node_modules/use-sync-external-store/shim/with-selector.js} +4 -4
- package/dist/{dev → browser-dev}/node_modules/use-sync-external-store/shim/with-selector.js.map +1 -1
- package/dist/{prod/storefront-api-constants.mjs → browser-dev/storefront-api-constants.js} +1 -1
- package/dist/{dev → browser-dev}/storefront-api-constants.js.map +1 -1
- package/dist/{dev/storefront-client.mjs → browser-dev/storefront-client.js} +2 -2
- package/dist/{dev → browser-dev}/storefront-client.js.map +1 -1
- package/dist/{prod/useCartAPIStateMachine.mjs → browser-dev/useCartAPIStateMachine.js} +5 -5
- package/dist/{dev → browser-dev}/useCartAPIStateMachine.js.map +1 -1
- package/dist/{dev/useCartActions.mjs → browser-dev/useCartActions.js} +3 -3
- package/dist/{prod → browser-dev}/useCartActions.js.map +1 -1
- package/dist/{dev/useMoney.mjs → browser-dev/useMoney.js} +2 -2
- package/dist/{dev → browser-dev}/useMoney.js.map +1 -1
- package/dist/{prod/AddToCartButton.mjs → browser-prod/AddToCartButton.js} +4 -4
- package/dist/{prod → browser-prod}/AddToCartButton.js.map +1 -1
- package/dist/{prod/BaseButton.mjs → browser-prod/BaseButton.js} +1 -1
- package/dist/{prod → browser-prod}/BaseButton.js.map +1 -1
- package/dist/{dev/BuyNowButton.mjs → browser-prod/BuyNowButton.js} +3 -3
- package/dist/{prod → browser-prod}/BuyNowButton.js.map +1 -1
- package/dist/{prod/CartCheckoutButton.mjs → browser-prod/CartCheckoutButton.js} +3 -3
- package/dist/{prod → browser-prod}/CartCheckoutButton.js.map +1 -1
- package/dist/{dev/CartProvider.mjs → browser-prod/CartProvider.js} +3 -3
- package/dist/{dev → browser-prod}/CartProvider.js.map +1 -1
- package/dist/{dev/ExternalVideo.mjs → browser-prod/ExternalVideo.js} +1 -1
- package/dist/{prod → browser-prod}/ExternalVideo.js.map +1 -1
- package/dist/{prod/Image.mjs → browser-prod/Image.js} +2 -2
- package/dist/{prod → browser-prod}/Image.js.map +1 -1
- package/dist/{prod/MediaFile.mjs → browser-prod/MediaFile.js} +5 -5
- package/dist/{prod → browser-prod}/MediaFile.js.map +1 -1
- package/dist/{prod/Metafield.mjs → browser-prod/Metafield.js} +5 -5
- package/dist/{prod → browser-prod}/Metafield.js.map +1 -1
- package/dist/{prod/ModelViewer.mjs → browser-prod/ModelViewer.js} +2 -2
- package/dist/{prod → browser-prod}/ModelViewer.js.map +1 -1
- package/dist/{prod/Money.mjs → browser-prod/Money.js} +2 -2
- package/dist/{prod → browser-prod}/Money.js.map +1 -1
- package/dist/{prod/ProductPrice.mjs → browser-prod/ProductPrice.js} +3 -3
- package/dist/{prod → browser-prod}/ProductPrice.js.map +1 -1
- package/dist/{prod/ProductProvider.mjs → browser-prod/ProductProvider.js} +2 -2
- package/dist/{dev → browser-prod}/ProductProvider.js.map +1 -1
- package/dist/{dev/ShopPayButton.mjs → browser-prod/ShopPayButton.js} +3 -3
- package/dist/{dev → browser-prod}/ShopPayButton.js.map +1 -1
- package/dist/{prod/ShopifyProvider.mjs → browser-prod/ShopifyProvider.js} +2 -2
- package/dist/{dev → browser-prod}/ShopifyProvider.js.map +1 -1
- package/dist/{prod/Video.mjs → browser-prod/Video.js} +2 -2
- package/dist/{dev → browser-prod}/Video.js.map +1 -1
- package/dist/{prod/_virtual/index.mjs → browser-prod/_virtual/index.js} +1 -1
- package/dist/{prod → browser-prod}/_virtual/index.js.map +1 -1
- package/dist/{prod/_virtual/use-sync-external-store-shim.development.mjs → browser-prod/_virtual/use-sync-external-store-shim.development.js} +1 -1
- package/dist/{prod → browser-prod}/_virtual/use-sync-external-store-shim.development.js.map +1 -1
- package/dist/{prod/_virtual/use-sync-external-store-shim.production.min.mjs → browser-prod/_virtual/use-sync-external-store-shim.production.min.js} +1 -1
- package/dist/browser-prod/_virtual/use-sync-external-store-shim.production.min.js.map +1 -0
- package/dist/{dev/_virtual/with-selector.development.mjs → browser-prod/_virtual/with-selector.development.js} +1 -1
- package/dist/{prod → browser-prod}/_virtual/with-selector.development.js.map +1 -1
- package/dist/{dev/_virtual/with-selector.mjs → browser-prod/_virtual/with-selector.js} +1 -1
- package/dist/{prod → browser-prod}/_virtual/with-selector.js.map +1 -1
- package/dist/{prod/_virtual/with-selector.production.min.mjs → browser-prod/_virtual/with-selector.production.min.js} +1 -1
- package/dist/{prod → browser-prod}/_virtual/with-selector.production.min.js.map +1 -1
- package/dist/{dev/cart-constants.mjs → browser-prod/cart-constants.js} +1 -1
- package/dist/{prod → browser-prod}/cart-constants.js.map +1 -1
- package/dist/{prod/cart-hooks.mjs → browser-prod/cart-hooks.js} +3 -3
- package/dist/{dev → browser-prod}/cart-hooks.js.map +1 -1
- package/dist/{prod/cart-queries.mjs → browser-prod/cart-queries.js} +1 -1
- package/dist/{prod → browser-prod}/cart-queries.js.map +1 -1
- package/dist/{prod/flatten-connection.mjs → browser-prod/flatten-connection.js} +1 -1
- package/dist/{prod → browser-prod}/flatten-connection.js.map +1 -1
- package/dist/{dev/image-size.mjs → browser-prod/image-size.js} +1 -1
- package/dist/{prod → browser-prod}/image-size.js.map +1 -1
- package/dist/browser-prod/index.js +46 -0
- package/dist/browser-prod/index.js.map +1 -0
- package/dist/{dev/load-script.mjs → browser-prod/load-script.js} +1 -1
- package/dist/{prod → browser-prod}/load-script.js.map +1 -1
- package/dist/{prod/metafield-parser.mjs → browser-prod/metafield-parser.js} +3 -3
- package/dist/{prod → browser-prod}/metafield-parser.js.map +1 -1
- package/dist/{prod/node_modules/@xstate/fsm/es/index.mjs → browser-prod/node_modules/@xstate/fsm/es/index.js} +1 -1
- package/dist/browser-prod/node_modules/@xstate/fsm/es/index.js.map +1 -0
- package/dist/{dev/node_modules/@xstate/react/es/fsm.mjs → browser-prod/node_modules/@xstate/react/es/fsm.js} +6 -6
- package/dist/{dev → browser-prod}/node_modules/@xstate/react/es/fsm.js.map +1 -1
- package/dist/{prod/node_modules/@xstate/react/es/useConstant.mjs → browser-prod/node_modules/@xstate/react/es/useConstant.js} +1 -1
- package/dist/{prod → browser-prod}/node_modules/@xstate/react/es/useConstant.js.map +1 -1
- package/dist/{prod/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.mjs → browser-prod/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js} +1 -1
- package/dist/{prod → browser-prod}/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js.map +1 -1
- package/dist/{prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs → browser-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js} +3 -3
- package/dist/{dev → browser-prod}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js.map +1 -1
- package/dist/{prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.mjs → browser-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js} +3 -3
- package/dist/browser-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js.map +1 -0
- package/dist/{prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs → browser-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js} +2 -2
- package/dist/{prod → browser-prod}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +1 -1
- package/dist/{prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.mjs → browser-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js} +2 -2
- package/dist/{dev → browser-prod}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js.map +1 -1
- package/dist/{prod/node_modules/use-sync-external-store/shim/index.mjs → browser-prod/node_modules/use-sync-external-store/shim/index.js} +4 -4
- package/dist/{dev → browser-prod}/node_modules/use-sync-external-store/shim/index.js.map +1 -1
- package/dist/{dev/node_modules/use-sync-external-store/shim/with-selector.mjs → browser-prod/node_modules/use-sync-external-store/shim/with-selector.js} +4 -4
- package/dist/{prod → browser-prod}/node_modules/use-sync-external-store/shim/with-selector.js.map +1 -1
- package/dist/{dev/storefront-api-constants.mjs → browser-prod/storefront-api-constants.js} +1 -1
- package/dist/{prod → browser-prod}/storefront-api-constants.js.map +1 -1
- package/dist/{prod/storefront-client.mjs → browser-prod/storefront-client.js} +2 -2
- package/dist/{prod → browser-prod}/storefront-client.js.map +1 -1
- package/dist/{dev/useCartAPIStateMachine.mjs → browser-prod/useCartAPIStateMachine.js} +5 -5
- package/dist/{prod → browser-prod}/useCartAPIStateMachine.js.map +1 -1
- package/dist/{prod/useCartActions.mjs → browser-prod/useCartActions.js} +3 -3
- package/dist/{dev → browser-prod}/useCartActions.js.map +1 -1
- package/dist/{prod/useMoney.mjs → browser-prod/useMoney.js} +2 -2
- package/dist/{prod → browser-prod}/useMoney.js.map +1 -1
- package/dist/{dev/AddToCartButton.js → node-dev/AddToCartButton.cjs} +8 -8
- package/dist/{prod/AddToCartButton.mjs.map → node-dev/AddToCartButton.cjs.map} +1 -1
- package/dist/node-dev/AddToCartButton.js +70 -0
- package/dist/node-dev/AddToCartButton.js.map +1 -0
- package/dist/{dev/BaseButton.js → node-dev/BaseButton.cjs} +3 -3
- package/dist/{dev/BaseButton.mjs.map → node-dev/BaseButton.cjs.map} +1 -1
- package/dist/node-dev/BaseButton.js +31 -0
- package/dist/node-dev/BaseButton.js.map +1 -0
- package/dist/{prod/BuyNowButton.js → node-dev/BuyNowButton.cjs} +7 -7
- package/dist/{dev/BuyNowButton.mjs.map → node-dev/BuyNowButton.cjs.map} +1 -1
- package/dist/node-dev/BuyNowButton.js +45 -0
- package/dist/node-dev/BuyNowButton.js.map +1 -0
- package/dist/{prod/CartCheckoutButton.js → node-dev/CartCheckoutButton.cjs} +6 -6
- package/dist/{dev/CartCheckoutButton.mjs.map → node-dev/CartCheckoutButton.cjs.map} +1 -1
- package/dist/node-dev/CartCheckoutButton.js +30 -0
- package/dist/node-dev/CartCheckoutButton.js.map +1 -0
- package/dist/{dev/CartProvider.js → node-dev/CartProvider.cjs} +23 -23
- package/dist/{prod/CartProvider.mjs.map → node-dev/CartProvider.cjs.map} +1 -1
- package/dist/node-dev/CartProvider.js +485 -0
- package/dist/node-dev/CartProvider.js.map +1 -0
- package/dist/{dev/ExternalVideo.js → node-dev/ExternalVideo.cjs} +1 -1
- package/dist/{prod/ExternalVideo.mjs.map → node-dev/ExternalVideo.cjs.map} +1 -1
- package/dist/node-dev/ExternalVideo.js +39 -0
- package/dist/node-dev/ExternalVideo.js.map +1 -0
- package/dist/{dev/Image.js → node-dev/Image.cjs} +2 -2
- package/dist/{dev/Image.mjs.map → node-dev/Image.cjs.map} +1 -1
- package/dist/node-dev/Image.js +104 -0
- package/dist/node-dev/Image.js.map +1 -0
- package/dist/{dev/MediaFile.js → node-dev/MediaFile.cjs} +5 -5
- package/dist/{dev/MediaFile.mjs.map → node-dev/MediaFile.cjs.map} +1 -1
- package/dist/node-dev/MediaFile.js +57 -0
- package/dist/node-dev/MediaFile.js.map +1 -0
- package/dist/{dev/Metafield.js → node-dev/Metafield.cjs} +7 -7
- package/dist/{dev/Metafield.mjs.map → node-dev/Metafield.cjs.map} +1 -1
- package/dist/node-dev/Metafield.js +301 -0
- package/dist/node-dev/Metafield.js.map +1 -0
- package/dist/{dev/ModelViewer.js → node-dev/ModelViewer.cjs} +6 -6
- package/dist/{dev/ModelViewer.mjs.map → node-dev/ModelViewer.cjs.map} +1 -1
- package/dist/node-dev/ModelViewer.js +145 -0
- package/dist/node-dev/ModelViewer.js.map +1 -0
- package/dist/{prod/Money.js → node-dev/Money.cjs} +2 -2
- package/dist/{dev/Money.mjs.map → node-dev/Money.cjs.map} +1 -1
- package/dist/node-dev/Money.js +40 -0
- package/dist/node-dev/Money.js.map +1 -0
- package/dist/{prod/ProductPrice.js → node-dev/ProductPrice.cjs} +3 -3
- package/dist/{dev/ProductPrice.mjs.map → node-dev/ProductPrice.cjs.map} +1 -1
- package/dist/node-dev/ProductPrice.js +61 -0
- package/dist/node-dev/ProductPrice.js.map +1 -0
- package/dist/{prod/ProductProvider.js → node-dev/ProductProvider.cjs} +16 -16
- package/dist/{dev/ProductProvider.mjs.map → node-dev/ProductProvider.cjs.map} +1 -1
- package/dist/node-dev/ProductProvider.js +161 -0
- package/dist/node-dev/ProductProvider.js.map +1 -0
- package/dist/{dev/ShopPayButton.js → node-dev/ShopPayButton.cjs} +3 -3
- package/dist/{prod/ShopPayButton.mjs.map → node-dev/ShopPayButton.cjs.map} +1 -1
- package/dist/node-dev/ShopPayButton.js +64 -0
- package/dist/node-dev/ShopPayButton.js.map +1 -0
- package/dist/{prod/ShopifyProvider.js → node-dev/ShopifyProvider.cjs} +6 -6
- package/dist/{dev/ShopifyProvider.mjs.map → node-dev/ShopifyProvider.cjs.map} +1 -1
- package/dist/node-dev/ShopifyProvider.js +46 -0
- package/dist/node-dev/ShopifyProvider.js.map +1 -0
- package/dist/{prod/Video.js → node-dev/Video.cjs} +4 -4
- package/dist/{dev/Video.mjs.map → node-dev/Video.cjs.map} +1 -1
- package/dist/node-dev/Video.js +44 -0
- package/dist/node-dev/Video.js.map +1 -0
- package/dist/{prod/cart-constants.js → node-dev/cart-constants.cjs} +1 -1
- package/dist/{dev/cart-constants.mjs.map → node-dev/cart-constants.cjs.map} +1 -1
- package/dist/node-dev/cart-constants.js +17 -0
- package/dist/node-dev/cart-constants.js.map +1 -0
- package/dist/{dev/cart-hooks.js → node-dev/cart-hooks.cjs} +5 -5
- package/dist/{prod/cart-hooks.mjs.map → node-dev/cart-hooks.cjs.map} +1 -1
- package/dist/node-dev/cart-hooks.js +48 -0
- package/dist/node-dev/cart-hooks.js.map +1 -0
- package/dist/{dev/cart-queries.js → node-dev/cart-queries.cjs} +1 -1
- package/dist/{dev/cart-queries.mjs.map → node-dev/cart-queries.cjs.map} +1 -1
- package/dist/node-dev/cart-queries.js +114 -0
- package/dist/node-dev/cart-queries.js.map +1 -0
- package/dist/{dev/flatten-connection.js → node-dev/flatten-connection.cjs} +1 -1
- package/dist/{dev/flatten-connection.mjs.map → node-dev/flatten-connection.cjs.map} +1 -1
- package/dist/node-dev/flatten-connection.js +29 -0
- package/dist/node-dev/flatten-connection.js.map +1 -0
- package/dist/{dev/image-size.js → node-dev/image-size.cjs} +1 -1
- package/dist/{prod/image-size.mjs.map → node-dev/image-size.cjs.map} +1 -1
- package/dist/node-dev/image-size.js +80 -0
- package/dist/node-dev/image-size.js.map +1 -0
- package/dist/{prod/index.js → node-dev/index.cjs} +20 -20
- package/dist/node-dev/index.cjs.map +1 -0
- package/dist/node-dev/index.js +46 -0
- package/dist/node-dev/index.js.map +1 -0
- package/dist/{prod/load-script.js → node-dev/load-script.cjs} +4 -4
- package/dist/{dev/load-script.mjs.map → node-dev/load-script.cjs.map} +1 -1
- package/dist/node-dev/load-script.js +52 -0
- package/dist/node-dev/load-script.js.map +1 -0
- package/dist/{dev/metafield-parser.js → node-dev/metafield-parser.cjs} +3 -3
- package/dist/{dev/metafield-parser.mjs.map → node-dev/metafield-parser.cjs.map} +1 -1
- package/dist/node-dev/metafield-parser.js +103 -0
- package/dist/node-dev/metafield-parser.js.map +1 -0
- package/dist/{prod/storefront-api-constants.js → node-dev/storefront-api-constants.cjs} +1 -1
- package/dist/node-dev/storefront-api-constants.cjs.map +1 -0
- package/dist/node-dev/storefront-api-constants.js +5 -0
- package/dist/node-dev/storefront-api-constants.js.map +1 -0
- package/dist/{dev/storefront-client.js → node-dev/storefront-client.cjs} +2 -2
- package/dist/{dev/storefront-client.mjs.map → node-dev/storefront-client.cjs.map} +1 -1
- package/dist/node-dev/storefront-client.js +72 -0
- package/dist/node-dev/storefront-client.js.map +1 -0
- package/dist/{prod/useCartAPIStateMachine.js → node-dev/useCartAPIStateMachine.cjs} +15 -15
- package/dist/{prod/useCartAPIStateMachine.mjs.map → node-dev/useCartAPIStateMachine.cjs.map} +1 -1
- package/dist/node-dev/useCartAPIStateMachine.js +326 -0
- package/dist/node-dev/useCartAPIStateMachine.js.map +1 -0
- package/dist/{dev/useCartActions.js → node-dev/useCartActions.cjs} +14 -14
- package/dist/{dev/useCartActions.mjs.map → node-dev/useCartActions.cjs.map} +1 -1
- package/dist/node-dev/useCartActions.js +123 -0
- package/dist/node-dev/useCartActions.js.map +1 -0
- package/dist/{prod/useMoney.js → node-dev/useMoney.cjs} +7 -7
- package/dist/{dev/useMoney.mjs.map → node-dev/useMoney.cjs.map} +1 -1
- package/dist/node-dev/useMoney.js +72 -0
- package/dist/node-dev/useMoney.js.map +1 -0
- package/dist/{prod/AddToCartButton.js → node-prod/AddToCartButton.cjs} +8 -8
- package/dist/{dev/AddToCartButton.mjs.map → node-prod/AddToCartButton.cjs.map} +1 -1
- package/dist/node-prod/AddToCartButton.js +70 -0
- package/dist/node-prod/AddToCartButton.js.map +1 -0
- package/dist/{prod/BaseButton.js → node-prod/BaseButton.cjs} +3 -3
- package/dist/{prod/BaseButton.mjs.map → node-prod/BaseButton.cjs.map} +1 -1
- package/dist/node-prod/BaseButton.js +31 -0
- package/dist/node-prod/BaseButton.js.map +1 -0
- package/dist/{dev/BuyNowButton.js → node-prod/BuyNowButton.cjs} +7 -7
- package/dist/{prod/BuyNowButton.mjs.map → node-prod/BuyNowButton.cjs.map} +1 -1
- package/dist/node-prod/BuyNowButton.js +45 -0
- package/dist/node-prod/BuyNowButton.js.map +1 -0
- package/dist/{dev/CartCheckoutButton.js → node-prod/CartCheckoutButton.cjs} +6 -6
- package/dist/{prod/CartCheckoutButton.mjs.map → node-prod/CartCheckoutButton.cjs.map} +1 -1
- package/dist/node-prod/CartCheckoutButton.js +30 -0
- package/dist/node-prod/CartCheckoutButton.js.map +1 -0
- package/dist/{prod/CartProvider.js → node-prod/CartProvider.cjs} +23 -23
- package/dist/{dev/CartProvider.mjs.map → node-prod/CartProvider.cjs.map} +1 -1
- package/dist/node-prod/CartProvider.js +485 -0
- package/dist/node-prod/CartProvider.js.map +1 -0
- package/dist/{prod/ExternalVideo.js → node-prod/ExternalVideo.cjs} +1 -1
- package/dist/{dev/ExternalVideo.mjs.map → node-prod/ExternalVideo.cjs.map} +1 -1
- package/dist/node-prod/ExternalVideo.js +39 -0
- package/dist/node-prod/ExternalVideo.js.map +1 -0
- package/dist/{prod/Image.js → node-prod/Image.cjs} +2 -2
- package/dist/{prod/Image.mjs.map → node-prod/Image.cjs.map} +1 -1
- package/dist/node-prod/Image.js +99 -0
- package/dist/node-prod/Image.js.map +1 -0
- package/dist/{prod/MediaFile.js → node-prod/MediaFile.cjs} +5 -5
- package/dist/{prod/MediaFile.mjs.map → node-prod/MediaFile.cjs.map} +1 -1
- package/dist/node-prod/MediaFile.js +59 -0
- package/dist/node-prod/MediaFile.js.map +1 -0
- package/dist/{prod/Metafield.js → node-prod/Metafield.cjs} +7 -7
- package/dist/{prod/Metafield.mjs.map → node-prod/Metafield.cjs.map} +1 -1
- package/dist/node-prod/Metafield.js +288 -0
- package/dist/node-prod/Metafield.js.map +1 -0
- package/dist/{prod/ModelViewer.js → node-prod/ModelViewer.cjs} +6 -6
- package/dist/{prod/ModelViewer.mjs.map → node-prod/ModelViewer.cjs.map} +1 -1
- package/dist/node-prod/ModelViewer.js +143 -0
- package/dist/node-prod/ModelViewer.js.map +1 -0
- package/dist/{dev/Money.js → node-prod/Money.cjs} +2 -2
- package/dist/{prod/Money.mjs.map → node-prod/Money.cjs.map} +1 -1
- package/dist/node-prod/Money.js +40 -0
- package/dist/node-prod/Money.js.map +1 -0
- package/dist/{dev/ProductPrice.js → node-prod/ProductPrice.cjs} +3 -3
- package/dist/{prod/ProductPrice.mjs.map → node-prod/ProductPrice.cjs.map} +1 -1
- package/dist/node-prod/ProductPrice.js +61 -0
- package/dist/node-prod/ProductPrice.js.map +1 -0
- package/dist/{dev/ProductProvider.js → node-prod/ProductProvider.cjs} +16 -16
- package/dist/{prod/ProductProvider.mjs.map → node-prod/ProductProvider.cjs.map} +1 -1
- package/dist/node-prod/ProductProvider.js +161 -0
- package/dist/node-prod/ProductProvider.js.map +1 -0
- package/dist/{prod/ShopPayButton.js → node-prod/ShopPayButton.cjs} +3 -3
- package/dist/{dev/ShopPayButton.mjs.map → node-prod/ShopPayButton.cjs.map} +1 -1
- package/dist/node-prod/ShopPayButton.js +64 -0
- package/dist/node-prod/ShopPayButton.js.map +1 -0
- package/dist/{dev/ShopifyProvider.js → node-prod/ShopifyProvider.cjs} +6 -6
- package/dist/{prod/ShopifyProvider.mjs.map → node-prod/ShopifyProvider.cjs.map} +1 -1
- package/dist/node-prod/ShopifyProvider.js +46 -0
- package/dist/node-prod/ShopifyProvider.js.map +1 -0
- package/dist/{dev/Video.js → node-prod/Video.cjs} +4 -4
- package/dist/{prod/Video.mjs.map → node-prod/Video.cjs.map} +1 -1
- package/dist/node-prod/Video.js +44 -0
- package/dist/node-prod/Video.js.map +1 -0
- package/dist/{dev/cart-constants.js → node-prod/cart-constants.cjs} +1 -1
- package/dist/{prod/cart-constants.mjs.map → node-prod/cart-constants.cjs.map} +1 -1
- package/dist/node-prod/cart-constants.js +17 -0
- package/dist/node-prod/cart-constants.js.map +1 -0
- package/dist/{prod/cart-hooks.js → node-prod/cart-hooks.cjs} +5 -5
- package/dist/{dev/cart-hooks.mjs.map → node-prod/cart-hooks.cjs.map} +1 -1
- package/dist/node-prod/cart-hooks.js +48 -0
- package/dist/node-prod/cart-hooks.js.map +1 -0
- package/dist/{prod/cart-queries.js → node-prod/cart-queries.cjs} +1 -1
- package/dist/{prod/cart-queries.mjs.map → node-prod/cart-queries.cjs.map} +1 -1
- package/dist/node-prod/cart-queries.js +114 -0
- package/dist/node-prod/cart-queries.js.map +1 -0
- package/dist/{prod/flatten-connection.js → node-prod/flatten-connection.cjs} +1 -1
- package/dist/{prod/flatten-connection.mjs.map → node-prod/flatten-connection.cjs.map} +1 -1
- package/dist/node-prod/flatten-connection.js +25 -0
- package/dist/node-prod/flatten-connection.js.map +1 -0
- package/dist/{prod/image-size.js → node-prod/image-size.cjs} +1 -1
- package/dist/{dev/image-size.mjs.map → node-prod/image-size.cjs.map} +1 -1
- package/dist/node-prod/image-size.js +80 -0
- package/dist/node-prod/image-size.js.map +1 -0
- package/dist/{dev/index.js → node-prod/index.cjs} +20 -20
- package/dist/node-prod/index.cjs.map +1 -0
- package/dist/node-prod/index.js +46 -0
- package/dist/node-prod/index.js.map +1 -0
- package/dist/{dev/load-script.js → node-prod/load-script.cjs} +4 -4
- package/dist/{prod/load-script.mjs.map → node-prod/load-script.cjs.map} +1 -1
- package/dist/node-prod/load-script.js +52 -0
- package/dist/node-prod/load-script.js.map +1 -0
- package/dist/{prod/metafield-parser.js → node-prod/metafield-parser.cjs} +3 -3
- package/dist/{prod/metafield-parser.mjs.map → node-prod/metafield-parser.cjs.map} +1 -1
- package/dist/node-prod/metafield-parser.js +114 -0
- package/dist/node-prod/metafield-parser.js.map +1 -0
- package/dist/{dev/storefront-api-constants.js → node-prod/storefront-api-constants.cjs} +1 -1
- package/dist/node-prod/storefront-api-constants.cjs.map +1 -0
- package/dist/node-prod/storefront-api-constants.js +5 -0
- package/dist/node-prod/storefront-api-constants.js.map +1 -0
- package/dist/{prod/storefront-client.js → node-prod/storefront-client.cjs} +2 -2
- package/dist/{prod/storefront-client.mjs.map → node-prod/storefront-client.cjs.map} +1 -1
- package/dist/node-prod/storefront-client.js +57 -0
- package/dist/node-prod/storefront-client.js.map +1 -0
- package/dist/{dev/useCartAPIStateMachine.js → node-prod/useCartAPIStateMachine.cjs} +15 -15
- package/dist/{dev/useCartAPIStateMachine.mjs.map → node-prod/useCartAPIStateMachine.cjs.map} +1 -1
- package/dist/node-prod/useCartAPIStateMachine.js +326 -0
- package/dist/node-prod/useCartAPIStateMachine.js.map +1 -0
- package/dist/{prod/useCartActions.js → node-prod/useCartActions.cjs} +14 -14
- package/dist/{prod/useCartActions.mjs.map → node-prod/useCartActions.cjs.map} +1 -1
- package/dist/node-prod/useCartActions.js +123 -0
- package/dist/node-prod/useCartActions.js.map +1 -0
- package/dist/{dev/useMoney.js → node-prod/useMoney.cjs} +7 -7
- package/dist/{prod/useMoney.mjs.map → node-prod/useMoney.cjs.map} +1 -1
- package/dist/node-prod/useMoney.js +72 -0
- package/dist/node-prod/useMoney.js.map +1 -0
- package/package.json +35 -20
- package/dist/dev/_virtual/index.js +0 -5
- package/dist/dev/_virtual/index.mjs.map +0 -1
- package/dist/dev/_virtual/use-sync-external-store-shim.development.js +0 -5
- package/dist/dev/_virtual/use-sync-external-store-shim.development.mjs.map +0 -1
- package/dist/dev/_virtual/use-sync-external-store-shim.production.min.js +0 -5
- package/dist/dev/_virtual/use-sync-external-store-shim.production.min.js.map +0 -1
- package/dist/dev/_virtual/use-sync-external-store-shim.production.min.mjs.map +0 -1
- package/dist/dev/_virtual/with-selector.development.js +0 -5
- package/dist/dev/_virtual/with-selector.development.mjs.map +0 -1
- package/dist/dev/_virtual/with-selector.js +0 -5
- package/dist/dev/_virtual/with-selector.mjs.map +0 -1
- package/dist/dev/_virtual/with-selector.production.min.js +0 -5
- package/dist/dev/_virtual/with-selector.production.min.mjs.map +0 -1
- package/dist/dev/index.js.map +0 -1
- package/dist/dev/index.mjs +0 -46
- package/dist/dev/index.mjs.map +0 -1
- package/dist/dev/node_modules/@xstate/fsm/es/index.js +0 -158
- package/dist/dev/node_modules/@xstate/fsm/es/index.js.map +0 -1
- package/dist/dev/node_modules/@xstate/fsm/es/index.mjs.map +0 -1
- package/dist/dev/node_modules/@xstate/react/es/fsm.js +0 -94
- package/dist/dev/node_modules/@xstate/react/es/fsm.mjs.map +0 -1
- package/dist/dev/node_modules/@xstate/react/es/useConstant.js +0 -30
- package/dist/dev/node_modules/@xstate/react/es/useConstant.mjs.map +0 -1
- package/dist/dev/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js +0 -5
- package/dist/dev/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.mjs.map +0 -1
- package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js +0 -107
- package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs.map +0 -1
- package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js +0 -74
- package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js.map +0 -1
- package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.mjs.map +0 -1
- package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +0 -138
- package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs.map +0 -1
- package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js +0 -60
- package/dist/dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.mjs.map +0 -1
- package/dist/dev/node_modules/use-sync-external-store/shim/index.js +0 -21
- package/dist/dev/node_modules/use-sync-external-store/shim/index.mjs.map +0 -1
- package/dist/dev/node_modules/use-sync-external-store/shim/with-selector.js +0 -12
- package/dist/dev/node_modules/use-sync-external-store/shim/with-selector.mjs.map +0 -1
- package/dist/dev/storefront-api-constants.mjs.map +0 -1
- package/dist/prod/_virtual/index.js +0 -5
- package/dist/prod/_virtual/index.mjs.map +0 -1
- package/dist/prod/_virtual/use-sync-external-store-shim.development.js +0 -5
- package/dist/prod/_virtual/use-sync-external-store-shim.development.mjs.map +0 -1
- package/dist/prod/_virtual/use-sync-external-store-shim.production.min.js +0 -5
- package/dist/prod/_virtual/use-sync-external-store-shim.production.min.js.map +0 -1
- package/dist/prod/_virtual/use-sync-external-store-shim.production.min.mjs.map +0 -1
- package/dist/prod/_virtual/with-selector.development.js +0 -5
- package/dist/prod/_virtual/with-selector.development.mjs.map +0 -1
- package/dist/prod/_virtual/with-selector.js +0 -5
- package/dist/prod/_virtual/with-selector.mjs.map +0 -1
- package/dist/prod/_virtual/with-selector.production.min.js +0 -5
- package/dist/prod/_virtual/with-selector.production.min.mjs.map +0 -1
- package/dist/prod/index.js.map +0 -1
- package/dist/prod/index.mjs +0 -46
- package/dist/prod/index.mjs.map +0 -1
- package/dist/prod/node_modules/@xstate/fsm/es/index.js +0 -158
- package/dist/prod/node_modules/@xstate/fsm/es/index.js.map +0 -1
- package/dist/prod/node_modules/@xstate/fsm/es/index.mjs.map +0 -1
- package/dist/prod/node_modules/@xstate/react/es/fsm.js +0 -94
- package/dist/prod/node_modules/@xstate/react/es/fsm.mjs.map +0 -1
- package/dist/prod/node_modules/@xstate/react/es/useConstant.js +0 -30
- package/dist/prod/node_modules/@xstate/react/es/useConstant.mjs.map +0 -1
- package/dist/prod/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js +0 -5
- package/dist/prod/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.mjs.map +0 -1
- package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js +0 -107
- package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs.map +0 -1
- package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js +0 -74
- package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js.map +0 -1
- package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.mjs.map +0 -1
- package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +0 -138
- package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs.map +0 -1
- package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js +0 -60
- package/dist/prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.mjs.map +0 -1
- package/dist/prod/node_modules/use-sync-external-store/shim/index.js +0 -21
- package/dist/prod/node_modules/use-sync-external-store/shim/index.mjs.map +0 -1
- package/dist/prod/node_modules/use-sync-external-store/shim/with-selector.js +0 -12
- package/dist/prod/node_modules/use-sync-external-store/shim/with-selector.mjs.map +0 -1
- package/dist/prod/storefront-api-constants.mjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
-
const useMoney = require("./useMoney.
|
|
3
|
+
const useMoney = require("./useMoney.cjs");
|
|
4
4
|
const jsxRuntime = require("react/jsx-runtime");
|
|
5
5
|
function Money({
|
|
6
6
|
data,
|
|
@@ -37,4 +37,4 @@ function isMoney(maybeMoney) {
|
|
|
37
37
|
return typeof maybeMoney.amount === "string" && !!maybeMoney.amount && typeof maybeMoney.currencyCode === "string" && !!maybeMoney.currencyCode;
|
|
38
38
|
}
|
|
39
39
|
exports.Money = Money;
|
|
40
|
-
//# sourceMappingURL=Money.
|
|
40
|
+
//# sourceMappingURL=Money.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Money.
|
|
1
|
+
{"version":3,"file":"Money.cjs","sources":["../../src/Money.tsx"],"sourcesContent":["import {type ReactNode} from 'react';\nimport {useMoney} from './useMoney.js';\nimport type {MoneyV2, UnitPriceMeasurement} from './storefront-api-types.js';\nimport type {PartialDeep} from 'type-fest';\n\ninterface CustomProps<ComponentGeneric extends React.ElementType> {\n /** An HTML tag or React Component to be rendered as the base element wrapper. The default is `div`. */\n as?: ComponentGeneric;\n /** An object with fields that correspond to the Storefront API's [MoneyV2 object](https://shopify.dev/api/storefront/reference/common-objects/moneyv2). */\n data: PartialDeep<MoneyV2, {recurseIntoArrays: true}>;\n /** Whether to remove the currency symbol from the output. */\n withoutCurrency?: boolean;\n /** Whether to remove trailing zeros (fractional money) from the output. */\n withoutTrailingZeros?: boolean;\n /** A [UnitPriceMeasurement object](https://shopify.dev/api/storefront/latest/objects/unitpricemeasurement). */\n measurement?: PartialDeep<UnitPriceMeasurement, {recurseIntoArrays: true}>;\n /** Customizes the separator between the money output and the measurement output. Used with the `measurement` prop. Defaults to `'/'`. */\n measurementSeparator?: ReactNode;\n}\n\n// This article helps understand the typing here https://www.benmvp.com/blog/polymorphic-react-components-typescript/ Ben is the best :)\nexport type MoneyProps<ComponentGeneric extends React.ElementType> =\n CustomProps<ComponentGeneric> &\n Omit<\n React.ComponentPropsWithoutRef<ComponentGeneric>,\n keyof CustomProps<ComponentGeneric>\n >;\n\n/**\n * The `Money` component renders a string of the Storefront API's\n * [MoneyV2 object](https://shopify.dev/api/storefront/reference/common-objects/moneyv2) according to the\n * `locale` in the `ShopifyProvider` component.\n */\nexport function Money<ComponentGeneric extends React.ElementType>({\n data,\n as,\n withoutCurrency,\n withoutTrailingZeros,\n measurement,\n measurementSeparator = '/',\n ...passthroughProps\n}: MoneyProps<ComponentGeneric>) {\n if (!isMoney(data)) {\n throw new Error(\n `<Money/> needs a valid 'data' prop that has 'amount' and 'currencyCode'`\n );\n }\n const moneyObject = useMoney(data);\n const Wrapper = as ?? 'div';\n\n let output = moneyObject.localizedString;\n\n if (withoutCurrency || withoutTrailingZeros) {\n if (withoutCurrency && !withoutTrailingZeros) {\n output = moneyObject.amount;\n } else if (!withoutCurrency && withoutTrailingZeros) {\n output = moneyObject.withoutTrailingZeros;\n } else {\n // both\n output = moneyObject.withoutTrailingZerosAndCurrency;\n }\n }\n\n return (\n <Wrapper {...passthroughProps}>\n {output}\n {measurement && measurement.referenceUnit && (\n <>\n {measurementSeparator}\n {measurement.referenceUnit}\n </>\n )}\n </Wrapper>\n );\n}\n\n// required in order to narrow the money object down and make TS happy\nfunction isMoney(\n maybeMoney: PartialDeep<MoneyV2, {recurseIntoArrays: true}>\n): maybeMoney is MoneyV2 {\n return (\n typeof maybeMoney.amount === 'string' &&\n !!maybeMoney.amount &&\n typeof maybeMoney.currencyCode === 'string' &&\n !!maybeMoney.currencyCode\n );\n}\n"],"names":["Money","data","as","withoutCurrency","withoutTrailingZeros","measurement","measurementSeparator","passthroughProps","isMoney","Error","moneyObject","useMoney","Wrapper","output","localizedString","amount","withoutTrailingZerosAndCurrency","referenceUnit","_Fragment","maybeMoney","currencyCode"],"mappings":";;;;AAiCO,SAASA,MAAkD;AAAA,EAChEC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC,uBAAuB;AAAA,KACpBC;AAP6D,GAQjC;AAC3B,MAAA,CAACC,QAAQP,IAAD,GAAQ;AACZ,UAAA,IAAIQ,MACP,yEADG;AAAA,EAGP;AACKC,QAAAA,cAAcC,kBAASV,IAAD;AAC5B,QAAMW,UAAUV,kBAAM;AAEtB,MAAIW,SAASH,YAAYI;AAEzB,MAAIX,mBAAmBC,sBAAsB;AACvCD,QAAAA,mBAAmB,CAACC,sBAAsB;AAC5CS,eAASH,YAAYK;AAAAA,IAAAA,WACZ,CAACZ,mBAAmBC,sBAAsB;AACnDS,eAASH,YAAYN;AAAAA,IAAAA,OAChB;AAELS,eAASH,YAAYM;AAAAA,IACtB;AAAA,EACF;AAED,yCACG,SAAD;AAAA,IAAA,GAAaT;AAAAA,IAAb,UAAA,CACGM,QACAR,eAAeA,YAAYY,iDAC1BC,qBAAA;AAAA,MAAA,UAAA,CACGZ,sBACAD,YAAYY,aAFf;AAAA,IAAA,CAHJ,CAAA;AAAA,EAAA,CADF;AAWD;AAGD,SAAST,QACPW,YACuB;AACvB,SACE,OAAOA,WAAWJ,WAAW,YAC7B,CAAC,CAACI,WAAWJ,UACb,OAAOI,WAAWC,iBAAiB,YACnC,CAAC,CAACD,WAAWC;AAEhB;;"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { useMoney } from "./useMoney.js";
|
|
2
|
+
import { jsxs, Fragment } from "react/jsx-runtime";
|
|
3
|
+
function Money({
|
|
4
|
+
data,
|
|
5
|
+
as,
|
|
6
|
+
withoutCurrency,
|
|
7
|
+
withoutTrailingZeros,
|
|
8
|
+
measurement,
|
|
9
|
+
measurementSeparator = "/",
|
|
10
|
+
...passthroughProps
|
|
11
|
+
}) {
|
|
12
|
+
if (!isMoney(data)) {
|
|
13
|
+
throw new Error(`<Money/> needs a valid 'data' prop that has 'amount' and 'currencyCode'`);
|
|
14
|
+
}
|
|
15
|
+
const moneyObject = useMoney(data);
|
|
16
|
+
const Wrapper = as != null ? as : "div";
|
|
17
|
+
let output = moneyObject.localizedString;
|
|
18
|
+
if (withoutCurrency || withoutTrailingZeros) {
|
|
19
|
+
if (withoutCurrency && !withoutTrailingZeros) {
|
|
20
|
+
output = moneyObject.amount;
|
|
21
|
+
} else if (!withoutCurrency && withoutTrailingZeros) {
|
|
22
|
+
output = moneyObject.withoutTrailingZeros;
|
|
23
|
+
} else {
|
|
24
|
+
output = moneyObject.withoutTrailingZerosAndCurrency;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return /* @__PURE__ */ jsxs(Wrapper, {
|
|
28
|
+
...passthroughProps,
|
|
29
|
+
children: [output, measurement && measurement.referenceUnit && /* @__PURE__ */ jsxs(Fragment, {
|
|
30
|
+
children: [measurementSeparator, measurement.referenceUnit]
|
|
31
|
+
})]
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function isMoney(maybeMoney) {
|
|
35
|
+
return typeof maybeMoney.amount === "string" && !!maybeMoney.amount && typeof maybeMoney.currencyCode === "string" && !!maybeMoney.currencyCode;
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
Money
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=Money.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Money.js","sources":["../../src/Money.tsx"],"sourcesContent":["import {type ReactNode} from 'react';\nimport {useMoney} from './useMoney.js';\nimport type {MoneyV2, UnitPriceMeasurement} from './storefront-api-types.js';\nimport type {PartialDeep} from 'type-fest';\n\ninterface CustomProps<ComponentGeneric extends React.ElementType> {\n /** An HTML tag or React Component to be rendered as the base element wrapper. The default is `div`. */\n as?: ComponentGeneric;\n /** An object with fields that correspond to the Storefront API's [MoneyV2 object](https://shopify.dev/api/storefront/reference/common-objects/moneyv2). */\n data: PartialDeep<MoneyV2, {recurseIntoArrays: true}>;\n /** Whether to remove the currency symbol from the output. */\n withoutCurrency?: boolean;\n /** Whether to remove trailing zeros (fractional money) from the output. */\n withoutTrailingZeros?: boolean;\n /** A [UnitPriceMeasurement object](https://shopify.dev/api/storefront/latest/objects/unitpricemeasurement). */\n measurement?: PartialDeep<UnitPriceMeasurement, {recurseIntoArrays: true}>;\n /** Customizes the separator between the money output and the measurement output. Used with the `measurement` prop. Defaults to `'/'`. */\n measurementSeparator?: ReactNode;\n}\n\n// This article helps understand the typing here https://www.benmvp.com/blog/polymorphic-react-components-typescript/ Ben is the best :)\nexport type MoneyProps<ComponentGeneric extends React.ElementType> =\n CustomProps<ComponentGeneric> &\n Omit<\n React.ComponentPropsWithoutRef<ComponentGeneric>,\n keyof CustomProps<ComponentGeneric>\n >;\n\n/**\n * The `Money` component renders a string of the Storefront API's\n * [MoneyV2 object](https://shopify.dev/api/storefront/reference/common-objects/moneyv2) according to the\n * `locale` in the `ShopifyProvider` component.\n */\nexport function Money<ComponentGeneric extends React.ElementType>({\n data,\n as,\n withoutCurrency,\n withoutTrailingZeros,\n measurement,\n measurementSeparator = '/',\n ...passthroughProps\n}: MoneyProps<ComponentGeneric>) {\n if (!isMoney(data)) {\n throw new Error(\n `<Money/> needs a valid 'data' prop that has 'amount' and 'currencyCode'`\n );\n }\n const moneyObject = useMoney(data);\n const Wrapper = as ?? 'div';\n\n let output = moneyObject.localizedString;\n\n if (withoutCurrency || withoutTrailingZeros) {\n if (withoutCurrency && !withoutTrailingZeros) {\n output = moneyObject.amount;\n } else if (!withoutCurrency && withoutTrailingZeros) {\n output = moneyObject.withoutTrailingZeros;\n } else {\n // both\n output = moneyObject.withoutTrailingZerosAndCurrency;\n }\n }\n\n return (\n <Wrapper {...passthroughProps}>\n {output}\n {measurement && measurement.referenceUnit && (\n <>\n {measurementSeparator}\n {measurement.referenceUnit}\n </>\n )}\n </Wrapper>\n );\n}\n\n// required in order to narrow the money object down and make TS happy\nfunction isMoney(\n maybeMoney: PartialDeep<MoneyV2, {recurseIntoArrays: true}>\n): maybeMoney is MoneyV2 {\n return (\n typeof maybeMoney.amount === 'string' &&\n !!maybeMoney.amount &&\n typeof maybeMoney.currencyCode === 'string' &&\n !!maybeMoney.currencyCode\n );\n}\n"],"names":["Money","data","as","withoutCurrency","withoutTrailingZeros","measurement","measurementSeparator","passthroughProps","isMoney","Error","moneyObject","useMoney","Wrapper","output","localizedString","amount","withoutTrailingZerosAndCurrency","referenceUnit","_Fragment","maybeMoney","currencyCode"],"mappings":";;AAiCO,SAASA,MAAkD;AAAA,EAChEC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC,uBAAuB;AAAA,KACpBC;AAP6D,GAQjC;AAC3B,MAAA,CAACC,QAAQP,IAAD,GAAQ;AACZ,UAAA,IAAIQ,MACP,yEADG;AAAA,EAGP;AACKC,QAAAA,cAAcC,SAASV,IAAD;AAC5B,QAAMW,UAAUV,kBAAM;AAEtB,MAAIW,SAASH,YAAYI;AAEzB,MAAIX,mBAAmBC,sBAAsB;AACvCD,QAAAA,mBAAmB,CAACC,sBAAsB;AAC5CS,eAASH,YAAYK;AAAAA,IAAAA,WACZ,CAACZ,mBAAmBC,sBAAsB;AACnDS,eAASH,YAAYN;AAAAA,IAAAA,OAChB;AAELS,eAASH,YAAYM;AAAAA,IACtB;AAAA,EACF;AAED,8BACG,SAAD;AAAA,IAAA,GAAaT;AAAAA,IAAb,UAAA,CACGM,QACAR,eAAeA,YAAYY,sCAC1BC,UAAA;AAAA,MAAA,UAAA,CACGZ,sBACAD,YAAYY,aAFf;AAAA,IAAA,CAHJ,CAAA;AAAA,EAAA,CADF;AAWD;AAGD,SAAST,QACPW,YACuB;AACvB,SACE,OAAOA,WAAWJ,WAAW,YAC7B,CAAC,CAACI,WAAWJ,UACb,OAAOI,WAAWC,iBAAiB,YACnC,CAAC,CAACD,WAAWC;AAEhB;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
-
const Money = require("./Money.
|
|
4
|
-
const flattenConnection = require("./flatten-connection.
|
|
3
|
+
const Money = require("./Money.cjs");
|
|
4
|
+
const flattenConnection = require("./flatten-connection.cjs");
|
|
5
5
|
const jsxRuntime = require("react/jsx-runtime");
|
|
6
6
|
function ProductPrice(props) {
|
|
7
7
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
@@ -58,4 +58,4 @@ function ProductPrice(props) {
|
|
|
58
58
|
});
|
|
59
59
|
}
|
|
60
60
|
exports.ProductPrice = ProductPrice;
|
|
61
|
-
//# sourceMappingURL=ProductPrice.
|
|
61
|
+
//# sourceMappingURL=ProductPrice.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductPrice.
|
|
1
|
+
{"version":3,"file":"ProductPrice.cjs","sources":["../../src/ProductPrice.tsx"],"sourcesContent":["import type {\n MoneyV2,\n UnitPriceMeasurement,\n Product,\n} from './storefront-api-types.js';\nimport {Money, type MoneyProps} from './Money.js';\nimport type {PartialDeep} from 'type-fest';\nimport {flattenConnection} from './flatten-connection.js';\n\nexport interface ProductPriceProps {\n /** A [Product object](https://shopify.dev/api/storefront/reference/products/product). */\n data: PartialDeep<Product, {recurseIntoArrays: true}>;\n /** The type of price. Valid values: `regular` (default) or `compareAt`. */\n priceType?: 'regular' | 'compareAt';\n /** The type of value. Valid values: `min` (default), `max` or `unit`. */\n valueType?: 'max' | 'min' | 'unit';\n /** The ID of the variant. */\n variantId?: string;\n}\n\n/**\n * The `ProductPrice` component renders a `Money` component with the product\n * [`priceRange`](https://shopify.dev/api/storefront/reference/products/productpricerange)'s `maxVariantPrice` or `minVariantPrice`, for either the regular price or compare at price range.\n */\nexport function ProductPrice<ComponentGeneric extends React.ElementType>(\n props: ProductPriceProps &\n Omit<MoneyProps<ComponentGeneric>, 'data' | 'measurement'>\n) {\n const {\n priceType = 'regular',\n variantId,\n valueType = 'min',\n data: product,\n ...passthroughProps\n } = props;\n\n if (product == null) {\n throw new Error(`<ProductPrice/> requires a product as the 'data' prop`);\n }\n\n let price: Partial<MoneyV2> | undefined | null;\n let measurement: Partial<UnitPriceMeasurement> | undefined | null;\n\n const variant = variantId\n ? flattenConnection(product?.variants ?? {}).find(\n (variant) => variant?.id === variantId\n ) ?? null\n : null;\n\n if (priceType === 'compareAt') {\n if (variantId && variant) {\n if (variant.compareAtPriceV2?.amount === variant.priceV2?.amount) {\n return null;\n }\n price = variant.compareAtPriceV2;\n } else if (valueType === 'max') {\n price = product?.compareAtPriceRange?.maxVariantPrice;\n } else {\n price = product?.compareAtPriceRange?.minVariantPrice;\n }\n } else {\n if (variantId && variant) {\n price = variant.priceV2;\n if (valueType === 'unit') {\n price = variant.unitPrice;\n measurement = variant.unitPriceMeasurement;\n }\n } else if (valueType === 'max') {\n price = product.priceRange?.maxVariantPrice;\n } else {\n price = product.priceRange?.minVariantPrice;\n }\n }\n\n if (!price) {\n return null;\n }\n\n if (measurement) {\n return (\n <Money {...passthroughProps} data={price} measurement={measurement} />\n );\n }\n\n return <Money {...passthroughProps} data={price} />;\n}\n"],"names":["ProductPrice","props","priceType","variantId","valueType","data","product","passthroughProps","Error","price","measurement","variant","flattenConnection","variants","find","id","compareAtPriceV2","amount","priceV2","compareAtPriceRange","maxVariantPrice","minVariantPrice","unitPrice","unitPriceMeasurement","priceRange","Money"],"mappings":";;;;;AAwBO,SAASA,aACdC,OAEA;;AACM,QAAA;AAAA,IACJC,YAAY;AAAA,IACZC;AAAAA,IACAC,YAAY;AAAA,IACZC,MAAMC;AAAAA,OACHC;AAAAA,EACDN,IAAAA;AAEJ,MAAIK,WAAW,MAAM;AACb,UAAA,IAAIE,MAAO,uDAAX;AAAA,EACP;AAEGC,MAAAA;AACAC,MAAAA;AAEJ,QAAMC,UAAUR,aACZS,uBAAAA,mBAAkBN,wCAASO,aAATP,YAAqB,CAAA,CAAtB,EAA0BQ,KACxCH,CAAAA,cAAYA,qCAASI,QAAOZ,SAD/B,MAAAS,YAEK,OACL;AAEJ,MAAIV,cAAc,aAAa;AAC7B,QAAIC,aAAaQ,SAAS;AACxB,YAAIA,aAAQK,qBAARL,mBAA0BM,cAAWN,aAAQO,YAARP,mBAAiBM,SAAQ;AACzD,eAAA;AAAA,MACR;AACDR,cAAQE,QAAQK;AAAAA,IAAAA,WACPZ,cAAc,OAAO;AAC9BK,eAAQH,wCAASa,wBAATb,mBAA8Bc;AAAAA,IAAAA,OACjC;AACLX,eAAQH,wCAASa,wBAATb,mBAA8Be;AAAAA,IACvC;AAAA,EAAA,OACI;AACL,QAAIlB,aAAaQ,SAAS;AACxBF,cAAQE,QAAQO;AAChB,UAAId,cAAc,QAAQ;AACxBK,gBAAQE,QAAQW;AAChBZ,sBAAcC,QAAQY;AAAAA,MACvB;AAAA,IAAA,WACQnB,cAAc,OAAO;AAC9BK,eAAQH,aAAQkB,eAARlB,mBAAoBc;AAAAA,IAAAA,OACvB;AACLX,eAAQH,aAAQkB,eAARlB,mBAAoBe;AAAAA,IAC7B;AAAA,EACF;AAED,MAAI,CAACZ,OAAO;AACH,WAAA;AAAA,EACR;AAED,MAAIC,aAAa;AACf,0CACGe,MAAAA,OAAD;AAAA,MAAA,GAAWlB;AAAAA,MAAkB,MAAME;AAAAA,MAAO;AAAA,IAAA,CAD5C;AAAA,EAGD;AAED,wCAAQgB,MAAAA,OAAD;AAAA,IAAA,GAAWlB;AAAAA,IAAkB,MAAME;AAAAA,EAAAA,CAA1C;AACD;;"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Money } from "./Money.js";
|
|
2
|
+
import { flattenConnection } from "./flatten-connection.js";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
function ProductPrice(props) {
|
|
5
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
6
|
+
const {
|
|
7
|
+
priceType = "regular",
|
|
8
|
+
variantId,
|
|
9
|
+
valueType = "min",
|
|
10
|
+
data: product,
|
|
11
|
+
...passthroughProps
|
|
12
|
+
} = props;
|
|
13
|
+
if (product == null) {
|
|
14
|
+
throw new Error(`<ProductPrice/> requires a product as the 'data' prop`);
|
|
15
|
+
}
|
|
16
|
+
let price;
|
|
17
|
+
let measurement;
|
|
18
|
+
const variant = variantId ? (_b = flattenConnection((_a = product == null ? void 0 : product.variants) != null ? _a : {}).find((variant2) => (variant2 == null ? void 0 : variant2.id) === variantId)) != null ? _b : null : null;
|
|
19
|
+
if (priceType === "compareAt") {
|
|
20
|
+
if (variantId && variant) {
|
|
21
|
+
if (((_c = variant.compareAtPriceV2) == null ? void 0 : _c.amount) === ((_d = variant.priceV2) == null ? void 0 : _d.amount)) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
price = variant.compareAtPriceV2;
|
|
25
|
+
} else if (valueType === "max") {
|
|
26
|
+
price = (_e = product == null ? void 0 : product.compareAtPriceRange) == null ? void 0 : _e.maxVariantPrice;
|
|
27
|
+
} else {
|
|
28
|
+
price = (_f = product == null ? void 0 : product.compareAtPriceRange) == null ? void 0 : _f.minVariantPrice;
|
|
29
|
+
}
|
|
30
|
+
} else {
|
|
31
|
+
if (variantId && variant) {
|
|
32
|
+
price = variant.priceV2;
|
|
33
|
+
if (valueType === "unit") {
|
|
34
|
+
price = variant.unitPrice;
|
|
35
|
+
measurement = variant.unitPriceMeasurement;
|
|
36
|
+
}
|
|
37
|
+
} else if (valueType === "max") {
|
|
38
|
+
price = (_g = product.priceRange) == null ? void 0 : _g.maxVariantPrice;
|
|
39
|
+
} else {
|
|
40
|
+
price = (_h = product.priceRange) == null ? void 0 : _h.minVariantPrice;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (!price) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
if (measurement) {
|
|
47
|
+
return /* @__PURE__ */ jsx(Money, {
|
|
48
|
+
...passthroughProps,
|
|
49
|
+
data: price,
|
|
50
|
+
measurement
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return /* @__PURE__ */ jsx(Money, {
|
|
54
|
+
...passthroughProps,
|
|
55
|
+
data: price
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
export {
|
|
59
|
+
ProductPrice
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=ProductPrice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductPrice.js","sources":["../../src/ProductPrice.tsx"],"sourcesContent":["import type {\n MoneyV2,\n UnitPriceMeasurement,\n Product,\n} from './storefront-api-types.js';\nimport {Money, type MoneyProps} from './Money.js';\nimport type {PartialDeep} from 'type-fest';\nimport {flattenConnection} from './flatten-connection.js';\n\nexport interface ProductPriceProps {\n /** A [Product object](https://shopify.dev/api/storefront/reference/products/product). */\n data: PartialDeep<Product, {recurseIntoArrays: true}>;\n /** The type of price. Valid values: `regular` (default) or `compareAt`. */\n priceType?: 'regular' | 'compareAt';\n /** The type of value. Valid values: `min` (default), `max` or `unit`. */\n valueType?: 'max' | 'min' | 'unit';\n /** The ID of the variant. */\n variantId?: string;\n}\n\n/**\n * The `ProductPrice` component renders a `Money` component with the product\n * [`priceRange`](https://shopify.dev/api/storefront/reference/products/productpricerange)'s `maxVariantPrice` or `minVariantPrice`, for either the regular price or compare at price range.\n */\nexport function ProductPrice<ComponentGeneric extends React.ElementType>(\n props: ProductPriceProps &\n Omit<MoneyProps<ComponentGeneric>, 'data' | 'measurement'>\n) {\n const {\n priceType = 'regular',\n variantId,\n valueType = 'min',\n data: product,\n ...passthroughProps\n } = props;\n\n if (product == null) {\n throw new Error(`<ProductPrice/> requires a product as the 'data' prop`);\n }\n\n let price: Partial<MoneyV2> | undefined | null;\n let measurement: Partial<UnitPriceMeasurement> | undefined | null;\n\n const variant = variantId\n ? flattenConnection(product?.variants ?? {}).find(\n (variant) => variant?.id === variantId\n ) ?? null\n : null;\n\n if (priceType === 'compareAt') {\n if (variantId && variant) {\n if (variant.compareAtPriceV2?.amount === variant.priceV2?.amount) {\n return null;\n }\n price = variant.compareAtPriceV2;\n } else if (valueType === 'max') {\n price = product?.compareAtPriceRange?.maxVariantPrice;\n } else {\n price = product?.compareAtPriceRange?.minVariantPrice;\n }\n } else {\n if (variantId && variant) {\n price = variant.priceV2;\n if (valueType === 'unit') {\n price = variant.unitPrice;\n measurement = variant.unitPriceMeasurement;\n }\n } else if (valueType === 'max') {\n price = product.priceRange?.maxVariantPrice;\n } else {\n price = product.priceRange?.minVariantPrice;\n }\n }\n\n if (!price) {\n return null;\n }\n\n if (measurement) {\n return (\n <Money {...passthroughProps} data={price} measurement={measurement} />\n );\n }\n\n return <Money {...passthroughProps} data={price} />;\n}\n"],"names":["ProductPrice","props","priceType","variantId","valueType","data","product","passthroughProps","Error","price","measurement","variant","flattenConnection","variants","find","id","compareAtPriceV2","amount","priceV2","compareAtPriceRange","maxVariantPrice","minVariantPrice","unitPrice","unitPriceMeasurement","priceRange"],"mappings":";;;AAwBO,SAASA,aACdC,OAEA;;AACM,QAAA;AAAA,IACJC,YAAY;AAAA,IACZC;AAAAA,IACAC,YAAY;AAAA,IACZC,MAAMC;AAAAA,OACHC;AAAAA,EACDN,IAAAA;AAEJ,MAAIK,WAAW,MAAM;AACb,UAAA,IAAIE,MAAO,uDAAX;AAAA,EACP;AAEGC,MAAAA;AACAC,MAAAA;AAEJ,QAAMC,UAAUR,aACZS,wBAAkBN,wCAASO,aAATP,YAAqB,CAAA,CAAtB,EAA0BQ,KACxCH,CAAAA,cAAYA,qCAASI,QAAOZ,SAD/B,MAAAS,YAEK,OACL;AAEJ,MAAIV,cAAc,aAAa;AAC7B,QAAIC,aAAaQ,SAAS;AACxB,YAAIA,aAAQK,qBAARL,mBAA0BM,cAAWN,aAAQO,YAARP,mBAAiBM,SAAQ;AACzD,eAAA;AAAA,MACR;AACDR,cAAQE,QAAQK;AAAAA,IAAAA,WACPZ,cAAc,OAAO;AAC9BK,eAAQH,wCAASa,wBAATb,mBAA8Bc;AAAAA,IAAAA,OACjC;AACLX,eAAQH,wCAASa,wBAATb,mBAA8Be;AAAAA,IACvC;AAAA,EAAA,OACI;AACL,QAAIlB,aAAaQ,SAAS;AACxBF,cAAQE,QAAQO;AAChB,UAAId,cAAc,QAAQ;AACxBK,gBAAQE,QAAQW;AAChBZ,sBAAcC,QAAQY;AAAAA,MACvB;AAAA,IAAA,WACQnB,cAAc,OAAO;AAC9BK,eAAQH,aAAQkB,eAARlB,mBAAoBc;AAAAA,IAAAA,OACvB;AACLX,eAAQH,aAAQkB,eAARlB,mBAAoBe;AAAAA,IAC7B;AAAA,EACF;AAED,MAAI,CAACZ,OAAO;AACH,WAAA;AAAA,EACR;AAED,MAAIC,aAAa;AACf,+BACG,OAAD;AAAA,MAAA,GAAWH;AAAAA,MAAkB,MAAME;AAAAA,MAAO;AAAA,IAAA,CAD5C;AAAA,EAGD;AAED,6BAAQ,OAAD;AAAA,IAAA,GAAWF;AAAAA,IAAkB,MAAME;AAAAA,EAAAA,CAA1C;AACD;"}
|
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
-
const
|
|
4
|
-
const flattenConnection = require("./flatten-connection.
|
|
3
|
+
const react = require("react");
|
|
4
|
+
const flattenConnection = require("./flatten-connection.cjs");
|
|
5
5
|
const jsxRuntime = require("react/jsx-runtime");
|
|
6
|
-
const ProductOptionsContext =
|
|
6
|
+
const ProductOptionsContext = react.createContext(null);
|
|
7
7
|
function ProductProvider({
|
|
8
8
|
children,
|
|
9
9
|
data: product,
|
|
10
10
|
initialVariantId: explicitVariantId
|
|
11
11
|
}) {
|
|
12
|
-
const variants =
|
|
12
|
+
const variants = react.useMemo(() => {
|
|
13
13
|
var _a;
|
|
14
14
|
return flattenConnection.flattenConnection((_a = product.variants) != null ? _a : {});
|
|
15
15
|
}, [product.variants]);
|
|
16
16
|
if (!isProductVariantArray(variants)) {
|
|
17
17
|
throw new Error(`<ProductProvider/> requires 'product.variants.nodes' or 'product.variants.edges'`);
|
|
18
18
|
}
|
|
19
|
-
const options =
|
|
20
|
-
const [selectedVariant, setSelectedVariant] =
|
|
21
|
-
const [selectedOptions, setSelectedOptions] =
|
|
22
|
-
|
|
19
|
+
const options = react.useMemo(() => getOptions(variants), [variants]);
|
|
20
|
+
const [selectedVariant, setSelectedVariant] = react.useState(() => getVariantBasedOnIdProp(explicitVariantId, variants));
|
|
21
|
+
const [selectedOptions, setSelectedOptions] = react.useState(() => getSelectedOptions(selectedVariant));
|
|
22
|
+
react.useEffect(() => {
|
|
23
23
|
const newSelectedVariant = getVariantBasedOnIdProp(explicitVariantId, variants);
|
|
24
24
|
setSelectedVariant(newSelectedVariant);
|
|
25
25
|
setSelectedOptions(getSelectedOptions(newSelectedVariant));
|
|
26
26
|
}, [explicitVariantId, variants]);
|
|
27
|
-
const setSelectedOption =
|
|
27
|
+
const setSelectedOption = react.useCallback((name, value2) => {
|
|
28
28
|
setSelectedOptions((selectedOptions2) => {
|
|
29
29
|
const opts = {
|
|
30
30
|
...selectedOptions2,
|
|
@@ -34,7 +34,7 @@ function ProductProvider({
|
|
|
34
34
|
return opts;
|
|
35
35
|
});
|
|
36
36
|
}, [setSelectedOptions, variants]);
|
|
37
|
-
const isOptionInStock =
|
|
37
|
+
const isOptionInStock = react.useCallback((option, value2) => {
|
|
38
38
|
var _a;
|
|
39
39
|
const proposedVariant = getSelectedVariant(variants, {
|
|
40
40
|
...selectedOptions,
|
|
@@ -44,7 +44,7 @@ function ProductProvider({
|
|
|
44
44
|
});
|
|
45
45
|
return (_a = proposedVariant == null ? void 0 : proposedVariant.availableForSale) != null ? _a : true;
|
|
46
46
|
}, [selectedOptions, variants]);
|
|
47
|
-
const sellingPlanGroups =
|
|
47
|
+
const sellingPlanGroups = react.useMemo(() => {
|
|
48
48
|
var _a;
|
|
49
49
|
return flattenConnection.flattenConnection((_a = product.sellingPlanGroups) != null ? _a : {}).map((sellingPlanGroup) => {
|
|
50
50
|
var _a2;
|
|
@@ -54,8 +54,8 @@ function ProductProvider({
|
|
|
54
54
|
};
|
|
55
55
|
});
|
|
56
56
|
}, [product.sellingPlanGroups]);
|
|
57
|
-
const [selectedSellingPlan, setSelectedSellingPlan] =
|
|
58
|
-
const selectedSellingPlanAllocation =
|
|
57
|
+
const [selectedSellingPlan, setSelectedSellingPlan] = react.useState(void 0);
|
|
58
|
+
const selectedSellingPlanAllocation = react.useMemo(() => {
|
|
59
59
|
var _a, _b;
|
|
60
60
|
if (!selectedVariant || !selectedSellingPlan) {
|
|
61
61
|
return;
|
|
@@ -68,7 +68,7 @@ function ProductProvider({
|
|
|
68
68
|
return ((_a2 = allocation == null ? void 0 : allocation.sellingPlan) == null ? void 0 : _a2.id) === selectedSellingPlan.id;
|
|
69
69
|
});
|
|
70
70
|
}, [selectedVariant, selectedSellingPlan]);
|
|
71
|
-
const value =
|
|
71
|
+
const value = react.useMemo(() => ({
|
|
72
72
|
variants,
|
|
73
73
|
variantsConnection: product.variants,
|
|
74
74
|
options,
|
|
@@ -90,7 +90,7 @@ function ProductProvider({
|
|
|
90
90
|
});
|
|
91
91
|
}
|
|
92
92
|
function useProduct() {
|
|
93
|
-
const context =
|
|
93
|
+
const context = react.useContext(ProductOptionsContext);
|
|
94
94
|
if (!context) {
|
|
95
95
|
throw new Error(`'useProduct' must be a child of <ProductProvider />`);
|
|
96
96
|
}
|
|
@@ -158,4 +158,4 @@ function isProductVariantArray(maybeVariantArray) {
|
|
|
158
158
|
}
|
|
159
159
|
exports.ProductProvider = ProductProvider;
|
|
160
160
|
exports.useProduct = useProduct;
|
|
161
|
-
//# sourceMappingURL=ProductProvider.
|
|
161
|
+
//# sourceMappingURL=ProductProvider.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductProvider.mjs","sources":["../../src/ProductProvider.tsx"],"sourcesContent":["import {\n useMemo,\n useState,\n useEffect,\n useCallback,\n createContext,\n useContext,\n} from 'react';\nimport type {\n SelectedOption as SelectedOptionType,\n SellingPlan,\n SellingPlanAllocation,\n Product,\n ProductVariant as ProductVariantType,\n ProductVariantConnection,\n SellingPlan as SellingPlanType,\n SellingPlanAllocation as SellingPlanAllocationType,\n SellingPlanGroup as SellingPlanGroupType,\n SellingPlanGroupConnection,\n} from './storefront-api-types.js';\nimport type {PartialDeep} from 'type-fest';\nimport {flattenConnection} from './flatten-connection.js';\n\nconst ProductOptionsContext = createContext<ProductHookValue | null>(null);\n\ntype InitialVariantId = ProductVariantType['id'] | null;\n\ninterface ProductProviderProps {\n /** A [Product object](https://shopify.dev/api/storefront/reference/products/product). */\n data: PartialDeep<Product, {recurseIntoArrays: true}>;\n /** A `ReactNode` element. */\n children: React.ReactNode;\n /**\n * The initially selected variant.\n * The following logic applies to `initialVariantId`:\n * 1. If `initialVariantId` is provided, then it's used even if it's out of stock.\n * 2. If `initialVariantId` is provided but is `null`, then no variant is used.\n * 3. If nothing is passed to `initialVariantId` then the first available / in-stock variant is used.\n * 4. If nothing is passed to `initialVariantId` and no variants are in stock, then the first variant is used.\n */\n initialVariantId?: InitialVariantId;\n}\n\n/**\n * `<ProductProvider />` is a context provider that enables use of the `useProduct()` hook.\n *\n * It helps manage selected options and variants for a product.\n */\nexport function ProductProvider({\n children,\n data: product,\n initialVariantId: explicitVariantId,\n}: ProductProviderProps) {\n // The flattened variants\n const variants = useMemo(\n () => flattenConnection(product.variants ?? {}),\n [product.variants]\n );\n\n if (!isProductVariantArray(variants)) {\n throw new Error(\n `<ProductProvider/> requires 'product.variants.nodes' or 'product.variants.edges'`\n );\n }\n\n // All the options available for a product, based on all the variants\n const options = useMemo(() => getOptions(variants), [variants]);\n\n /**\n * Track the selectedVariant within the provider.\n */\n const [selectedVariant, setSelectedVariant] = useState<\n | PartialDeep<ProductVariantType, {recurseIntoArrays: true}>\n | undefined\n | null\n >(() => getVariantBasedOnIdProp(explicitVariantId, variants));\n\n /**\n * Track the selectedOptions within the provider. If a `initialVariantId`\n * is passed, use that to select initial options.\n */\n const [selectedOptions, setSelectedOptions] = useState<SelectedOptions>(() =>\n getSelectedOptions(selectedVariant)\n );\n\n /**\n * When the initialVariantId changes, we need to make sure we\n * update the selected variant and selected options. If not,\n * then the selected variant and options will reference incorrect\n * values.\n */\n useEffect(() => {\n const newSelectedVariant = getVariantBasedOnIdProp(\n explicitVariantId,\n variants\n );\n setSelectedVariant(newSelectedVariant);\n setSelectedOptions(getSelectedOptions(newSelectedVariant));\n }, [explicitVariantId, variants]);\n\n /**\n * Allow the developer to select an option.\n */\n const setSelectedOption = useCallback(\n (name: string, value: string) => {\n setSelectedOptions((selectedOptions) => {\n const opts = {...selectedOptions, [name]: value};\n setSelectedVariant(getSelectedVariant(variants, opts));\n return opts;\n });\n },\n [setSelectedOptions, variants]\n );\n\n const isOptionInStock = useCallback(\n (option: string, value: string) => {\n const proposedVariant = getSelectedVariant(variants, {\n ...selectedOptions,\n ...{[option]: value},\n });\n\n return proposedVariant?.availableForSale ?? true;\n },\n [selectedOptions, variants]\n );\n\n const sellingPlanGroups = useMemo(\n () =>\n flattenConnection(product.sellingPlanGroups ?? {}).map(\n (sellingPlanGroup) => ({\n ...sellingPlanGroup,\n sellingPlans: flattenConnection(sellingPlanGroup?.sellingPlans ?? {}),\n })\n ),\n [product.sellingPlanGroups]\n );\n\n /**\n * Track the selectedSellingPlan within the hook. If `initialSellingPlanId`\n * is passed, use that as an initial value. Look it up from the `selectedVariant`, since\n * that is also a requirement.\n */\n const [selectedSellingPlan, setSelectedSellingPlan] = useState<\n PartialDeep<SellingPlan, {recurseIntoArrays: true}> | undefined\n >(undefined);\n\n const selectedSellingPlanAllocation = useMemo<\n PartialDeep<SellingPlanAllocation, {recurseIntoArrays: true}> | undefined\n >(() => {\n if (!selectedVariant || !selectedSellingPlan) {\n return;\n }\n\n if (\n !selectedVariant.sellingPlanAllocations?.nodes &&\n !selectedVariant.sellingPlanAllocations?.edges\n ) {\n throw new Error(\n `<ProductProvider/>: You must include 'sellingPlanAllocations.nodes' or 'sellingPlanAllocations.edges' in your variants in order to calculate selectedSellingPlanAllocation`\n );\n }\n\n return flattenConnection(selectedVariant.sellingPlanAllocations).find(\n (allocation) => allocation?.sellingPlan?.id === selectedSellingPlan.id\n );\n }, [selectedVariant, selectedSellingPlan]);\n\n const value = useMemo<ProductHookValue>(\n () => ({\n variants,\n variantsConnection: product.variants,\n options,\n selectedVariant,\n setSelectedVariant,\n selectedOptions,\n setSelectedOption,\n setSelectedOptions,\n isOptionInStock,\n selectedSellingPlan,\n setSelectedSellingPlan,\n selectedSellingPlanAllocation,\n sellingPlanGroups,\n sellingPlanGroupsConnection: product.sellingPlanGroups,\n }),\n [\n isOptionInStock,\n options,\n product.sellingPlanGroups,\n product.variants,\n selectedOptions,\n selectedSellingPlan,\n selectedSellingPlanAllocation,\n selectedVariant,\n sellingPlanGroups,\n setSelectedOption,\n variants,\n ]\n );\n\n return (\n <ProductOptionsContext.Provider value={value}>\n {children}\n </ProductOptionsContext.Provider>\n );\n}\n\n/**\n * Provides access to the context value provided by `<ProductProvider />`. Must be a descendent of `<ProductProvider />`.\n */\nexport function useProduct() {\n const context = useContext(ProductOptionsContext);\n\n if (!context) {\n throw new Error(`'useProduct' must be a child of <ProductProvider />`);\n }\n\n return context;\n}\n\nfunction getSelectedVariant(\n variants: PartialDeep<ProductVariantType, {recurseIntoArrays: true}>[],\n choices: SelectedOptions\n): PartialDeep<ProductVariantType, {recurseIntoArrays: true}> | undefined {\n /**\n * Ensure the user has selected all the required options, not just some.\n */\n if (\n !variants.length ||\n variants?.[0]?.selectedOptions?.length !== Object.keys(choices).length\n ) {\n return;\n }\n\n return variants?.find((variant) => {\n return Object.entries(choices).every(([name, value]) => {\n return variant?.selectedOptions?.some(\n (option) => option?.name === name && option?.value === value\n );\n });\n });\n}\n\nfunction getOptions(\n variants: PartialDeep<ProductVariantType, {recurseIntoArrays: true}>[]\n): OptionWithValues[] {\n const map = variants.reduce((memo, variant) => {\n if (!variant.selectedOptions) {\n throw new Error(`'getOptions' requires 'variant.selectedOptions'`);\n }\n variant?.selectedOptions?.forEach((opt) => {\n memo[opt?.name ?? ''] = memo[opt?.name ?? ''] || new Set();\n memo[opt?.name ?? ''].add(opt?.value ?? '');\n });\n\n return memo;\n }, {} as Record<string, Set<string>>);\n\n return Object.keys(map).map((option) => {\n return {\n name: option,\n values: Array.from(map[option]),\n };\n });\n}\n\nfunction getVariantBasedOnIdProp(\n explicitVariantId: InitialVariantId | undefined,\n variants: Array<\n PartialDeep<ProductVariantType, {recurseIntoArrays: true}> | undefined\n >\n) {\n // get the initial variant based on the logic outlined in the comments for 'initialVariantId' above\n // * 1. If `initialVariantId` is provided, then it's used even if it's out of stock.\n if (explicitVariantId) {\n const foundVariant = variants.find(\n (variant) => variant?.id === explicitVariantId\n );\n if (!foundVariant) {\n console.warn(\n `<ProductProvider/> received a 'initialVariantId' prop, but could not actually find a variant with that ID`\n );\n }\n return foundVariant;\n }\n // * 2. If `initialVariantId` is provided but is `null`, then no variant is used.\n if (explicitVariantId === null) {\n return null;\n }\n // * 3. If nothing is passed to `initialVariantId` then the first available / in-stock variant is used.\n // * 4. If nothing is passed to `initialVariantId` and no variants are in stock, then the first variant is used.\n if (explicitVariantId === undefined) {\n return variants.find((variant) => variant?.availableForSale) || variants[0];\n }\n}\n\nfunction getSelectedOptions(\n selectedVariant:\n | PartialDeep<ProductVariantType, {recurseIntoArrays: true}>\n | undefined\n | null\n): SelectedOptions {\n return selectedVariant?.selectedOptions\n ? selectedVariant.selectedOptions.reduce<SelectedOptions>(\n (memo, optionSet) => {\n memo[optionSet?.name ?? ''] = optionSet?.value ?? '';\n return memo;\n },\n {}\n )\n : {};\n}\n\nfunction isProductVariantArray(\n maybeVariantArray:\n | (PartialDeep<ProductVariantType, {recurseIntoArrays: true}> | undefined)[]\n | undefined\n): maybeVariantArray is PartialDeep<\n ProductVariantType,\n {recurseIntoArrays: true}\n>[] {\n if (!maybeVariantArray || !Array.isArray(maybeVariantArray)) {\n return false;\n }\n\n return true;\n}\n\nexport interface OptionWithValues {\n name: SelectedOptionType['name'];\n values: SelectedOptionType['value'][];\n}\n\ntype ProductHookValue = PartialDeep<\n {\n /** An array of the variant `nodes` from the `VariantConnection`. */\n variants: ProductVariantType[];\n variantsConnection?: ProductVariantConnection;\n /** An array of the product's options and values. */\n options: OptionWithValues[];\n /** The selected variant. */\n selectedVariant?: ProductVariantType | null;\n selectedOptions: SelectedOptions;\n /** The selected selling plan. */\n selectedSellingPlan?: SellingPlanType;\n /** The selected selling plan allocation. */\n selectedSellingPlanAllocation?: SellingPlanAllocationType;\n /** The selling plan groups. */\n sellingPlanGroups?: (Omit<SellingPlanGroupType, 'sellingPlans'> & {\n sellingPlans: SellingPlanType[];\n })[];\n sellingPlanGroupsConnection?: SellingPlanGroupConnection;\n },\n {recurseIntoArrays: true}\n> & {\n /** A callback to set the selected variant to the variant passed as an argument. */\n setSelectedVariant: (\n variant: PartialDeep<ProductVariantType, {recurseIntoArrays: true}> | null\n ) => void;\n /** A callback to set the selected option. */\n setSelectedOption: (\n name: SelectedOptionType['name'],\n value: SelectedOptionType['value']\n ) => void;\n /** A callback to set multiple selected options at once. */\n setSelectedOptions: (options: SelectedOptions) => void;\n /** A callback to set the selected selling plan to the one passed as an argument. */\n setSelectedSellingPlan: (\n sellingPlan: PartialDeep<SellingPlanType, {recurseIntoArrays: true}>\n ) => void;\n /** A callback that returns a boolean indicating if the option is in stock. */\n isOptionInStock: (\n name: SelectedOptionType['name'],\n value: SelectedOptionType['value']\n ) => boolean;\n};\n\nexport type SelectedOptions = {\n [key: string]: string;\n};\n"],"names":["ProductOptionsContext","createContext","ProductProvider","children","data","product","initialVariantId","explicitVariantId","variants","useMemo","flattenConnection","isProductVariantArray","Error","options","getOptions","selectedVariant","setSelectedVariant","useState","getVariantBasedOnIdProp","selectedOptions","setSelectedOptions","getSelectedOptions","useEffect","newSelectedVariant","setSelectedOption","useCallback","name","value","opts","getSelectedVariant","isOptionInStock","option","proposedVariant","availableForSale","sellingPlanGroups","map","sellingPlanGroup","sellingPlans","selectedSellingPlan","setSelectedSellingPlan","undefined","selectedSellingPlanAllocation","sellingPlanAllocations","nodes","edges","find","allocation","sellingPlan","id","variantsConnection","sellingPlanGroupsConnection","_jsx","useProduct","context","useContext","choices","length","Object","keys","variant","entries","every","some","reduce","memo","forEach","opt","Set","add","values","Array","from","foundVariant","console","warn","optionSet","maybeVariantArray","isArray"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ProductProvider.cjs","sources":["../../src/ProductProvider.tsx"],"sourcesContent":["import {\n useMemo,\n useState,\n useEffect,\n useCallback,\n createContext,\n useContext,\n} from 'react';\nimport type {\n SelectedOption as SelectedOptionType,\n SellingPlan,\n SellingPlanAllocation,\n Product,\n ProductVariant as ProductVariantType,\n ProductVariantConnection,\n SellingPlan as SellingPlanType,\n SellingPlanAllocation as SellingPlanAllocationType,\n SellingPlanGroup as SellingPlanGroupType,\n SellingPlanGroupConnection,\n} from './storefront-api-types.js';\nimport type {PartialDeep} from 'type-fest';\nimport {flattenConnection} from './flatten-connection.js';\n\nconst ProductOptionsContext = createContext<ProductHookValue | null>(null);\n\ntype InitialVariantId = ProductVariantType['id'] | null;\n\ninterface ProductProviderProps {\n /** A [Product object](https://shopify.dev/api/storefront/reference/products/product). */\n data: PartialDeep<Product, {recurseIntoArrays: true}>;\n /** A `ReactNode` element. */\n children: React.ReactNode;\n /**\n * The initially selected variant.\n * The following logic applies to `initialVariantId`:\n * 1. If `initialVariantId` is provided, then it's used even if it's out of stock.\n * 2. If `initialVariantId` is provided but is `null`, then no variant is used.\n * 3. If nothing is passed to `initialVariantId` then the first available / in-stock variant is used.\n * 4. If nothing is passed to `initialVariantId` and no variants are in stock, then the first variant is used.\n */\n initialVariantId?: InitialVariantId;\n}\n\n/**\n * `<ProductProvider />` is a context provider that enables use of the `useProduct()` hook.\n *\n * It helps manage selected options and variants for a product.\n */\nexport function ProductProvider({\n children,\n data: product,\n initialVariantId: explicitVariantId,\n}: ProductProviderProps) {\n // The flattened variants\n const variants = useMemo(\n () => flattenConnection(product.variants ?? {}),\n [product.variants]\n );\n\n if (!isProductVariantArray(variants)) {\n throw new Error(\n `<ProductProvider/> requires 'product.variants.nodes' or 'product.variants.edges'`\n );\n }\n\n // All the options available for a product, based on all the variants\n const options = useMemo(() => getOptions(variants), [variants]);\n\n /**\n * Track the selectedVariant within the provider.\n */\n const [selectedVariant, setSelectedVariant] = useState<\n | PartialDeep<ProductVariantType, {recurseIntoArrays: true}>\n | undefined\n | null\n >(() => getVariantBasedOnIdProp(explicitVariantId, variants));\n\n /**\n * Track the selectedOptions within the provider. If a `initialVariantId`\n * is passed, use that to select initial options.\n */\n const [selectedOptions, setSelectedOptions] = useState<SelectedOptions>(() =>\n getSelectedOptions(selectedVariant)\n );\n\n /**\n * When the initialVariantId changes, we need to make sure we\n * update the selected variant and selected options. If not,\n * then the selected variant and options will reference incorrect\n * values.\n */\n useEffect(() => {\n const newSelectedVariant = getVariantBasedOnIdProp(\n explicitVariantId,\n variants\n );\n setSelectedVariant(newSelectedVariant);\n setSelectedOptions(getSelectedOptions(newSelectedVariant));\n }, [explicitVariantId, variants]);\n\n /**\n * Allow the developer to select an option.\n */\n const setSelectedOption = useCallback(\n (name: string, value: string) => {\n setSelectedOptions((selectedOptions) => {\n const opts = {...selectedOptions, [name]: value};\n setSelectedVariant(getSelectedVariant(variants, opts));\n return opts;\n });\n },\n [setSelectedOptions, variants]\n );\n\n const isOptionInStock = useCallback(\n (option: string, value: string) => {\n const proposedVariant = getSelectedVariant(variants, {\n ...selectedOptions,\n ...{[option]: value},\n });\n\n return proposedVariant?.availableForSale ?? true;\n },\n [selectedOptions, variants]\n );\n\n const sellingPlanGroups = useMemo(\n () =>\n flattenConnection(product.sellingPlanGroups ?? {}).map(\n (sellingPlanGroup) => ({\n ...sellingPlanGroup,\n sellingPlans: flattenConnection(sellingPlanGroup?.sellingPlans ?? {}),\n })\n ),\n [product.sellingPlanGroups]\n );\n\n /**\n * Track the selectedSellingPlan within the hook. If `initialSellingPlanId`\n * is passed, use that as an initial value. Look it up from the `selectedVariant`, since\n * that is also a requirement.\n */\n const [selectedSellingPlan, setSelectedSellingPlan] = useState<\n PartialDeep<SellingPlan, {recurseIntoArrays: true}> | undefined\n >(undefined);\n\n const selectedSellingPlanAllocation = useMemo<\n PartialDeep<SellingPlanAllocation, {recurseIntoArrays: true}> | undefined\n >(() => {\n if (!selectedVariant || !selectedSellingPlan) {\n return;\n }\n\n if (\n !selectedVariant.sellingPlanAllocations?.nodes &&\n !selectedVariant.sellingPlanAllocations?.edges\n ) {\n throw new Error(\n `<ProductProvider/>: You must include 'sellingPlanAllocations.nodes' or 'sellingPlanAllocations.edges' in your variants in order to calculate selectedSellingPlanAllocation`\n );\n }\n\n return flattenConnection(selectedVariant.sellingPlanAllocations).find(\n (allocation) => allocation?.sellingPlan?.id === selectedSellingPlan.id\n );\n }, [selectedVariant, selectedSellingPlan]);\n\n const value = useMemo<ProductHookValue>(\n () => ({\n variants,\n variantsConnection: product.variants,\n options,\n selectedVariant,\n setSelectedVariant,\n selectedOptions,\n setSelectedOption,\n setSelectedOptions,\n isOptionInStock,\n selectedSellingPlan,\n setSelectedSellingPlan,\n selectedSellingPlanAllocation,\n sellingPlanGroups,\n sellingPlanGroupsConnection: product.sellingPlanGroups,\n }),\n [\n isOptionInStock,\n options,\n product.sellingPlanGroups,\n product.variants,\n selectedOptions,\n selectedSellingPlan,\n selectedSellingPlanAllocation,\n selectedVariant,\n sellingPlanGroups,\n setSelectedOption,\n variants,\n ]\n );\n\n return (\n <ProductOptionsContext.Provider value={value}>\n {children}\n </ProductOptionsContext.Provider>\n );\n}\n\n/**\n * Provides access to the context value provided by `<ProductProvider />`. Must be a descendent of `<ProductProvider />`.\n */\nexport function useProduct() {\n const context = useContext(ProductOptionsContext);\n\n if (!context) {\n throw new Error(`'useProduct' must be a child of <ProductProvider />`);\n }\n\n return context;\n}\n\nfunction getSelectedVariant(\n variants: PartialDeep<ProductVariantType, {recurseIntoArrays: true}>[],\n choices: SelectedOptions\n): PartialDeep<ProductVariantType, {recurseIntoArrays: true}> | undefined {\n /**\n * Ensure the user has selected all the required options, not just some.\n */\n if (\n !variants.length ||\n variants?.[0]?.selectedOptions?.length !== Object.keys(choices).length\n ) {\n return;\n }\n\n return variants?.find((variant) => {\n return Object.entries(choices).every(([name, value]) => {\n return variant?.selectedOptions?.some(\n (option) => option?.name === name && option?.value === value\n );\n });\n });\n}\n\nfunction getOptions(\n variants: PartialDeep<ProductVariantType, {recurseIntoArrays: true}>[]\n): OptionWithValues[] {\n const map = variants.reduce((memo, variant) => {\n if (!variant.selectedOptions) {\n throw new Error(`'getOptions' requires 'variant.selectedOptions'`);\n }\n variant?.selectedOptions?.forEach((opt) => {\n memo[opt?.name ?? ''] = memo[opt?.name ?? ''] || new Set();\n memo[opt?.name ?? ''].add(opt?.value ?? '');\n });\n\n return memo;\n }, {} as Record<string, Set<string>>);\n\n return Object.keys(map).map((option) => {\n return {\n name: option,\n values: Array.from(map[option]),\n };\n });\n}\n\nfunction getVariantBasedOnIdProp(\n explicitVariantId: InitialVariantId | undefined,\n variants: Array<\n PartialDeep<ProductVariantType, {recurseIntoArrays: true}> | undefined\n >\n) {\n // get the initial variant based on the logic outlined in the comments for 'initialVariantId' above\n // * 1. If `initialVariantId` is provided, then it's used even if it's out of stock.\n if (explicitVariantId) {\n const foundVariant = variants.find(\n (variant) => variant?.id === explicitVariantId\n );\n if (!foundVariant) {\n console.warn(\n `<ProductProvider/> received a 'initialVariantId' prop, but could not actually find a variant with that ID`\n );\n }\n return foundVariant;\n }\n // * 2. If `initialVariantId` is provided but is `null`, then no variant is used.\n if (explicitVariantId === null) {\n return null;\n }\n // * 3. If nothing is passed to `initialVariantId` then the first available / in-stock variant is used.\n // * 4. If nothing is passed to `initialVariantId` and no variants are in stock, then the first variant is used.\n if (explicitVariantId === undefined) {\n return variants.find((variant) => variant?.availableForSale) || variants[0];\n }\n}\n\nfunction getSelectedOptions(\n selectedVariant:\n | PartialDeep<ProductVariantType, {recurseIntoArrays: true}>\n | undefined\n | null\n): SelectedOptions {\n return selectedVariant?.selectedOptions\n ? selectedVariant.selectedOptions.reduce<SelectedOptions>(\n (memo, optionSet) => {\n memo[optionSet?.name ?? ''] = optionSet?.value ?? '';\n return memo;\n },\n {}\n )\n : {};\n}\n\nfunction isProductVariantArray(\n maybeVariantArray:\n | (PartialDeep<ProductVariantType, {recurseIntoArrays: true}> | undefined)[]\n | undefined\n): maybeVariantArray is PartialDeep<\n ProductVariantType,\n {recurseIntoArrays: true}\n>[] {\n if (!maybeVariantArray || !Array.isArray(maybeVariantArray)) {\n return false;\n }\n\n return true;\n}\n\nexport interface OptionWithValues {\n name: SelectedOptionType['name'];\n values: SelectedOptionType['value'][];\n}\n\ntype ProductHookValue = PartialDeep<\n {\n /** An array of the variant `nodes` from the `VariantConnection`. */\n variants: ProductVariantType[];\n variantsConnection?: ProductVariantConnection;\n /** An array of the product's options and values. */\n options: OptionWithValues[];\n /** The selected variant. */\n selectedVariant?: ProductVariantType | null;\n selectedOptions: SelectedOptions;\n /** The selected selling plan. */\n selectedSellingPlan?: SellingPlanType;\n /** The selected selling plan allocation. */\n selectedSellingPlanAllocation?: SellingPlanAllocationType;\n /** The selling plan groups. */\n sellingPlanGroups?: (Omit<SellingPlanGroupType, 'sellingPlans'> & {\n sellingPlans: SellingPlanType[];\n })[];\n sellingPlanGroupsConnection?: SellingPlanGroupConnection;\n },\n {recurseIntoArrays: true}\n> & {\n /** A callback to set the selected variant to the variant passed as an argument. */\n setSelectedVariant: (\n variant: PartialDeep<ProductVariantType, {recurseIntoArrays: true}> | null\n ) => void;\n /** A callback to set the selected option. */\n setSelectedOption: (\n name: SelectedOptionType['name'],\n value: SelectedOptionType['value']\n ) => void;\n /** A callback to set multiple selected options at once. */\n setSelectedOptions: (options: SelectedOptions) => void;\n /** A callback to set the selected selling plan to the one passed as an argument. */\n setSelectedSellingPlan: (\n sellingPlan: PartialDeep<SellingPlanType, {recurseIntoArrays: true}>\n ) => void;\n /** A callback that returns a boolean indicating if the option is in stock. */\n isOptionInStock: (\n name: SelectedOptionType['name'],\n value: SelectedOptionType['value']\n ) => boolean;\n};\n\nexport type SelectedOptions = {\n [key: string]: string;\n};\n"],"names":["ProductOptionsContext","createContext","ProductProvider","children","data","product","initialVariantId","explicitVariantId","variants","useMemo","flattenConnection","isProductVariantArray","Error","options","getOptions","selectedVariant","setSelectedVariant","useState","getVariantBasedOnIdProp","selectedOptions","setSelectedOptions","getSelectedOptions","useEffect","newSelectedVariant","setSelectedOption","useCallback","name","value","opts","getSelectedVariant","isOptionInStock","option","proposedVariant","availableForSale","sellingPlanGroups","map","sellingPlanGroup","sellingPlans","selectedSellingPlan","setSelectedSellingPlan","undefined","selectedSellingPlanAllocation","sellingPlanAllocations","nodes","edges","find","allocation","sellingPlan","id","variantsConnection","sellingPlanGroupsConnection","_jsx","useProduct","context","useContext","choices","length","Object","keys","variant","entries","every","some","reduce","memo","forEach","opt","Set","add","values","Array","from","foundVariant","console","warn","optionSet","maybeVariantArray","isArray"],"mappings":"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"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { createContext, useMemo, useState, useEffect, useCallback, useContext } from "react";
|
|
2
|
+
import { flattenConnection } from "./flatten-connection.js";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
const ProductOptionsContext = createContext(null);
|
|
5
|
+
function ProductProvider({
|
|
6
|
+
children,
|
|
7
|
+
data: product,
|
|
8
|
+
initialVariantId: explicitVariantId
|
|
9
|
+
}) {
|
|
10
|
+
const variants = useMemo(() => {
|
|
11
|
+
var _a;
|
|
12
|
+
return flattenConnection((_a = product.variants) != null ? _a : {});
|
|
13
|
+
}, [product.variants]);
|
|
14
|
+
if (!isProductVariantArray(variants)) {
|
|
15
|
+
throw new Error(`<ProductProvider/> requires 'product.variants.nodes' or 'product.variants.edges'`);
|
|
16
|
+
}
|
|
17
|
+
const options = useMemo(() => getOptions(variants), [variants]);
|
|
18
|
+
const [selectedVariant, setSelectedVariant] = useState(() => getVariantBasedOnIdProp(explicitVariantId, variants));
|
|
19
|
+
const [selectedOptions, setSelectedOptions] = useState(() => getSelectedOptions(selectedVariant));
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
const newSelectedVariant = getVariantBasedOnIdProp(explicitVariantId, variants);
|
|
22
|
+
setSelectedVariant(newSelectedVariant);
|
|
23
|
+
setSelectedOptions(getSelectedOptions(newSelectedVariant));
|
|
24
|
+
}, [explicitVariantId, variants]);
|
|
25
|
+
const setSelectedOption = useCallback((name, value2) => {
|
|
26
|
+
setSelectedOptions((selectedOptions2) => {
|
|
27
|
+
const opts = {
|
|
28
|
+
...selectedOptions2,
|
|
29
|
+
[name]: value2
|
|
30
|
+
};
|
|
31
|
+
setSelectedVariant(getSelectedVariant(variants, opts));
|
|
32
|
+
return opts;
|
|
33
|
+
});
|
|
34
|
+
}, [setSelectedOptions, variants]);
|
|
35
|
+
const isOptionInStock = useCallback((option, value2) => {
|
|
36
|
+
var _a;
|
|
37
|
+
const proposedVariant = getSelectedVariant(variants, {
|
|
38
|
+
...selectedOptions,
|
|
39
|
+
...{
|
|
40
|
+
[option]: value2
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
return (_a = proposedVariant == null ? void 0 : proposedVariant.availableForSale) != null ? _a : true;
|
|
44
|
+
}, [selectedOptions, variants]);
|
|
45
|
+
const sellingPlanGroups = useMemo(() => {
|
|
46
|
+
var _a;
|
|
47
|
+
return flattenConnection((_a = product.sellingPlanGroups) != null ? _a : {}).map((sellingPlanGroup) => {
|
|
48
|
+
var _a2;
|
|
49
|
+
return {
|
|
50
|
+
...sellingPlanGroup,
|
|
51
|
+
sellingPlans: flattenConnection((_a2 = sellingPlanGroup == null ? void 0 : sellingPlanGroup.sellingPlans) != null ? _a2 : {})
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
}, [product.sellingPlanGroups]);
|
|
55
|
+
const [selectedSellingPlan, setSelectedSellingPlan] = useState(void 0);
|
|
56
|
+
const selectedSellingPlanAllocation = useMemo(() => {
|
|
57
|
+
var _a, _b;
|
|
58
|
+
if (!selectedVariant || !selectedSellingPlan) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (!((_a = selectedVariant.sellingPlanAllocations) == null ? void 0 : _a.nodes) && !((_b = selectedVariant.sellingPlanAllocations) == null ? void 0 : _b.edges)) {
|
|
62
|
+
throw new Error(`<ProductProvider/>: You must include 'sellingPlanAllocations.nodes' or 'sellingPlanAllocations.edges' in your variants in order to calculate selectedSellingPlanAllocation`);
|
|
63
|
+
}
|
|
64
|
+
return flattenConnection(selectedVariant.sellingPlanAllocations).find((allocation) => {
|
|
65
|
+
var _a2;
|
|
66
|
+
return ((_a2 = allocation == null ? void 0 : allocation.sellingPlan) == null ? void 0 : _a2.id) === selectedSellingPlan.id;
|
|
67
|
+
});
|
|
68
|
+
}, [selectedVariant, selectedSellingPlan]);
|
|
69
|
+
const value = useMemo(() => ({
|
|
70
|
+
variants,
|
|
71
|
+
variantsConnection: product.variants,
|
|
72
|
+
options,
|
|
73
|
+
selectedVariant,
|
|
74
|
+
setSelectedVariant,
|
|
75
|
+
selectedOptions,
|
|
76
|
+
setSelectedOption,
|
|
77
|
+
setSelectedOptions,
|
|
78
|
+
isOptionInStock,
|
|
79
|
+
selectedSellingPlan,
|
|
80
|
+
setSelectedSellingPlan,
|
|
81
|
+
selectedSellingPlanAllocation,
|
|
82
|
+
sellingPlanGroups,
|
|
83
|
+
sellingPlanGroupsConnection: product.sellingPlanGroups
|
|
84
|
+
}), [isOptionInStock, options, product.sellingPlanGroups, product.variants, selectedOptions, selectedSellingPlan, selectedSellingPlanAllocation, selectedVariant, sellingPlanGroups, setSelectedOption, variants]);
|
|
85
|
+
return /* @__PURE__ */ jsx(ProductOptionsContext.Provider, {
|
|
86
|
+
value,
|
|
87
|
+
children
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
function useProduct() {
|
|
91
|
+
const context = useContext(ProductOptionsContext);
|
|
92
|
+
if (!context) {
|
|
93
|
+
throw new Error(`'useProduct' must be a child of <ProductProvider />`);
|
|
94
|
+
}
|
|
95
|
+
return context;
|
|
96
|
+
}
|
|
97
|
+
function getSelectedVariant(variants, choices) {
|
|
98
|
+
var _a, _b;
|
|
99
|
+
if (!variants.length || ((_b = (_a = variants == null ? void 0 : variants[0]) == null ? void 0 : _a.selectedOptions) == null ? void 0 : _b.length) !== Object.keys(choices).length) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
return variants == null ? void 0 : variants.find((variant) => {
|
|
103
|
+
return Object.entries(choices).every(([name, value]) => {
|
|
104
|
+
var _a2;
|
|
105
|
+
return (_a2 = variant == null ? void 0 : variant.selectedOptions) == null ? void 0 : _a2.some((option) => (option == null ? void 0 : option.name) === name && (option == null ? void 0 : option.value) === value);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
function getOptions(variants) {
|
|
110
|
+
const map = variants.reduce((memo, variant) => {
|
|
111
|
+
var _a;
|
|
112
|
+
if (!variant.selectedOptions) {
|
|
113
|
+
throw new Error(`'getOptions' requires 'variant.selectedOptions'`);
|
|
114
|
+
}
|
|
115
|
+
(_a = variant == null ? void 0 : variant.selectedOptions) == null ? void 0 : _a.forEach((opt) => {
|
|
116
|
+
var _a2, _b, _c, _d;
|
|
117
|
+
memo[(_a2 = opt == null ? void 0 : opt.name) != null ? _a2 : ""] = memo[(_b = opt == null ? void 0 : opt.name) != null ? _b : ""] || /* @__PURE__ */ new Set();
|
|
118
|
+
memo[(_c = opt == null ? void 0 : opt.name) != null ? _c : ""].add((_d = opt == null ? void 0 : opt.value) != null ? _d : "");
|
|
119
|
+
});
|
|
120
|
+
return memo;
|
|
121
|
+
}, {});
|
|
122
|
+
return Object.keys(map).map((option) => {
|
|
123
|
+
return {
|
|
124
|
+
name: option,
|
|
125
|
+
values: Array.from(map[option])
|
|
126
|
+
};
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
function getVariantBasedOnIdProp(explicitVariantId, variants) {
|
|
130
|
+
if (explicitVariantId) {
|
|
131
|
+
const foundVariant = variants.find((variant) => (variant == null ? void 0 : variant.id) === explicitVariantId);
|
|
132
|
+
if (!foundVariant) {
|
|
133
|
+
console.warn(`<ProductProvider/> received a 'initialVariantId' prop, but could not actually find a variant with that ID`);
|
|
134
|
+
}
|
|
135
|
+
return foundVariant;
|
|
136
|
+
}
|
|
137
|
+
if (explicitVariantId === null) {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
if (explicitVariantId === void 0) {
|
|
141
|
+
return variants.find((variant) => variant == null ? void 0 : variant.availableForSale) || variants[0];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function getSelectedOptions(selectedVariant) {
|
|
145
|
+
return (selectedVariant == null ? void 0 : selectedVariant.selectedOptions) ? selectedVariant.selectedOptions.reduce((memo, optionSet) => {
|
|
146
|
+
var _a, _b;
|
|
147
|
+
memo[(_a = optionSet == null ? void 0 : optionSet.name) != null ? _a : ""] = (_b = optionSet == null ? void 0 : optionSet.value) != null ? _b : "";
|
|
148
|
+
return memo;
|
|
149
|
+
}, {}) : {};
|
|
150
|
+
}
|
|
151
|
+
function isProductVariantArray(maybeVariantArray) {
|
|
152
|
+
if (!maybeVariantArray || !Array.isArray(maybeVariantArray)) {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
export {
|
|
158
|
+
ProductProvider,
|
|
159
|
+
useProduct
|
|
160
|
+
};
|
|
161
|
+
//# sourceMappingURL=ProductProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductProvider.js","sources":["../../src/ProductProvider.tsx"],"sourcesContent":["import {\n useMemo,\n useState,\n useEffect,\n useCallback,\n createContext,\n useContext,\n} from 'react';\nimport type {\n SelectedOption as SelectedOptionType,\n SellingPlan,\n SellingPlanAllocation,\n Product,\n ProductVariant as ProductVariantType,\n ProductVariantConnection,\n SellingPlan as SellingPlanType,\n SellingPlanAllocation as SellingPlanAllocationType,\n SellingPlanGroup as SellingPlanGroupType,\n SellingPlanGroupConnection,\n} from './storefront-api-types.js';\nimport type {PartialDeep} from 'type-fest';\nimport {flattenConnection} from './flatten-connection.js';\n\nconst ProductOptionsContext = createContext<ProductHookValue | null>(null);\n\ntype InitialVariantId = ProductVariantType['id'] | null;\n\ninterface ProductProviderProps {\n /** A [Product object](https://shopify.dev/api/storefront/reference/products/product). */\n data: PartialDeep<Product, {recurseIntoArrays: true}>;\n /** A `ReactNode` element. */\n children: React.ReactNode;\n /**\n * The initially selected variant.\n * The following logic applies to `initialVariantId`:\n * 1. If `initialVariantId` is provided, then it's used even if it's out of stock.\n * 2. If `initialVariantId` is provided but is `null`, then no variant is used.\n * 3. If nothing is passed to `initialVariantId` then the first available / in-stock variant is used.\n * 4. If nothing is passed to `initialVariantId` and no variants are in stock, then the first variant is used.\n */\n initialVariantId?: InitialVariantId;\n}\n\n/**\n * `<ProductProvider />` is a context provider that enables use of the `useProduct()` hook.\n *\n * It helps manage selected options and variants for a product.\n */\nexport function ProductProvider({\n children,\n data: product,\n initialVariantId: explicitVariantId,\n}: ProductProviderProps) {\n // The flattened variants\n const variants = useMemo(\n () => flattenConnection(product.variants ?? {}),\n [product.variants]\n );\n\n if (!isProductVariantArray(variants)) {\n throw new Error(\n `<ProductProvider/> requires 'product.variants.nodes' or 'product.variants.edges'`\n );\n }\n\n // All the options available for a product, based on all the variants\n const options = useMemo(() => getOptions(variants), [variants]);\n\n /**\n * Track the selectedVariant within the provider.\n */\n const [selectedVariant, setSelectedVariant] = useState<\n | PartialDeep<ProductVariantType, {recurseIntoArrays: true}>\n | undefined\n | null\n >(() => getVariantBasedOnIdProp(explicitVariantId, variants));\n\n /**\n * Track the selectedOptions within the provider. If a `initialVariantId`\n * is passed, use that to select initial options.\n */\n const [selectedOptions, setSelectedOptions] = useState<SelectedOptions>(() =>\n getSelectedOptions(selectedVariant)\n );\n\n /**\n * When the initialVariantId changes, we need to make sure we\n * update the selected variant and selected options. If not,\n * then the selected variant and options will reference incorrect\n * values.\n */\n useEffect(() => {\n const newSelectedVariant = getVariantBasedOnIdProp(\n explicitVariantId,\n variants\n );\n setSelectedVariant(newSelectedVariant);\n setSelectedOptions(getSelectedOptions(newSelectedVariant));\n }, [explicitVariantId, variants]);\n\n /**\n * Allow the developer to select an option.\n */\n const setSelectedOption = useCallback(\n (name: string, value: string) => {\n setSelectedOptions((selectedOptions) => {\n const opts = {...selectedOptions, [name]: value};\n setSelectedVariant(getSelectedVariant(variants, opts));\n return opts;\n });\n },\n [setSelectedOptions, variants]\n );\n\n const isOptionInStock = useCallback(\n (option: string, value: string) => {\n const proposedVariant = getSelectedVariant(variants, {\n ...selectedOptions,\n ...{[option]: value},\n });\n\n return proposedVariant?.availableForSale ?? true;\n },\n [selectedOptions, variants]\n );\n\n const sellingPlanGroups = useMemo(\n () =>\n flattenConnection(product.sellingPlanGroups ?? {}).map(\n (sellingPlanGroup) => ({\n ...sellingPlanGroup,\n sellingPlans: flattenConnection(sellingPlanGroup?.sellingPlans ?? {}),\n })\n ),\n [product.sellingPlanGroups]\n );\n\n /**\n * Track the selectedSellingPlan within the hook. If `initialSellingPlanId`\n * is passed, use that as an initial value. Look it up from the `selectedVariant`, since\n * that is also a requirement.\n */\n const [selectedSellingPlan, setSelectedSellingPlan] = useState<\n PartialDeep<SellingPlan, {recurseIntoArrays: true}> | undefined\n >(undefined);\n\n const selectedSellingPlanAllocation = useMemo<\n PartialDeep<SellingPlanAllocation, {recurseIntoArrays: true}> | undefined\n >(() => {\n if (!selectedVariant || !selectedSellingPlan) {\n return;\n }\n\n if (\n !selectedVariant.sellingPlanAllocations?.nodes &&\n !selectedVariant.sellingPlanAllocations?.edges\n ) {\n throw new Error(\n `<ProductProvider/>: You must include 'sellingPlanAllocations.nodes' or 'sellingPlanAllocations.edges' in your variants in order to calculate selectedSellingPlanAllocation`\n );\n }\n\n return flattenConnection(selectedVariant.sellingPlanAllocations).find(\n (allocation) => allocation?.sellingPlan?.id === selectedSellingPlan.id\n );\n }, [selectedVariant, selectedSellingPlan]);\n\n const value = useMemo<ProductHookValue>(\n () => ({\n variants,\n variantsConnection: product.variants,\n options,\n selectedVariant,\n setSelectedVariant,\n selectedOptions,\n setSelectedOption,\n setSelectedOptions,\n isOptionInStock,\n selectedSellingPlan,\n setSelectedSellingPlan,\n selectedSellingPlanAllocation,\n sellingPlanGroups,\n sellingPlanGroupsConnection: product.sellingPlanGroups,\n }),\n [\n isOptionInStock,\n options,\n product.sellingPlanGroups,\n product.variants,\n selectedOptions,\n selectedSellingPlan,\n selectedSellingPlanAllocation,\n selectedVariant,\n sellingPlanGroups,\n setSelectedOption,\n variants,\n ]\n );\n\n return (\n <ProductOptionsContext.Provider value={value}>\n {children}\n </ProductOptionsContext.Provider>\n );\n}\n\n/**\n * Provides access to the context value provided by `<ProductProvider />`. Must be a descendent of `<ProductProvider />`.\n */\nexport function useProduct() {\n const context = useContext(ProductOptionsContext);\n\n if (!context) {\n throw new Error(`'useProduct' must be a child of <ProductProvider />`);\n }\n\n return context;\n}\n\nfunction getSelectedVariant(\n variants: PartialDeep<ProductVariantType, {recurseIntoArrays: true}>[],\n choices: SelectedOptions\n): PartialDeep<ProductVariantType, {recurseIntoArrays: true}> | undefined {\n /**\n * Ensure the user has selected all the required options, not just some.\n */\n if (\n !variants.length ||\n variants?.[0]?.selectedOptions?.length !== Object.keys(choices).length\n ) {\n return;\n }\n\n return variants?.find((variant) => {\n return Object.entries(choices).every(([name, value]) => {\n return variant?.selectedOptions?.some(\n (option) => option?.name === name && option?.value === value\n );\n });\n });\n}\n\nfunction getOptions(\n variants: PartialDeep<ProductVariantType, {recurseIntoArrays: true}>[]\n): OptionWithValues[] {\n const map = variants.reduce((memo, variant) => {\n if (!variant.selectedOptions) {\n throw new Error(`'getOptions' requires 'variant.selectedOptions'`);\n }\n variant?.selectedOptions?.forEach((opt) => {\n memo[opt?.name ?? ''] = memo[opt?.name ?? ''] || new Set();\n memo[opt?.name ?? ''].add(opt?.value ?? '');\n });\n\n return memo;\n }, {} as Record<string, Set<string>>);\n\n return Object.keys(map).map((option) => {\n return {\n name: option,\n values: Array.from(map[option]),\n };\n });\n}\n\nfunction getVariantBasedOnIdProp(\n explicitVariantId: InitialVariantId | undefined,\n variants: Array<\n PartialDeep<ProductVariantType, {recurseIntoArrays: true}> | undefined\n >\n) {\n // get the initial variant based on the logic outlined in the comments for 'initialVariantId' above\n // * 1. If `initialVariantId` is provided, then it's used even if it's out of stock.\n if (explicitVariantId) {\n const foundVariant = variants.find(\n (variant) => variant?.id === explicitVariantId\n );\n if (!foundVariant) {\n console.warn(\n `<ProductProvider/> received a 'initialVariantId' prop, but could not actually find a variant with that ID`\n );\n }\n return foundVariant;\n }\n // * 2. If `initialVariantId` is provided but is `null`, then no variant is used.\n if (explicitVariantId === null) {\n return null;\n }\n // * 3. If nothing is passed to `initialVariantId` then the first available / in-stock variant is used.\n // * 4. If nothing is passed to `initialVariantId` and no variants are in stock, then the first variant is used.\n if (explicitVariantId === undefined) {\n return variants.find((variant) => variant?.availableForSale) || variants[0];\n }\n}\n\nfunction getSelectedOptions(\n selectedVariant:\n | PartialDeep<ProductVariantType, {recurseIntoArrays: true}>\n | undefined\n | null\n): SelectedOptions {\n return selectedVariant?.selectedOptions\n ? selectedVariant.selectedOptions.reduce<SelectedOptions>(\n (memo, optionSet) => {\n memo[optionSet?.name ?? ''] = optionSet?.value ?? '';\n return memo;\n },\n {}\n )\n : {};\n}\n\nfunction isProductVariantArray(\n maybeVariantArray:\n | (PartialDeep<ProductVariantType, {recurseIntoArrays: true}> | undefined)[]\n | undefined\n): maybeVariantArray is PartialDeep<\n ProductVariantType,\n {recurseIntoArrays: true}\n>[] {\n if (!maybeVariantArray || !Array.isArray(maybeVariantArray)) {\n return false;\n }\n\n return true;\n}\n\nexport interface OptionWithValues {\n name: SelectedOptionType['name'];\n values: SelectedOptionType['value'][];\n}\n\ntype ProductHookValue = PartialDeep<\n {\n /** An array of the variant `nodes` from the `VariantConnection`. */\n variants: ProductVariantType[];\n variantsConnection?: ProductVariantConnection;\n /** An array of the product's options and values. */\n options: OptionWithValues[];\n /** The selected variant. */\n selectedVariant?: ProductVariantType | null;\n selectedOptions: SelectedOptions;\n /** The selected selling plan. */\n selectedSellingPlan?: SellingPlanType;\n /** The selected selling plan allocation. */\n selectedSellingPlanAllocation?: SellingPlanAllocationType;\n /** The selling plan groups. */\n sellingPlanGroups?: (Omit<SellingPlanGroupType, 'sellingPlans'> & {\n sellingPlans: SellingPlanType[];\n })[];\n sellingPlanGroupsConnection?: SellingPlanGroupConnection;\n },\n {recurseIntoArrays: true}\n> & {\n /** A callback to set the selected variant to the variant passed as an argument. */\n setSelectedVariant: (\n variant: PartialDeep<ProductVariantType, {recurseIntoArrays: true}> | null\n ) => void;\n /** A callback to set the selected option. */\n setSelectedOption: (\n name: SelectedOptionType['name'],\n value: SelectedOptionType['value']\n ) => void;\n /** A callback to set multiple selected options at once. */\n setSelectedOptions: (options: SelectedOptions) => void;\n /** A callback to set the selected selling plan to the one passed as an argument. */\n setSelectedSellingPlan: (\n sellingPlan: PartialDeep<SellingPlanType, {recurseIntoArrays: true}>\n ) => void;\n /** A callback that returns a boolean indicating if the option is in stock. */\n isOptionInStock: (\n name: SelectedOptionType['name'],\n value: SelectedOptionType['value']\n ) => boolean;\n};\n\nexport type SelectedOptions = {\n [key: string]: string;\n};\n"],"names":["ProductOptionsContext","createContext","ProductProvider","children","data","product","initialVariantId","explicitVariantId","variants","useMemo","flattenConnection","isProductVariantArray","Error","options","getOptions","selectedVariant","setSelectedVariant","useState","getVariantBasedOnIdProp","selectedOptions","setSelectedOptions","getSelectedOptions","useEffect","newSelectedVariant","setSelectedOption","useCallback","name","value","opts","getSelectedVariant","isOptionInStock","option","proposedVariant","availableForSale","sellingPlanGroups","map","sellingPlanGroup","sellingPlans","selectedSellingPlan","setSelectedSellingPlan","undefined","selectedSellingPlanAllocation","sellingPlanAllocations","nodes","edges","find","allocation","sellingPlan","id","variantsConnection","sellingPlanGroupsConnection","_jsx","useProduct","context","useContext","choices","length","Object","keys","variant","entries","every","some","reduce","memo","forEach","opt","Set","add","values","Array","from","foundVariant","console","warn","optionSet","maybeVariantArray","isArray"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
-
const ShopifyProvider = require("./ShopifyProvider.
|
|
4
|
-
const loadScript = require("./load-script.
|
|
3
|
+
const ShopifyProvider = require("./ShopifyProvider.cjs");
|
|
4
|
+
const loadScript = require("./load-script.cjs");
|
|
5
5
|
const jsxRuntime = require("react/jsx-runtime");
|
|
6
6
|
const SHOPJS_URL = "https://cdn.shopify.com/shopifycloud/shop-js/v1.0/client.js";
|
|
7
7
|
function ShopPayButton({
|
|
@@ -61,4 +61,4 @@ exports.DoublePropsErrorMessage = DoublePropsErrorMessage;
|
|
|
61
61
|
exports.MissingPropsErrorMessage = MissingPropsErrorMessage;
|
|
62
62
|
exports.ShopPayButton = ShopPayButton;
|
|
63
63
|
exports.getIdFromGid = getIdFromGid;
|
|
64
|
-
//# sourceMappingURL=ShopPayButton.
|
|
64
|
+
//# sourceMappingURL=ShopPayButton.cjs.map
|